From 2ba78f98daad62a7c77fa03bacb56914211b7ee9 Mon Sep 17 00:00:00 2001 From: Xiao Gui <xgui3783@gmail.com> Date: Wed, 15 Feb 2023 11:54:34 +0100 Subject: [PATCH] WIP new API --- .github/workflows/docker_img.yml | 2 +- package.json | 6 +- spec/util.ts | 14025 ---------------- src/api/service.ts | 41 +- src/atlasComponents/sapi/core/base.ts | 34 + .../sapi/core/sapiParcellation.ts | 81 +- src/atlasComponents/sapi/core/sapiRegion.ts | 178 +- src/atlasComponents/sapi/core/sapiSpace.ts | 78 +- .../sapi/features/sapiFeature.ts | 7 +- src/atlasComponents/sapi/index.ts | 17 - src/atlasComponents/sapi/sapi.service.ts | 383 +- src/atlasComponents/sapi/schema.ts | 4062 ++--- src/atlasComponents/sapi/schema_v3.ts | 1803 ++ src/atlasComponents/sapi/translate_v3.ts | 338 + src/atlasComponents/sapi/type.ts | 242 +- src/atlasComponents/sapi/type_sxplr.ts | 104 + src/atlasComponents/sapi/type_v3.ts | 47 + .../splashScreen/splashScreen.component.ts | 4 +- .../datasets/dataset/dataset.component.ts | 8 +- .../datasets/dataset/dataset.template.html | 8 +- .../filterGroupedParcellations.pipe.ts | 6 +- .../filterUnsupportedParc.pipe.ts | 12 +- .../core/parcellation/groupedParcellation.ts | 6 +- .../core/parcellation/parcellationDoi.pipe.ts | 6 +- .../parcellationGroupSelected.pipe.ts | 7 +- .../sapiViews/core/region/module.ts | 4 +- .../region/region/region.base.directive.ts | 38 +- .../region/region.features.directive.ts | 42 +- .../region/rich/region.rich.component.ts | 6 +- .../region/rich/region.rich.template.html | 20 +- .../pureDumb/pureATPSelector.components.ts | 20 +- .../pureDumb/pureATPSelector.template.html | 6 +- .../ATPSelector/wrapper/wrapper.component.ts | 43 +- .../regionsHierarchy.component.ts | 27 +- .../regionsHierarchy.template.html | 2 +- .../regionListSearch.component.ts | 21 +- .../regionListSearchTmpl.directive.ts | 4 +- .../core/space/boundingBox.directive.ts | 36 +- src/atlasComponents/sapiViews/module.ts | 5 +- src/atlasComponents/sapiViews/util/module.ts | 3 - .../util/parcellationSupportedInSpace.pipe.ts | 48 - .../annotationMode.component.ts | 9 +- .../filterAnnotationBySpace.pipe.ts | 7 +- .../singleAnnotationUnit.template.html | 2 +- .../userAnnotations/tools/line.ts | 7 +- .../tools/line/line.template.html | 2 +- .../userAnnotations/tools/point.ts | 3 +- .../tools/point/point.template.html | 2 +- .../userAnnotations/tools/poly.ts | 7 +- .../tools/poly/poly.template.html | 2 +- .../userAnnotations/tools/service.ts | 6 +- .../userAnnotations/tools/type.ts | 8 +- src/atlasViewer/atlasViewer.component.ts | 4 +- src/atlasViewer/atlasViewer.template.html | 2 +- .../dynamicMaterialBtn.component.ts | 4 +- src/environments/environment.common.ts | 2 +- .../fileInputModal.component.ts | 2 +- src/messagingGlue.ts | 4 +- src/mouseoverModule/util.ts | 4 +- src/plugin/generateTypes.js | 5 + .../routeStateTransform.service.spec.ts | 12 +- .../routeStateTransform.service.ts | 13 +- src/routerModule/router.service.ts | 39 +- src/state/annotations/store.ts | 2 +- src/state/atlasAppearance/const.ts | 4 +- src/state/atlasSelection/actions.ts | 22 +- src/state/atlasSelection/const.ts | 12 +- src/state/atlasSelection/effects.ts | 112 +- src/state/atlasSelection/store.ts | 20 +- src/state/atlasSelection/util.ts | 46 +- src/state/index.ts | 1 - src/state/userInteraction/actions.ts | 8 +- src/state/userInteraction/store.ts | 8 +- src/strictLocal/strictLocal.directive.ts | 6 +- src/ui/dialogInfo/dialog.directive.ts | 8 +- src/ui/quickTour/constrants.ts | 10 +- src/ui/quickTour/quickTour.service.ts | 11 +- src/ui/quickTour/quickTourThis.directive.ts | 5 +- .../topMenu/topMenuCmp/topMenu.components.ts | 9 +- src/util/priority.ts | 5 +- .../nehuba/base.service/base.service.ts | 99 + .../nehuba/config.service/index.ts | 5 +- .../nehuba/config.service/type.ts | 13 + .../nehuba/config.service/util.ts | 122 +- .../layerCtrl.service/layerCtrl.effects.ts | 248 +- .../layerCtrl.service/layerCtrl.service.ts | 82 +- .../nehuba/mesh.service/mesh.service.ts | 61 +- .../nehubaViewer/nehubaViewer.component.ts | 1 - .../nehubaViewerGlue.component.ts | 4 +- .../nehubaViewerContainer.component.ts | 39 +- .../nehubaViewerInterface.directive.ts | 6 +- .../nehuba/statusCard/statusCard.component.ts | 4 +- src/viewerModule/nehuba/types.ts | 4 +- .../perspectiveViewSlider.component.ts | 27 +- src/viewerModule/threeSurfer/store/actions.ts | 6 +- src/viewerModule/threeSurfer/store/effects.ts | 65 +- .../threeSurfer/store/selectors.ts | 4 +- src/viewerModule/threeSurfer/store/store.ts | 10 +- .../threeSurferGlue/threeSurfer.component.ts | 66 +- .../threeSurferGlue/threeSurfer.template.html | 6 +- src/viewerModule/threeSurfer/types.ts | 18 +- .../viewerCmp/viewerCmp.component.ts | 82 +- .../viewerCmp/viewerCmp.template.html | 30 +- .../connectivityBrowser.component.spec.ts | 0 .../connectivityBrowser.component.ts | 0 .../connectivityBrowser.stories.ts | 0 .../connectivityBrowser.style.scss | 0 .../connectivityBrowser.template.html | 0 .../connectivity/connectivityDoi.pipe.ts | 0 .../connectivity/hasConnectivity.directive.ts | 1 - .../connectivity/index.ts | 0 .../connectivity/module.ts | 0 .../entry/entry.component.ts | 0 .../entry/entry.style.css | 0 .../entry/entry.template.html | 0 .../entryListItem/entryListItem.component.ts | 0 .../entryListItem/entryListItem.style.css | 0 .../entryListItem/entryListItem.template.html | 0 .../entryListItem/entryListitem.stories.ts | 0 .../featureBadgeColor.pipe.ts | 0 .../featureBadgeFlag.pipe.ts | 0 .../featureBadgeName.pipe.ts | 0 .../ieeg/ieegDataset/ieegDataset.component.ts | 0 .../ieeg/ieegDataset/ieegDataset.stories.ts | 0 .../ieeg/ieegDataset/ieegDataset.style.css | 0 .../ieegDataset/ieegDataset.template.html | 0 .../ieeg/inRoi.pipe.ts | 0 .../features => tmpFeatures}/ieeg/index.ts | 0 .../features => tmpFeatures}/ieeg/module.ts | 0 .../features => tmpFeatures}/index.ts | 0 .../features => tmpFeatures}/module.ts | 0 .../orderFilterFeatureList.pipe.ts | 0 .../autoradiography/autoradiograph.stories.ts | 0 .../autoradiography.component.ts | 0 .../autoradiography/autoradiography.style.css | 0 .../autoradiography.template.html | 0 .../receptors/base.ts | 4 +- .../receptors/entry/entry.component.ts | 0 .../receptors/entry/entry.stories.ts | 0 .../receptors/entry/entry.style.css | 0 .../receptors/entry/entry.template.html | 0 .../fingerprint/fingerprint.component.ts | 25 +- .../fingerprint/fingerprint.stories.ts | 0 .../fingerprint/fingerprint.style.css | 0 .../fingerprint/fingerprint.template.html | 0 .../receptors/index.ts | 0 .../receptors/module.ts | 0 .../receptors/profile/profile.component.ts | 0 .../receptors/profile/profile.stories.ts | 0 .../receptors/profile/profile.style.css | 0 .../receptors/profile/profile.template.html | 0 .../features => tmpFeatures}/voi/index.ts | 0 .../features => tmpFeatures}/voi/module.ts | 0 .../voi/voiQuery.directive.ts | 53 +- tsconfig.json | 3 +- 155 files changed, 5866 insertions(+), 17487 deletions(-) create mode 100644 src/atlasComponents/sapi/core/base.ts create mode 100644 src/atlasComponents/sapi/schema_v3.ts create mode 100644 src/atlasComponents/sapi/translate_v3.ts create mode 100644 src/atlasComponents/sapi/type_sxplr.ts create mode 100644 src/atlasComponents/sapi/type_v3.ts delete mode 100644 src/atlasComponents/sapiViews/util/parcellationSupportedInSpace.pipe.ts create mode 100644 src/viewerModule/nehuba/base.service/base.service.ts rename {src/atlasComponents/sapiViews/features => tmpFeatures}/connectivity/connectivityBrowser/connectivityBrowser.component.spec.ts (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/connectivity/connectivityBrowser/connectivityBrowser.component.ts (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/connectivity/connectivityBrowser/connectivityBrowser.stories.ts (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/connectivity/connectivityBrowser/connectivityBrowser.style.scss (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/connectivity/connectivityBrowser/connectivityBrowser.template.html (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/connectivity/connectivityDoi.pipe.ts (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/connectivity/hasConnectivity.directive.ts (99%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/connectivity/index.ts (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/connectivity/module.ts (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/entry/entry.component.ts (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/entry/entry.style.css (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/entry/entry.template.html (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/entryListItem/entryListItem.component.ts (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/entryListItem/entryListItem.style.css (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/entryListItem/entryListItem.template.html (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/entryListItem/entryListitem.stories.ts (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/featureBadgeColor.pipe.ts (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/featureBadgeFlag.pipe.ts (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/featureBadgeName.pipe.ts (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/ieeg/ieegDataset/ieegDataset.component.ts (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/ieeg/ieegDataset/ieegDataset.stories.ts (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/ieeg/ieegDataset/ieegDataset.style.css (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/ieeg/ieegDataset/ieegDataset.template.html (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/ieeg/inRoi.pipe.ts (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/ieeg/index.ts (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/ieeg/module.ts (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/index.ts (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/module.ts (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/orderFilterFeatureList.pipe.ts (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/receptors/autoradiography/autoradiograph.stories.ts (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/receptors/autoradiography/autoradiography.component.ts (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/receptors/autoradiography/autoradiography.style.css (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/receptors/autoradiography/autoradiography.template.html (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/receptors/base.ts (95%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/receptors/entry/entry.component.ts (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/receptors/entry/entry.stories.ts (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/receptors/entry/entry.style.css (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/receptors/entry/entry.template.html (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/receptors/fingerprint/fingerprint.component.ts (82%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/receptors/fingerprint/fingerprint.stories.ts (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/receptors/fingerprint/fingerprint.style.css (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/receptors/fingerprint/fingerprint.template.html (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/receptors/index.ts (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/receptors/module.ts (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/receptors/profile/profile.component.ts (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/receptors/profile/profile.stories.ts (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/receptors/profile/profile.style.css (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/receptors/profile/profile.template.html (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/voi/index.ts (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/voi/module.ts (100%) rename {src/atlasComponents/sapiViews/features => tmpFeatures}/voi/voiQuery.directive.ts (75%) diff --git a/.github/workflows/docker_img.yml b/.github/workflows/docker_img.yml index 057a93d78..cebe9aa4d 100644 --- a/.github/workflows/docker_img.yml +++ b/.github/workflows/docker_img.yml @@ -20,7 +20,7 @@ jobs: SIIBRA_API_STABLE: 'https://siibra-api-stable.apps.hbp.eu/v2_0,https://siibra-api-stable-ns.apps.hbp.eu/v2_0,https://siibra-api-stable.apps.jsc.hbp.eu/v2_0' SIIBRA_API_RC: 'https://siibra-api-rc.apps.hbp.eu/v2_0' - SIIBRA_API_LATEST: 'https://siibra-api-latest.apps-dev.hbp.eu/v2_0' + SIIBRA_API_LATEST: 'https://siibra-api-latest.apps-dev.hbp.eu/v3_0' steps: diff --git a/package.json b/package.json index a38aed3a2..2475726f3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "interactive-viewer", - "version": "2.9.0", + "name": "siibra-explorer", + "version": "2.10.0", "description": "siibra-explorer - explore brain atlases. Based on humanbrainproject/nehuba & google/neuroglancer. Built with angular", "scripts": { "lint": "eslint src --ext .ts", @@ -11,7 +11,7 @@ "watch": "ng build --watch --configuration development", "test": "ng test", "test-ci": "ng test --progress false --watch false --browsers=ChromeHeadless", - "sapi-schema": "npx openapi-typescript@5.1.1 https://siibra-api-stable.apps.hbp.eu/v2_0/openapi.json --output ./src/atlasComponents/sapi/schema.ts && eslint ./src/atlasComponents/sapi/schema.ts --no-ignore --fix", + "sapi-schema": "npx openapi-typescript@6.1.0 https://siibra-api-latest.apps-dev.hbp.eu/v3_0/openapi.json --output ./src/atlasComponents/sapi/schema_v3.ts && eslint ./src/atlasComponents/sapi/schema_v3.ts --no-ignore --fix", "api-schema": "node src/plugin/generateTypes.js", "docs:json": "compodoc -p ./tsconfig.json -e json -d .", "storybook": "npm run docs:json && start-storybook -p 6006", diff --git a/spec/util.ts b/spec/util.ts index 9925589fe..4b7affa86 100644 --- a/spec/util.ts +++ b/spec/util.ts @@ -57,14028 +57,3 @@ export const JUBRAIN_COLIN_CH123_RIGHT = { -8347692 ] } - -export const COLIN = { - "name": "MNI Colin 27", - "fullId": "minds/core/referencespace/v1.0.0/7f39f7be-445b-47c0-9791-e971c0b6d992", - "type": "template", - "species": "Human", - "useTheme": "dark", - "ngId": "colin", - "nehubaConfigURL": "nehubaConfig/colinNehubaConfig", - "parcellations": [ - { - "name": "JuBrain Cytoarchitectonic Atlas", - "ngId": "jubrain colin v18 left", - "auxillaryMeshIndices": [ - 65535 - ], - "hasAdditionalViewMode": [ - "connectivity" - ], - "originDatasets": [ - { - "kgSchema": "minds/core/dataset/v1.0.0", - "kgId": "4ac9f0bc-560d-47e0-8916-7b24da9bb0ce" - } - ], - "properties": { - "version": "1.0", - "description": "This dataset contains the whole-brain parcellation of the JuBrain Cytoarchitectonic Atlas (Amunts and Zilles, 2015) in the MNI Colin 27 as well as the MNI ICBM 152 2009c nonlinear asymmetric reference space. The parcellation is derived from the individual probability maps (PMs) of the cytoarchitectonic regions released in the JuBrain Atlas, that are further combined into a Maximum Probability Map (MPM). The MPM is calculated by considering for each voxel the probability of all cytoarchitectonic areas released in the atlas, and determining the most probable assignment (Eickhoff 2005). Note that methodological improvements and integration of new brain structures may lead to small deviations in earlier released datasets.", - "publications": [ - { - "doi": "https://doi.org/10.1038/nrn2776", - "citation": "Zilles K, Amunts K (2010) Centenary of Brodmann’s map – conception and fate. Nature Reviews Neuroscience 11(2): 139-145 " - }, - { - "doi": "https://doi.org/10.1016/j.neuroimage.2007.02.037", - "citation": "Amunts K, Schleicher A, Zilles K (2007) Cytoarchitecture of the cerebral cortex – more than localization. Neuroimage 37: 1061-1065" - }, - { - "doi": "http://dx.doi.org/10.1016/B978-012693019-1/50023-X", - "citation": "Zilles K, Schleicher A, Palomero-Gallagher N, Amunts K (2002) Quantitative analysis of cyto- and receptor architecture of the human brain. In: /Brain Mapping: The Methods/, J. C. Mazziotta and A. Toga (eds.), USA: Elsevier, 2002, p. 573-602." - } - ] - }, - "regions": [ - { - "name": "telencephalon", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "cerebral nuclei", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "basal forebrain", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "magnocellular group within septum", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Ch 123 (Basal Forebrain)", - "arealabel": "Ch-123", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/7SEP-P2V", - "synonyms": [], - "rgb": [ - 124, - 233, - 167 - ], - "children": [ - { - "name": "Ch 123 (Basal Forebrain) - left hemisphere", - "rgb": [ - 124, - 233, - 167 - ], - "labelIndex": 286, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -2339339, - 4405405, - -8804805 - ] - }, - { - "name": "Ch 123 (Basal Forebrain) - right hemisphere", - "rgb": [ - 124, - 233, - 167 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 286, - "children": [], - "status": "publicP", - "position": [ - 3240000, - 5153846, - -8347692 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "bb111a95-e04c-4987-8254-4af4ed8b0022" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "sublenticular part of basal forebrain", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Ch 4 (Basal Forebrain)", - "arealabel": "Ch-4", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/VZJ5-8WJ", - "synonyms": [], - "rgb": [ - 116, - 243, - 12 - ], - "children": [ - { - "name": "Ch 4 (Basal Forebrain) - left hemisphere", - "rgb": [ - 116, - 243, - 12 - ], - "labelIndex": 264, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -16053628, - -454259, - -12470032 - ] - }, - { - "name": "Ch 4 (Basal Forebrain) - right hemisphere", - "rgb": [ - 116, - 243, - 12 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 264, - "children": [], - "status": "publicP", - "position": [ - 17655072, - 263768, - -11539130 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "a5c9d95f-8e7c-4454-91b6-a790387370fc" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "magnocellular group within horizontal limb of diagnoal band", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Ch 123 (Basal Forebrain)", - "arealabel": "Ch-123", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/7SEP-P2V", - "synonyms": [], - "rgb": [ - 124, - 233, - 167 - ], - "children": [ - { - "name": "Ch 123 (Basal Forebrain) - left hemisphere", - "rgb": [ - 124, - 233, - 167 - ], - "labelIndex": 286, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -2339339, - 4405405, - -8804805 - ] - }, - { - "name": "Ch 123 (Basal Forebrain) - right hemisphere", - "rgb": [ - 124, - 233, - 167 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 286, - "children": [], - "status": "publicP", - "position": [ - 3240000, - 5153846, - -8347692 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "bb111a95-e04c-4987-8254-4af4ed8b0022" - } - }, - "relatedAreas": [] - } - ] - } - ] - }, - { - "name": "amygdala", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "laterobasal group", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "LB (Amygdala)", - "arealabel": "LB", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/C3X0-NV3", - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "LB (Amygdala) - left hemisphere", - "rgb": null, - "labelIndex": 15, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP" - }, - { - "name": "LB (Amygdala) - right hemisphere", - "rgb": null, - "ngId": "jubrain colin v18 right", - "labelIndex": 15, - "children": [], - "status": "publicP" - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "708df0fa-e9a4-4c23-bd85-8957f6d30faf" - } - }, - "relatedAreas": [] - }, - { - "name": "LB (Amygdala)", - "arealabel": "LB", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/C3X0-NV3", - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "LB (Amygdala) - left hemisphere", - "rgb": null, - "labelIndex": 11, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP" - }, - { - "name": "LB (Amygdala) - right hemisphere", - "rgb": null, - "ngId": "jubrain colin v18 right", - "labelIndex": 11, - "children": [], - "status": "publicP" - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "708df0fa-e9a4-4c23-bd85-8957f6d30faf" - } - }, - "relatedAreas": [] - }, - { - "name": "LB (Amygdala)", - "arealabel": "LB", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/C3X0-NV3", - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "LB (Amygdala) - left hemisphere", - "rgb": null, - "labelIndex": 19, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP" - }, - { - "name": "LB (Amygdala) - right hemisphere", - "rgb": null, - "ngId": "jubrain colin v18 right", - "labelIndex": 19, - "children": [], - "status": "publicP" - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "708df0fa-e9a4-4c23-bd85-8957f6d30faf" - } - }, - "relatedAreas": [] - }, - { - "name": "LB (Amygdala)", - "arealabel": "LB", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/C3X0-NV3", - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "LB (Amygdala) - left hemisphere", - "rgb": null, - "labelIndex": 13, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -25304803, - -1696429, - -23766626 - ] - }, - { - "name": "LB (Amygdala) - right hemisphere", - "rgb": null, - "ngId": "jubrain colin v18 right", - "labelIndex": 13, - "children": [], - "status": "publicP", - "position": [ - 28015494, - -81343, - -24045836 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "708df0fa-e9a4-4c23-bd85-8957f6d30faf" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "superficial group", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "SF (Amygdala)", - "arealabel": "SF", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/WD31-SEA", - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "SF (Amygdala) - left hemisphere", - "rgb": null, - "labelIndex": 236, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -16044471, - 530048, - -20831731 - ] - }, - { - "name": "SF (Amygdala) - right hemisphere", - "rgb": null, - "ngId": "jubrain colin v18 right", - "labelIndex": 236, - "children": [], - "status": "publicP", - "position": [ - 19382770, - 1539804, - -19413304 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "48929163-bf7b-4471-9f14-991c5225eced" - } - }, - "relatedAreas": [] - }, - { - "name": "SF (Amygdala)", - "arealabel": "SF", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/WD31-SEA", - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "SF (Amygdala) - left hemisphere", - "rgb": null, - "labelIndex": 17, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP" - }, - { - "name": "SF (Amygdala) - right hemisphere", - "rgb": null, - "ngId": "jubrain colin v18 right", - "labelIndex": 17, - "children": [], - "status": "publicP" - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "48929163-bf7b-4471-9f14-991c5225eced" - } - }, - "relatedAreas": [] - }, - { - "name": "SF (Amygdala)", - "arealabel": "SF", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/WD31-SEA", - "synonyms": [], - "rgb": [ - 18, - 168, - 22 - ], - "children": [ - { - "name": "SF (Amygdala) - left hemisphere", - "rgb": [ - 18, - 168, - 22 - ], - "labelIndex": 186, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP" - }, - { - "name": "SF (Amygdala) - right hemisphere", - "rgb": [ - 18, - 168, - 22 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 186, - "children": [], - "status": "publicP" - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "48929163-bf7b-4471-9f14-991c5225eced" - } - }, - "relatedAreas": [] - }, - { - "name": "CM (Amygdala)", - "arealabel": "CM", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/36FR-C95", - "synonyms": [], - "rgb": [ - 102, - 180, - 202 - ], - "children": [ - { - "name": "CM (Amygdala) - left hemisphere", - "rgb": [ - 102, - 180, - 202 - ], - "labelIndex": 22, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP" - }, - { - "name": "CM (Amygdala) - right hemisphere", - "rgb": [ - 102, - 180, - 202 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 22, - "children": [], - "status": "publicP" - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "7aba8aef-6430-4fa7-ab54-8ecac558faed" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "fiber masses", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "VTM (Amygdala)", - "arealabel": "VTM", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/99HN-XRE", - "synonyms": [], - "rgb": [ - 89, - 178, - 185 - ], - "children": [ - { - "name": "VTM (Amygdala) - left hemisphere", - "rgb": [ - 89, - 178, - 185 - ], - "labelIndex": 228, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -23377907, - -9837209, - -14848837 - ] - }, - { - "name": "VTM (Amygdala) - right hemisphere", - "rgb": [ - 89, - 178, - 185 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 228, - "children": [], - "status": "publicP", - "position": [ - 25513514, - -8881081, - -15551351 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "a964e6e6-8014-41a2-b975-754d75cbb6f2" - } - }, - "relatedAreas": [] - }, - { - "name": "IF (Amygdala)", - "arealabel": "IF", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/GWPR-G6K", - "synonyms": [], - "rgb": [ - 120, - 190, - 129 - ], - "children": [ - { - "name": "IF (Amygdala) - left hemisphere", - "rgb": [ - 120, - 190, - 129 - ], - "labelIndex": 237, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -27588235, - -1431373, - -17460784 - ] - }, - { - "name": "IF (Amygdala) - right hemisphere", - "rgb": [ - 120, - 190, - 129 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 237, - "children": [], - "status": "publicP", - "position": [ - 29372549, - -813725, - -16578431 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "5a1391c8-6056-40e4-a19b-3774df42bd07" - } - }, - "relatedAreas": [] - }, - { - "name": "MF (Amygdala)", - "arealabel": "MF", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/9375-55V", - "synonyms": [], - "rgb": [ - 190, - 200, - 9 - ], - "children": [ - { - "name": "MF (Amygdala) - left hemisphere", - "rgb": [ - 190, - 200, - 9 - ], - "labelIndex": 235, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -18714286, - -6523810, - -15428571 - ] - }, - { - "name": "MF (Amygdala) - right hemisphere", - "rgb": [ - 190, - 200, - 9 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 235, - "children": [], - "status": "publicP", - "position": [ - 20976744, - -4930233, - -14441860 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "3741c788-9412-4b8e-9ab4-9ca2d3a715ca" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "centromedial group", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "CM (Amygdala)", - "arealabel": "CM", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/36FR-C95", - "synonyms": [], - "rgb": [ - 89, - 4, - 190 - ], - "children": [ - { - "name": "CM (Amygdala) - left hemisphere", - "rgb": [ - 89, - 4, - 190 - ], - "labelIndex": 16, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP" - }, - { - "name": "CM (Amygdala) - right hemisphere", - "rgb": [ - 89, - 4, - 190 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 16, - "children": [], - "status": "publicP" - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "7aba8aef-6430-4fa7-ab54-8ecac558faed" - } - }, - "relatedAreas": [] - }, - { - "name": "CM (Amygdala)", - "arealabel": "CM", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/36FR-C95", - "synonyms": [], - "rgb": [ - 9, - 120, - 220 - ], - "children": [ - { - "name": "CM (Amygdala) - left hemisphere", - "rgb": [ - 9, - 120, - 220 - ], - "labelIndex": 21, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -21108108, - -3376448, - -13214286 - ] - }, - { - "name": "CM (Amygdala) - right hemisphere", - "rgb": [ - 9, - 120, - 220 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 21, - "children": [], - "status": "publicP", - "position": [ - 23157767, - -2679612, - -12555825 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "7aba8aef-6430-4fa7-ab54-8ecac558faed" - } - }, - "relatedAreas": [] - } - ] - } - ] - } - ] - }, - { - "name": "cerebral cortex", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "parietal lobe", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "superior parietal lobule", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area 5L (SPL)", - "arealabel": "Area-5L", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/C1FQ-2F", - "synonyms": [], - "rgb": [ - 184, - 185, - 58 - ], - "children": [ - { - "name": "Area 5L (SPL) - left hemisphere", - "rgb": [ - 184, - 185, - 58 - ], - "labelIndex": 130, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -18807832, - -47524930, - 66950353 - ] - }, - { - "name": "Area 5L (SPL) - right hemisphere", - "rgb": [ - 184, - 185, - 58 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 130, - "children": [], - "status": "publicP", - "position": [ - 12970516, - -51174624, - 70371695 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "64555f7f-1b33-4ffe-9853-be41e7a21096" - } - }, - "relatedAreas": [] - }, - { - "name": "Area 7M (SPL)", - "arealabel": "Area-7M", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/F25F-EKW", - "synonyms": [], - "rgb": [ - 205, - 61, - 236 - ], - "children": [ - { - "name": "Area 7M (SPL) - left hemisphere", - "rgb": [ - 205, - 61, - 236 - ], - "labelIndex": 135, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -777896, - -78103082, - 35256111 - ] - }, - { - "name": "Area 7M (SPL) - right hemisphere", - "rgb": [ - 205, - 61, - 236 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 135, - "children": [], - "status": "publicP", - "position": [ - 4281250, - -75882812, - 38312500 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "0aacea5c-bc9e-483f-8376-25f176ada158" - } - }, - "relatedAreas": [] - }, - { - "name": "Area 7PC (SPL)", - "arealabel": "Area-7PC", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/Z45N-1T", - "synonyms": [], - "rgb": [ - 252, - 89, - 28 - ], - "children": [ - { - "name": "Area 7PC (SPL) - left hemisphere", - "rgb": [ - 252, - 89, - 28 - ], - "labelIndex": 132, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -32056266, - -48916454, - 60868713 - ] - }, - { - "name": "Area 7PC (SPL) - right hemisphere", - "rgb": [ - 252, - 89, - 28 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 132, - "children": [], - "status": "publicP", - "position": [ - 30055171, - -49079568, - 61493485 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "763140d3-7ba0-4f28-b0ac-c6cbda2d14e1" - } - }, - "relatedAreas": [] - }, - { - "name": "Area 5M (SPL)", - "arealabel": "Area-5M", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/Y12F-YMU", - "synonyms": [], - "rgb": [ - 225, - 245, - 76 - ], - "children": [ - { - "name": "Area 5M (SPL) - left hemisphere", - "rgb": [ - 225, - 245, - 76 - ], - "labelIndex": 131, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -7527881, - -41962560, - 59221721 - ] - }, - { - "name": "Area 5M (SPL) - right hemisphere", - "rgb": [ - 225, - 245, - 76 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 131, - "children": [], - "status": "publicP", - "position": [ - 4642562, - -44304959, - 60273140 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "abe105cf-2c29-46af-af75-6b46fdb75137" - } - }, - "relatedAreas": [] - }, - { - "name": "Area 7P (SPL)", - "arealabel": "Area-7P", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/C3HS-8R7", - "synonyms": [], - "rgb": [ - 52, - 20, - 106 - ], - "children": [ - { - "name": "Area 7P (SPL) - left hemisphere", - "rgb": [ - 52, - 20, - 106 - ], - "labelIndex": 208, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -7679310, - -76043295, - 52631801 - ] - }, - { - "name": "Area 7P (SPL) - right hemisphere", - "rgb": [ - 52, - 20, - 106 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 208, - "children": [], - "status": "publicP", - "position": [ - 14232037, - -74892094, - 56304919 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "af9c4f39-63a4-409f-b306-e5965d639f37" - } - }, - "relatedAreas": [] - }, - { - "name": "Area 5Ci (SPL)", - "arealabel": "Area-5Ci", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/SQVP-GK1", - "synonyms": [], - "rgb": [ - 79, - 242, - 146 - ], - "children": [ - { - "name": "Area 5Ci (SPL) - left hemisphere", - "rgb": [ - 79, - 242, - 146 - ], - "labelIndex": 136, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -14033790, - -35828311, - 43857534 - ] - }, - { - "name": "Area 5Ci (SPL) - right hemisphere", - "rgb": [ - 79, - 242, - 146 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 136, - "children": [], - "status": "publicP", - "position": [ - 10563961, - -36194957, - 46892989 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "07d08f74-af3d-4cbe-bc3c-f32b7f5c989f" - } - }, - "relatedAreas": [] - }, - { - "name": "Area 7A (SPL)", - "arealabel": "Area-7A", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/7HX2-AJH", - "synonyms": [], - "rgb": [ - 38, - 204, - 19 - ], - "children": [ - { - "name": "Area 7A (SPL) - left hemisphere", - "rgb": [ - 38, - 204, - 19 - ], - "labelIndex": 134, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -20856230, - -62269710, - 61643512 - ] - }, - { - "name": "Area 7A (SPL) - right hemisphere", - "rgb": [ - 38, - 204, - 19 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 134, - "children": [], - "status": "publicP", - "position": [ - 20910951, - -62880523, - 62944473 - ] - } - ], - "relatedAreas": [ - { - "name": "Area 7A", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "811f4adb-4a7c-45c1-8034-4afa9edf586a" - } - } - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "e26e999f-77ad-4934-9569-8290ed05ebda" - } - } - } - ] - }, - { - "name": "parietal operculum", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area OP3 (POperc)", - "arealabel": "Area-OP3", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/1Z8F-PX4", - "synonyms": [], - "rgb": [ - 58, - 122, - 80 - ], - "children": [ - { - "name": "Area OP3 (POperc) - left hemisphere", - "rgb": [ - 58, - 122, - 80 - ], - "labelIndex": 75, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -40814044, - -13737321, - 17669701 - ] - }, - { - "name": "Area OP3 (POperc) - right hemisphere", - "rgb": [ - 58, - 122, - 80 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 75, - "children": [], - "status": "publicP", - "position": [ - 41195980, - -11633166, - 18002513 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "f6f10b01-6c10-42cf-8129-f5aaf307a36b" - } - }, - "relatedAreas": [] - }, - { - "name": "Area OP4 (POperc)", - "arealabel": "Area-OP4", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/BVT0-H3U", - "synonyms": [], - "rgb": [ - 89, - 80, - 132 - ], - "children": [ - { - "name": "Area OP4 (POperc) - left hemisphere", - "rgb": [ - 89, - 80, - 132 - ], - "labelIndex": 72, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -60514139, - -10849614, - 15368038 - ] - }, - { - "name": "Area OP4 (POperc) - right hemisphere", - "rgb": [ - 89, - 80, - 132 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 72, - "children": [], - "status": "publicP", - "position": [ - 63398148, - -9211111, - 12780864 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "b1e7f0d2-6d37-4047-9c2e-a08c3f1e2a16" - } - }, - "relatedAreas": [] - }, - { - "name": "Area OP2 (POperc)", - "arealabel": "Area-OP2", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/5KBV-36J", - "synonyms": [], - "rgb": [ - 36, - 47, - 221 - ], - "children": [ - { - "name": "Area OP2 (POperc) - left hemisphere", - "rgb": [ - 36, - 47, - 221 - ], - "labelIndex": 74, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -36355372, - -23452479, - 18938017 - ] - }, - { - "name": "Area OP2 (POperc) - right hemisphere", - "rgb": [ - 36, - 47, - 221 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 74, - "children": [], - "status": "publicP", - "position": [ - 35629457, - -21159690, - 18021705 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "ab26cefd-f7d6-4442-8020-a6e418e673ff" - } - }, - "relatedAreas": [] - }, - { - "name": "Area OP1 (POperc)", - "arealabel": "Area-OP1", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/SH37-979", - "synonyms": [], - "rgb": [ - 250, - 182, - 34 - ], - "children": [ - { - "name": "Area OP1 (POperc) - left hemisphere", - "rgb": [ - 250, - 182, - 34 - ], - "labelIndex": 73, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -51566527, - -22523828, - 17190240 - ] - }, - { - "name": "Area OP1 (POperc) - right hemisphere", - "rgb": [ - 250, - 182, - 34 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 73, - "children": [], - "status": "publicP", - "position": [ - 52888430, - -20697107, - 17000826 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "402ec28d-0809-4226-91a4-900d9303291b" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "postcentral gyrus", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area 3b (PostCG)", - "arealabel": "Area-3b", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/2JK3-QXR", - "synonyms": [], - "relatedAreas": [ - { - "name": "Area 3b", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "74304fe9-452e-4ca3-97a3-8cf3459bb1a0" - } - } - } - ], - "rgb": [ - 239, - 246, - 155 - ], - "children": [ - { - "name": "Area 3b (PostCG) - left hemisphere", - "rgb": [ - 239, - 246, - 155 - ], - "labelIndex": 127, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -44439219, - -21735041, - 46012387 - ] - }, - { - "name": "Area 3b (PostCG) - right hemisphere", - "rgb": [ - 239, - 246, - 155 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 127, - "children": [], - "status": "publicP", - "position": [ - 38765839, - -25096118, - 48227174 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "b84f67bb-5d9f-4daf-a8d6-15f63f901bd4" - } - } - }, - { - "name": "Area 1 (PostCG)", - "arealabel": "Area-1", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/THB5-B64", - "synonyms": [], - "rgb": [ - 232, - 185, - 250 - ], - "children": [ - { - "name": "Area 1 (PostCG) - left hemisphere", - "rgb": [ - 232, - 185, - 250 - ], - "labelIndex": 125, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -47104485, - -28297920, - 57798046 - ] - }, - { - "name": "Area 1 (PostCG) - right hemisphere", - "rgb": [ - 232, - 185, - 250 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 125, - "children": [], - "status": "publicP", - "position": [ - 48452543, - -27132790, - 56150187 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "c9753e82-80ca-4074-a704-9dd2c4c0d58b" - } - }, - "relatedAreas": [] - }, - { - "name": "Area 2 (PostCS)", - "arealabel": "Area-2", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/QA8F-DD2", - "synonyms": [], - "rgb": [ - 23, - 13, - 35 - ], - "children": [ - { - "name": "Area 2 (PostCS) - left hemisphere", - "rgb": [ - 23, - 13, - 35 - ], - "labelIndex": 252, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -42268059, - -32424512, - 51210202 - ] - }, - { - "name": "Area 2 (PostCS) - right hemisphere", - "rgb": [ - 23, - 13, - 35 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 252, - "children": [], - "status": "publicP", - "position": [ - 38223619, - -34651627, - 52535010 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "f9147ae9-5cf0-41b2-89a3-e6e6df07bef1" - } - }, - "relatedAreas": [] - }, - { - "name": "Area 3a (PostCG)", - "arealabel": "Area-3a", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/C5QQ-EFB", - "synonyms": [], - "rgb": [ - 187, - 133, - 50 - ], - "children": [ - { - "name": "Area 3a (PostCG) - left hemisphere", - "rgb": [ - 187, - 133, - 50 - ], - "labelIndex": 126, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -31927553, - -25650901, - 44513889 - ] - }, - { - "name": "Area 3a (PostCG) - right hemisphere", - "rgb": [ - 187, - 133, - 50 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 126, - "children": [], - "status": "publicP", - "position": [ - 38813714, - -19184000, - 36284571 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "2657ecc1-da69-4a37-9b37-66ae95f9623c" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "inferior parietal lobule", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area PF (IPL)", - "arealabel": "Area-PF", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/F1TJ-54W", - "synonyms": [], - "relatedAreas": [ - { - "name": "Area PF", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "f4e177a6-1b2c-48d5-a62c-91949ba636e4" - } - } - } - ], - "rgb": [ - 226, - 211, - 61 - ], - "children": [ - { - "name": "Area PF (IPL) - left hemisphere", - "rgb": [ - 226, - 211, - 61 - ], - "labelIndex": 206, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -59814938, - -37432365, - 36569295 - ] - }, - { - "name": "Area PF (IPL) - right hemisphere", - "rgb": [ - 226, - 211, - 61 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 206, - "children": [], - "status": "publicP", - "position": [ - 64016699, - -33052700, - 30153112 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "18e5e1b0-6c25-4f55-a967-0834d2bd3ee4" - } - } - }, - { - "name": "Area PFcm (IPL)", - "arealabel": "Area-PFcm", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/8DP8-8HE", - "synonyms": [], - "relatedAreas": [ - { - "name": "Area PFcm", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "f07d441f-452f-471b-ac7c-0d3c2ae16fb2" - } - } - } - ], - "rgb": [ - 98, - 128, - 120 - ], - "children": [ - { - "name": "Area PFcm (IPL) - left hemisphere", - "rgb": [ - 98, - 128, - 120 - ], - "labelIndex": 113, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -51751410, - -36954069, - 22546334 - ] - }, - { - "name": "Area PFcm (IPL) - right hemisphere", - "rgb": [ - 98, - 128, - 120 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 113, - "children": [], - "status": "publicP", - "position": [ - 53524370, - -31637287, - 23177904 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "10502c3a-f20e-44fa-b985-786d6888d4bb" - } - } - }, - { - "name": "Area PGa (IPL)", - "arealabel": "Area-PGa", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/V5HY-XTS", - "synonyms": [], - "relatedAreas": [ - { - "name": "Area PGa", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "d5b168a3-a92e-4ab3-8b4d-61e58e5b7a1c" - } - } - } - ], - "rgb": [ - 42, - 236, - 131 - ], - "children": [ - { - "name": "Area PGa (IPL) - left hemisphere", - "rgb": [ - 42, - 236, - 131 - ], - "labelIndex": 110, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -48873487, - -60780569, - 37191889 - ] - }, - { - "name": "Area PGa (IPL) - right hemisphere", - "rgb": [ - 42, - 236, - 131 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 110, - "children": [], - "status": "publicP", - "position": [ - 55283797, - -55333653, - 30316395 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "d7f6c5be-93c6-4a16-8939-4420329d4147" - } - } - }, - { - "name": "Area PFt (IPL)", - "arealabel": "Area-PFt", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/JGM9-ZET", - "synonyms": [], - "relatedAreas": [ - { - "name": "Area PFt", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "9ff7fcc4-a88b-4bf8-be07-1386a3760a96" - } - } - } - ], - "rgb": [ - 120, - 135, - 232 - ], - "children": [ - { - "name": "Area PFt (IPL) - left hemisphere", - "rgb": [ - 120, - 135, - 232 - ], - "labelIndex": 109, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -55015237, - -27583919, - 38095874 - ] - }, - { - "name": "Area PFt (IPL) - right hemisphere", - "rgb": [ - 120, - 135, - 232 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 109, - "children": [], - "status": "publicP", - "position": [ - 54808632, - -24626296, - 37973570 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "847cef50-7340-470d-8580-327b4ce9db19" - } - } - }, - { - "name": "Area PFm (IPL)", - "arealabel": "Area-PFm", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/TB94-HRK", - "synonyms": [], - "relatedAreas": [ - { - "name": "Area PFm", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "3455ada4-48c3-4748-ae38-2fe3f376f0fc" - } - } - } - ], - "rgb": [ - 53, - 76, - 145 - ], - "children": [ - { - "name": "Area PFm (IPL) - left hemisphere", - "rgb": [ - 53, - 76, - 145 - ], - "labelIndex": 112, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -54527689, - -52389045, - 38877207 - ] - }, - { - "name": "Area PFm (IPL) - right hemisphere", - "rgb": [ - 53, - 76, - 145 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 112, - "children": [], - "status": "publicP", - "position": [ - 56990022, - -45541717, - 38606571 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "411edde9-685f-464b-970c-a929f9a4067c" - } - } - }, - { - "name": "Area PGp (IPL)", - "arealabel": "Area-PGp", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/FPFJ-ZCD", - "synonyms": [], - "rgb": [ - 92, - 116, - 83 - ], - "children": [ - { - "name": "Area PGp (IPL) - left hemisphere", - "rgb": [ - 92, - 116, - 83 - ], - "labelIndex": 108, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -44673441, - -73269937, - 29840224 - ] - }, - { - "name": "Area PGp (IPL) - right hemisphere", - "rgb": [ - 92, - 116, - 83 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 108, - "children": [], - "status": "publicP", - "position": [ - 47749459, - -70528695, - 30721440 - ] - } - ], - "relatedAreas": [ - { - "name": "Area PGp", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "1b00a0e4-9493-43ff-bfbd-b02119064813" - } - } - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "b3ef6947-76c9-4935-bbc6-8b2329c0967b" - } - } - }, - { - "name": "Area PFop (IPL)", - "arealabel": "Area-PFop", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/M2PM-92Q", - "synonyms": [], - "rgb": [ - 146, - 153, - 177 - ], - "children": [ - { - "name": "Area PFop (IPL) - left hemisphere", - "rgb": [ - 146, - 153, - 177 - ], - "labelIndex": 111, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -60026462, - -24694986, - 24259053 - ] - }, - { - "name": "Area PFop (IPL) - right hemisphere", - "rgb": [ - 146, - 153, - 177 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 111, - "children": [], - "status": "publicP", - "position": [ - 58286575, - -20617534, - 24917260 - ] - } - ], - "relatedAreas": [ - { - "name": "Area PFop", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "b4397c40-82e1-4d62-b97a-44e8d04b428b" - } - } - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "e8262e56-88fe-4006-b078-def4d78416b8" - } - } - } - ] - }, - { - "name": "parieto-occipital sulcus", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area hPO1 (POS)", - "arealabel": "Area-hPO1", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/W50A-FAP", - "synonyms": [], - "rgb": [ - 153, - 232, - 235 - ], - "children": [ - { - "name": "Area hPO1 (POS) - left hemisphere", - "rgb": [ - 153, - 232, - 235 - ], - "labelIndex": 297, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -15069260, - -80661951, - 37074565 - ] - }, - { - "name": "Area hPO1 (POS) - right hemisphere", - "rgb": [ - 153, - 232, - 235 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 297, - "children": [], - "status": "publicP", - "position": [ - 21853147, - -80927739, - 37048660 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "a78998c2-99d4-4738-bbda-82a317f713f1" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "intraparietal sulcus", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area hIP1 (IPS)", - "arealabel": "Area-hIP1", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/92FE-7S6", - "synonyms": [], - "rgb": [ - 66, - 149, - 82 - ], - "children": [ - { - "name": "Area hIP1 (IPS) - left hemisphere", - "rgb": [ - 66, - 149, - 82 - ], - "labelIndex": 128, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -36841999, - -49449871, - 40584028 - ] - }, - { - "name": "Area hIP1 (IPS) - right hemisphere", - "rgb": [ - 66, - 149, - 82 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 128, - "children": [], - "status": "publicP", - "position": [ - 40629988, - -48019372, - 39158853 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "7722c71f-fe84-4deb-8f6b-98e2aecf2e31" - } - }, - "relatedAreas": [] - }, - { - "name": "Area hIP7 (IPS)", - "arealabel": "Area-hIP7", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/WRCY-8Z1", - "synonyms": [], - "rgb": [ - 71, - 196, - 218 - ], - "children": [ - { - "name": "Area hIP7 (IPS) - left hemisphere", - "rgb": [ - 71, - 196, - 218 - ], - "labelIndex": 296, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -22044741, - -79989011, - 29353218 - ] - }, - { - "name": "Area hIP7 (IPS) - right hemisphere", - "rgb": [ - 71, - 196, - 218 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 296, - "children": [], - "status": "publicP", - "position": [ - 29041586, - -79117828, - 27046207 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "9c6c3c96-8129-4e0e-aa22-a0fb435aab45" - } - }, - "relatedAreas": [] - }, - { - "name": "Area hIP3 (IPS)", - "arealabel": "Area-hIP3", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/P8X0-V1G", - "synonyms": [], - "rgb": [ - 113, - 172, - 229 - ], - "children": [ - { - "name": "Area hIP3 (IPS) - left hemisphere", - "rgb": [ - 113, - 172, - 229 - ], - "labelIndex": 133, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -30430769, - -55031164, - 46842209 - ] - }, - { - "name": "Area hIP3 (IPS) - right hemisphere", - "rgb": [ - 113, - 172, - 229 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 133, - "children": [], - "status": "publicP", - "position": [ - 33538679, - -49884591, - 50461950 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "700ac6db-870d-44f1-8786-0c01207f992b" - } - }, - "relatedAreas": [] - }, - { - "name": "Area hIP2 (IPS)", - "arealabel": "Area-hIP2", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/EJTM-NDY", - "synonyms": [], - "rgb": [ - 127, - 245, - 203 - ], - "children": [ - { - "name": "Area hIP2 (IPS) - left hemisphere", - "rgb": [ - 127, - 245, - 203 - ], - "labelIndex": 129, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -46531100, - -41482722, - 43278044 - ] - }, - { - "name": "Area hIP2 (IPS) - right hemisphere", - "rgb": [ - 127, - 245, - 203 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 129, - "children": [], - "status": "publicP", - "position": [ - 44605145, - -39958613, - 45130872 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "4490ef3e-ce60-4453-9e9f-85388d0603cb" - } - }, - "relatedAreas": [] - }, - { - "name": "Area hIP4 (IPS)", - "arealabel": "Area-hIP4", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/TSEN-QSY", - "synonyms": [], - "rgb": [ - 254, - 52, - 184 - ], - "children": [ - { - "name": "Area hIP4 (IPS) - left hemisphere", - "rgb": [ - 254, - 52, - 184 - ], - "labelIndex": 294, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -29349066, - -79948651, - 25849585 - ] - }, - { - "name": "Area hIP4 (IPS) - right hemisphere", - "rgb": [ - 254, - 52, - 184 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 294, - "children": [], - "status": "publicP", - "position": [ - 37324927, - -76495150, - 22338021 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "5875bfe2-99ca-4e50-bce2-61c201c3dd54" - } - }, - "relatedAreas": [] - }, - { - "name": "Area hIP5 (IPS)", - "arealabel": "Area-hIP5", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/RNSM-Y4Y", - "synonyms": [], - "rgb": [ - 217, - 87, - 210 - ], - "children": [ - { - "name": "Area hIP5 (IPS) - left hemisphere", - "rgb": [ - 217, - 87, - 210 - ], - "labelIndex": 295, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -28321120, - -73162807, - 36664362 - ] - }, - { - "name": "Area hIP5 (IPS) - right hemisphere", - "rgb": [ - 217, - 87, - 210 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 295, - "children": [], - "status": "publicP", - "position": [ - 34614713, - -68930590, - 33299252 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "f9717dec-0310-4078-a4ae-294170b4fb37" - } - }, - "relatedAreas": [] - }, - { - "name": "Area hIP6 (IPS)", - "arealabel": "Area-hIP6", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/AFQR-50Q", - "synonyms": [], - "rgb": [ - 237, - 233, - 37 - ], - "children": [ - { - "name": "Area hIP6 (IPS) - left hemisphere", - "rgb": [ - 237, - 233, - 37 - ], - "labelIndex": 292, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -31988131, - -66522626, - 46155045 - ] - }, - { - "name": "Area hIP6 (IPS) - right hemisphere", - "rgb": [ - 237, - 233, - 37 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 292, - "children": [], - "status": "publicP", - "position": [ - 37069307, - -63723479, - 45628006 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "b9975f8e-f484-4e82-883a-5fd765855ae0" - } - }, - "relatedAreas": [] - }, - { - "name": "Area hIP8 (IPS)", - "arealabel": "Area-hIP8", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/YYT8-FT8", - "synonyms": [], - "rgb": [ - 223, - 109, - 3 - ], - "children": [ - { - "name": "Area hIP8 (IPS) - left hemisphere", - "rgb": [ - 223, - 109, - 3 - ], - "labelIndex": 293, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -18133307, - -72231198, - 43245125 - ] - }, - { - "name": "Area hIP8 (IPS) - right hemisphere", - "rgb": [ - 223, - 109, - 3 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 293, - "children": [], - "status": "publicP", - "position": [ - 26220986, - -71480127, - 41680048 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "a2c1acc7-7fdc-4fbd-90ee-729eda7fdff3" - } - }, - "relatedAreas": [] - } - ] - } - ] - }, - { - "name": "occiptal lobe", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "dorsal occipital cortex", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area hOc6 (POS)", - "arealabel": "Area-hOc6", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/4101-1ZG", - "synonyms": [], - "rgb": [ - 239, - 66, - 26 - ], - "children": [ - { - "name": "Area hOc6 (POS) - left hemisphere", - "rgb": [ - 239, - 66, - 26 - ], - "labelIndex": 291, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -15925775, - -70685971, - 16518760 - ] - }, - { - "name": "Area hOc6 (POS) - right hemisphere", - "rgb": [ - 239, - 66, - 26 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 291, - "children": [], - "status": "publicP", - "position": [ - 17750454, - -67625227, - 17755898 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "d72e0210-a910-4b15-bcaf-80c3433cd3e0" - } - }, - "relatedAreas": [] - }, - { - "name": "Area hOc4d (Cuneus)", - "arealabel": "Area-hOc4d", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/VSK5-DET", - "synonyms": [], - "rgb": [ - 109, - 218, - 10 - ], - "children": [ - { - "name": "Area hOc4d (Cuneus) - left hemisphere", - "rgb": [ - 109, - 218, - 10 - ], - "labelIndex": 119, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -17209585, - -87846006, - 25522684 - ] - }, - { - "name": "Area hOc4d (Cuneus) - right hemisphere", - "rgb": [ - 109, - 218, - 10 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 119, - "children": [], - "status": "publicP", - "position": [ - 20232373, - -87193644, - 27253227 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "8120426c-f65b-4426-8a58-3060e2334921" - } - }, - "relatedAreas": [] - }, - { - "name": "Area hOc3d (Cuneus)", - "arealabel": "Area-hOc3d", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/F9X3-JVJ", - "synonyms": [], - "rgb": [ - 105, - 191, - 48 - ], - "children": [ - { - "name": "Area hOc3d (Cuneus) - left hemisphere", - "rgb": [ - 105, - 191, - 48 - ], - "labelIndex": 120, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -12816505, - -91289984, - 21840872 - ] - }, - { - "name": "Area hOc3d (Cuneus) - right hemisphere", - "rgb": [ - 105, - 191, - 48 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 120, - "children": [], - "status": "publicP", - "position": [ - 16129503, - -88897084, - 23080617 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "d7ec4342-ae58-41e3-a68c-28e90a719d41" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "ventral occipital cortex", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area hOc3v (LingG)", - "arealabel": "Area-hOc3v", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/E5E8-1VV", - "synonyms": [], - "rgb": [ - 83, - 179, - 155 - ], - "children": [ - { - "name": "Area hOc3v (LingG) - left hemisphere", - "rgb": [ - 83, - 179, - 155 - ], - "labelIndex": 10, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -18685863, - -85629087, - -10106719 - ] - }, - { - "name": "Area hOc3v (LingG) - right hemisphere", - "rgb": [ - 83, - 179, - 155 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 10, - "children": [], - "status": "publicP", - "position": [ - 24296060, - -81686611, - -10031193 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "0d6392fd-b905-4bc3-bac9-fc44d8990a30" - } - }, - "relatedAreas": [] - }, - { - "name": "Area hOc4v (LingG)", - "arealabel": "Area-hOc4v", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/AASR-M8P", - "synonyms": [], - "rgb": [ - 222, - 77, - 155 - ], - "children": [ - { - "name": "Area hOc4v (LingG) - left hemisphere", - "rgb": [ - 222, - 77, - 155 - ], - "labelIndex": 9, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -26315808, - -78419533, - -12497238 - ] - }, - { - "name": "Area hOc4v (LingG) - right hemisphere", - "rgb": [ - 222, - 77, - 155 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 9, - "children": [], - "status": "publicP", - "position": [ - 32665897, - -76519832, - -12453305 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "27d91cbb-5611-4d38-bd17-c0f1ac22b4cc" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "occipital cortex", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area hOc2 (V2, 18)", - "arealabel": "Area-hOc2", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/QG9C-THD", - "synonyms": [], - "rgb": [ - 84, - 110, - 22 - ], - "children": [ - { - "name": "Area hOc2 (V2, 18) - left hemisphere", - "rgb": [ - 84, - 110, - 22 - ], - "labelIndex": 7, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -10521334, - -88185706, - 4055081 - ] - }, - { - "name": "Area hOc2 (V2, 18) - right hemisphere", - "rgb": [ - 84, - 110, - 22 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 7, - "children": [], - "status": "publicP", - "position": [ - 15409559, - -86163484, - 2905309 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "04674a3c-bb3a-495e-a466-206355e630bd" - } - }, - "relatedAreas": [] - }, - { - "name": "Area hOc1 (V1, 17, CalcS)", - "arealabel": "Area-hOc1", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/MXJ6-6DH", - "synonyms": [], - "rgb": [ - 190, - 132, - 147 - ], - "children": [ - { - "name": "Area hOc1 (V1, 17, CalcS) - left hemisphere", - "rgb": [ - 190, - 132, - 147 - ], - "labelIndex": 8, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -8533787, - -84646549, - 1855106 - ] - }, - { - "name": "Area hOc1 (V1, 17, CalcS) - right hemisphere", - "rgb": [ - 190, - 132, - 147 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 8, - "children": [], - "status": "publicP", - "position": [ - 14654595, - -81416396, - 1637838 - ] - } - ], - "relatedAreas": [ - { - "name": "Area hOc1", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "b851eb9d-9502-45e9-8dd8-2861f0e6da3f" - } - } - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "5151ab8f-d8cb-4e67-a449-afe2a41fb007" - } - } - } - ] - }, - { - "name": "lateral occipital cortex", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area hOc4lp (LOC)", - "arealabel": "Area-hOc4lp", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/4B87-Q8X", - "synonyms": [], - "rgb": [ - 96, - 113, - 253 - ], - "children": [ - { - "name": "Area hOc4lp (LOC) - left hemisphere", - "rgb": [ - 96, - 113, - 253 - ], - "labelIndex": 117, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -34066943, - -88725728, - 6360721 - ] - }, - { - "name": "Area hOc4lp (LOC) - right hemisphere", - "rgb": [ - 96, - 113, - 253 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 117, - "children": [], - "status": "publicP", - "position": [ - 38538256, - -86375516, - 4086228 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "9006ee6a-6dc1-4604-9f20-7e08b42d574d" - } - }, - "relatedAreas": [] - }, - { - "name": "Area hOc5 (LOC)", - "arealabel": "Area-hOc5", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/2WSH-MCT", - "synonyms": [], - "rgb": [ - 255, - 0, - 0 - ], - "children": [ - { - "name": "Area hOc5 (LOC) - left hemisphere", - "rgb": [ - 255, - 0, - 0 - ], - "labelIndex": 6, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -42484324, - -71486486, - 1795676 - ] - }, - { - "name": "Area hOc5 (LOC) - right hemisphere", - "rgb": [ - 255, - 0, - 0 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 6, - "children": [], - "status": "publicP", - "position": [ - 48090700, - -66172216, - 3121699 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "b40afb5a-e6a1-47b6-8a3e-1f8a20fbf99a" - } - }, - "relatedAreas": [] - }, - { - "name": "Area hOc4la (LOC)", - "arealabel": "Area-hOc4la", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/Z9JX-WKB", - "synonyms": [], - "rgb": [ - 233, - 168, - 189 - ], - "children": [ - { - "name": "Area hOc4la (LOC) - left hemisphere", - "rgb": [ - 233, - 168, - 189 - ], - "labelIndex": 118, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -46291484, - -76947955, - -372761 - ] - }, - { - "name": "Area hOc4la (LOC) - right hemisphere", - "rgb": [ - 233, - 168, - 189 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 118, - "children": [], - "status": "publicP", - "position": [ - 48566255, - -73862041, - -779202 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "94365b82-6204-4937-8b86-fe0433287938" - } - }, - "relatedAreas": [] - } - ] - } - ] - }, - { - "name": "frontal lobe", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "inferior frontal gyrus", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area 44 (IFG)", - "arealabel": "Area-44", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/F9P8-ZVW", - "synonyms": [], - "relatedAreas": [ - { - "name": "Area 44v", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "7e5e7aa8-28b8-445b-8980-2a6f3fa645b3" - } - } - }, - { - "name": "Area 44d", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "8aeae833-81c8-4e27-a8d6-deee339d6052" - } - } - } - ], - "rgb": [ - 54, - 74, - 75 - ], - "children": [ - { - "name": "Area 44 (IFG) - left hemisphere", - "rgb": [ - 54, - 74, - 75 - ], - "labelIndex": 2, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -54242820, - 11425127, - 18292735 - ] - }, - { - "name": "Area 44 (IFG) - right hemisphere", - "rgb": [ - 54, - 74, - 75 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 2, - "children": [], - "status": "publicP", - "position": [ - 56359074, - 11741030, - 13444358 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "8a6be82c-5947-4fff-8348-cf9bf73e4f40" - } - } - }, - { - "name": "Area 45 (IFG)", - "arealabel": "Area-45", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/MR1V-BJ3", - "synonyms": [], - "relatedAreas": [ - { - "name": "Area 45", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "131e6de8-b073-4f01-8f60-1bdb5a6c9a9a" - } - } - } - ], - "rgb": [ - 167, - 103, - 146 - ], - "children": [ - { - "name": "Area 45 (IFG) - left hemisphere", - "rgb": [ - 167, - 103, - 146 - ], - "labelIndex": 1, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -54903012, - 26558233, - 15528514 - ] - }, - { - "name": "Area 45 (IFG) - right hemisphere", - "rgb": [ - 167, - 103, - 146 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 1, - "children": [], - "status": "publicP", - "position": [ - 55787613, - 26216770, - 12102941 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "cb32e688-43f0-4ae3-9554-085973137663" - } - } - } - ] - }, - { - "name": "dorsal precentral gyrus", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area 6d2 (PreCG)", - "arealabel": "Area-6d2", - "status": "publicDOI", - "labelIndex": null, - "doi": "https://doi.org/10.25493/KXHS-N90", - "synonyms": [], - "rgb": [ - 170, - 151, - 180 - ], - "children": [ - { - "name": "Area 6d2 (PreCG) - left hemisphere", - "rgb": [ - 170, - 151, - 180 - ], - "labelIndex": 288, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -15757793, - 2030353, - 68024610 - ] - }, - { - "name": "Area 6d2 (PreCG) - right hemisphere", - "rgb": [ - 170, - 151, - 180 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 288, - "children": [], - "status": "publicDOI", - "position": [ - 14562976, - 2312675, - 68442439 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "963c5281-67df-4d41-9b91-60b31cf150c0" - } - }, - "relatedAreas": [] - }, - { - "name": "Area 6d1 (PreCG)", - "arealabel": "Area-6d1", - "status": "publicDOI", - "labelIndex": null, - "doi": "https://doi.org/10.25493/4WSQ-8FM", - "synonyms": [], - "rgb": [ - 45, - 33, - 27 - ], - "children": [ - { - "name": "Area 6d1 (PreCG) - left hemisphere", - "rgb": [ - 45, - 33, - 27 - ], - "labelIndex": 287, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -20332759, - -14746524, - 68590141 - ] - }, - { - "name": "Area 6d1 (PreCG) - right hemisphere", - "rgb": [ - 45, - 33, - 27 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 287, - "children": [], - "status": "publicDOI", - "position": [ - 20258981, - -16559656, - 68870890 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "a802f3dc-b7e5-48b7-9845-832a6e6f9b1c" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "posterior medial superior frontal gyrus", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area 6ma (preSMA, mesial SFG)", - "arealabel": "Area-6ma", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/WVNR-SPT", - "synonyms": [], - "rgb": [ - 204, - 108, - 222 - ], - "children": [ - { - "name": "Area 6ma (preSMA, mesial SFG) - left hemisphere", - "rgb": [ - 204, - 108, - 222 - ], - "labelIndex": 299, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -4083913, - 4296092, - 58555023 - ] - }, - { - "name": "Area 6ma (preSMA, mesial SFG) - right hemisphere", - "rgb": [ - 204, - 108, - 222 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 299, - "children": [], - "status": "publicP", - "position": [ - 5230140, - 4042128, - 58355079 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "07b4c6a1-8a24-4f88-8f73-b2ea06e1c2f3" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "superior frontal sulcus", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area 6d3 (SFS)", - "arealabel": "Area-6d3", - "status": "publicDOI", - "labelIndex": null, - "doi": "https://doi.org/10.25493/NVJ5-JJ", - "synonyms": [], - "rgb": [ - 55, - 239, - 21 - ], - "children": [ - { - "name": "Area 6d3 (SFS) - left hemisphere", - "rgb": [ - 55, - 239, - 21 - ], - "labelIndex": 289, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -23315931, - 4317151, - 51434008 - ] - }, - { - "name": "Area 6d3 (SFS) - right hemisphere", - "rgb": [ - 55, - 239, - 21 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 289, - "children": [], - "status": "publicDOI", - "position": [ - 25173639, - 1578188, - 53334281 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "266c1ada-1840-462f-8223-7ff2df457552" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "frontal pole", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area Fp1 (FPole)", - "arealabel": "Area-Fp1", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/PTKW-R7W", - "synonyms": [], - "rgb": [ - 226, - 14, - 200 - ], - "children": [ - { - "name": "Area Fp1 (FPole) - left hemisphere", - "rgb": [ - 226, - 14, - 200 - ], - "labelIndex": 212, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -16331031, - 64168302, - 549101 - ] - }, - { - "name": "Area Fp1 (FPole) - right hemisphere", - "rgb": [ - 226, - 14, - 200 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 212, - "children": [], - "status": "publicP", - "position": [ - 18482225, - 63988011, - -317043 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "10dc5343-941b-4e3e-80ed-df031c33bbc6" - } - }, - "relatedAreas": [] - }, - { - "name": "Area Fp2 (FPole)", - "arealabel": "Area-Fp2", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/GZW1-7R3", - "synonyms": [], - "rgb": [ - 239, - 137, - 211 - ], - "children": [ - { - "name": "Area Fp2 (FPole) - left hemisphere", - "rgb": [ - 239, - 137, - 211 - ], - "labelIndex": 211, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -3739067, - 59074587, - -1181973 - ] - }, - { - "name": "Area Fp2 (FPole) - right hemisphere", - "rgb": [ - 239, - 137, - 211 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 211, - "children": [], - "status": "publicP", - "position": [ - 6093420, - 59611191, - -509606 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "3bf7bde1-cc06-4657-b296-380275f9d4b8" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "precentral gyrus ", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area 4p (PreCG)", - "arealabel": "Area-4p", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/5HSF-81J", - "synonyms": [], - "relatedAreas": [ - { - "name": "Area 4p", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "861ab96a-c4b5-4ba6-bd40-1e80d4680f89" - } - } - } - ], - "rgb": [ - 116, - 92, - 124 - ], - "children": [ - { - "name": "Area 4p (PreCG) - left hemisphere", - "rgb": [ - 116, - 92, - 124 - ], - "labelIndex": 123, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -36140917, - -22750424, - 49282965 - ] - }, - { - "name": "Area 4p (PreCG) - right hemisphere", - "rgb": [ - 116, - 92, - 124 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 123, - "children": [], - "status": "publicP", - "position": [ - 37510795, - -21359659, - 46456250 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "82e6e826-a439-41db-84ff-4674ca3d643a" - } - } - }, - { - "name": "Area 4a (PreCG)", - "arealabel": "Area-4a", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/PVPP-P3Q", - "synonyms": [], - "rgb": [ - 118, - 239, - 183 - ], - "children": [ - { - "name": "Area 4a (PreCG) - left hemisphere", - "rgb": [ - 118, - 239, - 183 - ], - "labelIndex": 124, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -17367391, - -28669064, - 67404682 - ] - }, - { - "name": "Area 4a (PreCG) - right hemisphere", - "rgb": [ - 118, - 239, - 183 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 124, - "children": [], - "status": "publicP", - "position": [ - 9609157, - -31334779, - 68068112 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "175848ff-4c55-47e3-a0ae-f905a14e03cd" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "mesial precentral gyrus", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area 6mp (SMA, mesial SFG)", - "arealabel": "Area-6mp", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/2E1T-47F", - "synonyms": [], - "rgb": [ - 75, - 95, - 87 - ], - "children": [ - { - "name": "Area 6mp (SMA, mesial SFG) - left hemisphere", - "rgb": [ - 75, - 95, - 87 - ], - "labelIndex": 298, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -4094374, - -14286751, - 59329220 - ] - }, - { - "name": "Area 6mp (SMA, mesial SFG) - right hemisphere", - "rgb": [ - 75, - 95, - 87 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 298, - "children": [], - "status": "publicP", - "position": [ - 4949202, - -13788668, - 57534028 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "def99e8e-ce8f-4a62-bd5d-739948c4b010" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "medial orbitofrontal cortex", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area Fo1 (OFC)", - "arealabel": "Area-Fo1", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/H2N2-6J2", - "synonyms": [], - "rgb": [ - 7, - 255, - 179 - ], - "children": [ - { - "name": "Area Fo1 (OFC) - left hemisphere", - "rgb": [ - 7, - 255, - 179 - ], - "labelIndex": 3, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -7962771, - 41364968, - -22537687 - ] - }, - { - "name": "Area Fo1 (OFC) - right hemisphere", - "rgb": [ - 7, - 255, - 179 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 3, - "children": [], - "status": "publicP", - "position": [ - 9705948, - 40760961, - -22481988 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "3864cb8c-f277-4de6-9f8d-c76d71d7e9a9" - } - }, - "relatedAreas": [] - }, - { - "name": "Area Fo3 (OFC)", - "arealabel": "Area-Fo3", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/E1YQ-65U", - "synonyms": [], - "rgb": [ - 182, - 189, - 250 - ], - "children": [ - { - "name": "Area Fo3 (OFC) - left hemisphere", - "rgb": [ - 182, - 189, - 250 - ], - "labelIndex": 5, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -21866985, - 33732378, - -19882472 - ] - }, - { - "name": "Area Fo3 (OFC) - right hemisphere", - "rgb": [ - 182, - 189, - 250 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 5, - "children": [], - "status": "publicP", - "position": [ - 22929678, - 33527877, - -20231493 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "741f6a9e-cfd7-4173-ac7d-ee616c29555e" - } - }, - "relatedAreas": [] - }, - { - "name": "Area Fo2 (OFC)", - "arealabel": "Area-Fo2", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/3JB9-2V2", - "synonyms": [], - "rgb": [ - 0, - 255, - 0 - ], - "children": [ - { - "name": "Area Fo2 (OFC) - left hemisphere", - "rgb": [ - 0, - 255, - 0 - ], - "labelIndex": 4, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -8588272, - 22532156, - -20474464 - ] - }, - { - "name": "Area Fo2 (OFC) - right hemisphere", - "rgb": [ - 0, - 255, - 0 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 4, - "children": [], - "status": "publicP", - "position": [ - 9164379, - 21928964, - -20593342 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "30a04d2b-58e1-43d7-8b8f-1f0b598382d0" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "frontal operculum ", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area OP8 (Frontal Operculum)", - "arealabel": "Area-OP8", - "status": "publicDOI", - "labelIndex": null, - "doi": "https://doi.org/10.25493/NGF8-TA4", - "synonyms": [], - "rgb": [ - 29, - 76, - 168 - ], - "children": [ - { - "name": "Area OP8 (Frontal Operculum) - left hemisphere", - "rgb": [ - 29, - 76, - 168 - ], - "labelIndex": 273, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -41777921, - 17183344, - 7912847 - ] - }, - { - "name": "Area OP8 (Frontal Operculum) - right hemisphere", - "rgb": [ - 29, - 76, - 168 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 273, - "children": [], - "status": "publicDOI", - "position": [ - 42725111, - 16774146, - 7832095 - ] - } - ] - }, - { - "name": "Area OP9 (Frontal Operculum)", - "arealabel": "Area-OP9", - "status": "publicDOI", - "labelIndex": null, - "doi": "https://doi.org/10.25493/3A30-5E4", - "synonyms": [], - "rgb": [ - 175, - 123, - 34 - ], - "children": [ - { - "name": "Area OP9 (Frontal Operculum) - left hemisphere", - "rgb": [ - 175, - 123, - 34 - ], - "labelIndex": 274, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -45090542, - 25998787, - 5597413 - ] - }, - { - "name": "Area OP9 (Frontal Operculum) - right hemisphere", - "rgb": [ - 175, - 123, - 34 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 274, - "children": [], - "status": "publicDOI", - "position": [ - 44374928, - 26272467, - 2966228 - ] - } - ] - } - ] - }, - { - "name": "lateral orbitofrontal cortex", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area Fo5 (OFC)", - "arealabel": "Area-Fo5", - "status": "publicDOI", - "labelIndex": null, - "doi": "https://doi.org/10.25493/HJMY-ZZP", - "synonyms": [], - "rgb": [ - 219, - 11, - 91 - ], - "children": [ - { - "name": "Area Fo5 (OFC) - left hemisphere", - "rgb": [ - 219, - 11, - 91 - ], - "labelIndex": 325, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -38055351, - 56315867, - -8720295 - ] - }, - { - "name": "Area Fo5 (OFC) - right hemisphere", - "rgb": [ - 219, - 11, - 91 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 325, - "children": [], - "status": "publicDOI", - "position": [ - 40545983, - 54504228, - -4983615 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "3fd2e113-ec08-407b-bc88-172c9285694a" - } - }, - "relatedAreas": [] - }, - { - "name": "Area Fo4 (OFC)", - "arealabel": "Area-Fo4", - "status": "publicDOI", - "labelIndex": null, - "doi": "https://doi.org/10.25493/29G0-66F", - "synonyms": [], - "rgb": [ - 163, - 204, - 53 - ], - "children": [ - { - "name": "Area Fo4 (OFC) - left hemisphere", - "rgb": [ - 163, - 204, - 53 - ], - "labelIndex": 324, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -27573653, - 52998204, - -14510778 - ] - }, - { - "name": "Area Fo4 (OFC) - right hemisphere", - "rgb": [ - 163, - 204, - 53 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 324, - "children": [], - "status": "publicDOI", - "position": [ - 33636124, - 52034755, - -15509742 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "2cdee956-207a-4d4d-b051-bef80045210b" - } - }, - "relatedAreas": [] - }, - { - "name": "Area Fo6 (OFC)", - "arealabel": "Area-Fo6", - "status": "publicDOI", - "labelIndex": null, - "doi": "https://doi.org/10.25493/34Q4-H62", - "synonyms": [], - "rgb": [ - 199, - 156, - 187 - ], - "children": [ - { - "name": "Area Fo6 (OFC) - left hemisphere", - "rgb": [ - 199, - 156, - 187 - ], - "labelIndex": 326, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -44272971, - 42876258, - -12938967 - ] - }, - { - "name": "Area Fo6 (OFC) - right hemisphere", - "rgb": [ - 199, - 156, - 187 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 326, - "children": [], - "status": "publicDOI", - "position": [ - 48891176, - 40513824, - -12457353 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "330ae178-557c-4bd0-a932-f138c0a05345" - } - }, - "relatedAreas": [] - }, - { - "name": "Area Fo7 (OFC)", - "arealabel": "Area-Fo7", - "status": "publicDOI", - "labelIndex": null, - "doi": "https://doi.org/10.25493/3WEV-561", - "synonyms": [], - "rgb": [ - 64, - 211, - 186 - ], - "children": [ - { - "name": "Area Fo7 (OFC) - left hemisphere", - "rgb": [ - 64, - 211, - 186 - ], - "labelIndex": 327, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -36046240, - 37308943, - -11666667 - ] - }, - { - "name": "Area Fo7 (OFC) - right hemisphere", - "rgb": [ - 64, - 211, - 186 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 327, - "children": [], - "status": "publicDOI", - "position": [ - 37850755, - 37700302, - -13777644 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "1b882148-fcdd-4dbe-b33d-659957840e9e" - } - }, - "relatedAreas": [] - } - ] - } - ] - }, - { - "name": "insula", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "granular insula", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area Ig1 (Insula)", - "arealabel": "Area-Ig1", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/EKV9-29D", - "synonyms": [], - "rgb": [ - 18, - 111, - 40 - ], - "children": [ - { - "name": "Area Ig1 (Insula) - left hemisphere", - "rgb": [ - 18, - 111, - 40 - ], - "labelIndex": 115, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -33211215, - -24171963, - 9923364 - ] - }, - { - "name": "Area Ig1 (Insula) - right hemisphere", - "rgb": [ - 18, - 111, - 40 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 115, - "children": [], - "status": "publicP", - "position": [ - 33707983, - -23338235, - 9071429 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "46cf08af-8086-4e8a-9e9f-182ca583bdf0" - } - }, - "relatedAreas": [] - }, - { - "name": "Area Ig3 (Insula)", - "arealabel": "Area-Ig3", - "status": "publicDOI", - "labelIndex": null, - "doi": "", - "synonyms": [], - "rgb": [ - 105, - 253, - 197 - ], - "children": [ - { - "name": "Area Ig3 (Insula) - left hemisphere", - "rgb": [ - 105, - 253, - 197 - ], - "labelIndex": 336, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -37956284, - -14423497, - 13513661 - ] - }, - { - "name": "Area Ig3 (Insula) - right hemisphere", - "rgb": [ - 105, - 253, - 197 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 336, - "children": [], - "status": "publicDOI", - "position": [ - 38219144, - -13750630, - 13916877 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "10dba769-4f6c-40f9-8ffd-e0cce71c5adb" - } - }, - "relatedAreas": [] - }, - { - "name": "Area Ig2 (Insula)", - "arealabel": "Area-Ig2", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/662G-E0W", - "synonyms": [], - "rgb": [ - 105, - 61, - 82 - ], - "children": [ - { - "name": "Area Ig2 (Insula) - left hemisphere", - "rgb": [ - 105, - 61, - 82 - ], - "labelIndex": 114, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -37117338, - -17859895, - 5094571 - ] - }, - { - "name": "Area Ig2 (Insula) - right hemisphere", - "rgb": [ - 105, - 61, - 82 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 114, - "children": [], - "status": "publicP", - "position": [ - 37843632, - -16445145, - 5703657 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "49092952-1eef-4b89-b8bf-1bf1f25f149a" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "agranular insula", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area Ia (Insula)", - "arealabel": "Area-Ia", - "status": "publicDOI", - "labelIndex": null, - "doi": "https://doi.org/10.25493/WW8G-T2G", - "synonyms": [], - "rgb": [ - 71, - 217, - 62 - ], - "children": [ - { - "name": "Area Ia (Insula) - left hemisphere", - "rgb": [ - 71, - 217, - 62 - ], - "labelIndex": 339, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -41612827, - -1876485, - -7019002 - ] - }, - { - "name": "Area Ia (Insula) - right hemisphere", - "rgb": [ - 71, - 217, - 62 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 339, - "children": [], - "status": "publicDOI", - "position": [ - 43525000, - 36538, - -7609615 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "110d0d7b-cb88-48ea-9caf-863f548dbe38" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "dys-/agranular insula", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area Id7 (Insula)", - "arealabel": "Area-Id7", - "status": "publicDOI", - "labelIndex": null, - "doi": "https://doi.org/10.25493/88QG-JMS", - "synonyms": [], - "rgb": [ - 101, - 202, - 38 - ], - "children": [ - { - "name": "Area Id7 (Insula) - left hemisphere", - "rgb": [ - 101, - 202, - 38 - ], - "labelIndex": 159, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -30926962, - 23741297, - 4787031 - ] - }, - { - "name": "Area Id7 (Insula) - right hemisphere", - "rgb": [ - 101, - 202, - 38 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 159, - "children": [], - "status": "publicDOI", - "position": [ - 35034429, - 24873239, - 2446009 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "3d5729f5-55c6-412a-8fc1-41a95c71b13a" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "dysgranular insula", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area Id2 (Insula)", - "arealabel": "Area-Id2", - "status": "publicDOI", - "labelIndex": null, - "doi": "", - "synonyms": [], - "rgb": [ - 225, - 126, - 73 - ], - "children": [ - { - "name": "Area Id2 (Insula) - left hemisphere", - "rgb": [ - 225, - 126, - 73 - ], - "labelIndex": 56, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -41933981, - -11436893, - 4091262 - ] - }, - { - "name": "Area Id2 (Insula) - right hemisphere", - "rgb": [ - 225, - 126, - 73 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 56, - "children": [], - "status": "publicDOI", - "position": [ - 44043478, - -10289855, - 3759834 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "cf9dea67-649d-4034-ae57-ec389f339277" - } - }, - "relatedAreas": [] - }, - { - "name": "Area Id1 (Insula)", - "arealabel": "Area-Id1", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/F37H-8WB", - "synonyms": [], - "rgb": [ - 141, - 112, - 216 - ], - "children": [ - { - "name": "Area Id1 (Insula) - left hemisphere", - "rgb": [ - 141, - 112, - 216 - ], - "labelIndex": 116, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -40090747, - -18279359, - -4567616 - ] - }, - { - "name": "Area Id1 (Insula) - right hemisphere", - "rgb": [ - 141, - 112, - 216 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 116, - "children": [], - "status": "publicP", - "position": [ - 40527825, - -17443508, - -4688027 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "c22055c1-514f-4096-906b-abf57286053b" - } - }, - "relatedAreas": [] - }, - { - "name": "Area Id3 (Insula)", - "arealabel": "Area-Id3", - "status": "publicDOI", - "labelIndex": null, - "doi": "", - "synonyms": [], - "rgb": [ - 32, - 32, - 58 - ], - "children": [ - { - "name": "Area Id3 (Insula) - left hemisphere", - "rgb": [ - 32, - 32, - 58 - ], - "labelIndex": 57, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -40414195, - -7819915, - -8263771 - ] - }, - { - "name": "Area Id3 (Insula) - right hemisphere", - "rgb": [ - 32, - 32, - 58 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 57, - "children": [], - "status": "publicDOI", - "position": [ - 41459316, - -6224335, - -9042586 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "3dcfcfc2-035c-4785-a820-a671f2104ac3" - } - }, - "relatedAreas": [] - }, - { - "name": "Area Id5 (Insula)", - "arealabel": "Area-Id5", - "status": "publicDOI", - "labelIndex": null, - "doi": "https://doi.org/10.25493/5CK1-B1G", - "synonyms": [], - "rgb": [ - 112, - 6, - 50 - ], - "children": [ - { - "name": "Area Id5 (Insula) - left hemisphere", - "rgb": [ - 112, - 6, - 50 - ], - "labelIndex": 338, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -40174302, - -3354190, - 741899 - ] - }, - { - "name": "Area Id5 (Insula) - right hemisphere", - "rgb": [ - 112, - 6, - 50 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 338, - "children": [], - "status": "publicDOI", - "position": [ - 41094953, - -2659538, - 607357 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "e03cd3c6-d0be-481c-b906-9b39c1d0b641" - } - }, - "relatedAreas": [] - }, - { - "name": "Area Id6 (Insula)", - "arealabel": "Area-Id6", - "status": "publicDOI", - "labelIndex": null, - "doi": "https://doi.org/10.25493/54HZ-KFQ", - "synonyms": [], - "rgb": [ - 138, - 127, - 119 - ], - "children": [ - { - "name": "Area Id6 (Insula) - left hemisphere", - "rgb": [ - 138, - 127, - 119 - ], - "labelIndex": 340, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -36392282, - 9843698, - 3385341 - ] - }, - { - "name": "Area Id6 (Insula) - right hemisphere", - "rgb": [ - 138, - 127, - 119 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 340, - "children": [], - "status": "publicDOI", - "position": [ - 37750946, - 10762642, - 3041624 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "31bbe92d-e5e8-4cf4-be5d-e6b12c71a107" - } - }, - "relatedAreas": [] - }, - { - "name": "Area Id4 (Insula)", - "arealabel": "Area-Id4", - "status": "publicDOI", - "labelIndex": null, - "doi": "https://doi.org/10.25493/K63G-89H", - "synonyms": [], - "rgb": [ - 38, - 174, - 113 - ], - "children": [ - { - "name": "Area Id4 (Insula) - left hemisphere", - "rgb": [ - 38, - 174, - 113 - ], - "labelIndex": 337, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -37055965, - -3505155, - 11422680 - ] - }, - { - "name": "Area Id4 (Insula) - right hemisphere", - "rgb": [ - 38, - 174, - 113 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 337, - "children": [], - "status": "publicDOI", - "position": [ - 37461444, - -3746634, - 10858017 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "f480ed72-5ca5-4d1f-8905-cbe9bedcfaee" - } - }, - "relatedAreas": [] - } - ] - } - ] - }, - { - "name": "temporal lobe", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "superior temporal sulcus", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area STS2 (STS)", - "arealabel": "Area-STS2", - "status": "publicDOI", - "labelIndex": null, - "doi": "https://doi.org/10.25493/KHY9-J3Y", - "synonyms": [], - "rgb": [ - 62, - 117, - 123 - ], - "children": [ - { - "name": "Area STS2 (STS) - left hemisphere", - "rgb": [ - 62, - 117, - 123 - ], - "labelIndex": 272, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -56352486, - -8557380, - -14844672 - ] - }, - { - "name": "Area STS2 (STS) - right hemisphere", - "rgb": [ - 62, - 117, - 123 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 272, - "children": [], - "status": "publicDOI", - "position": [ - 56942990, - -8020716, - -16067930 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "278fc30f-2e24-4046-856b-95dfaf561635" - } - }, - "relatedAreas": [] - }, - { - "name": "Area STS1 (STS)", - "arealabel": "Area-STS1", - "status": "publicDOI", - "labelIndex": null, - "doi": "https://doi.org/10.25493/F6DF-H8P", - "synonyms": [], - "rgb": [ - 205, - 228, - 4 - ], - "children": [ - { - "name": "Area STS1 (STS) - left hemisphere", - "rgb": [ - 205, - 228, - 4 - ], - "labelIndex": 271, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -54514755, - -16753913, - -5260713 - ] - }, - { - "name": "Area STS1 (STS) - right hemisphere", - "rgb": [ - 205, - 228, - 4 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 271, - "children": [], - "status": "publicDOI", - "position": [ - 54536567, - -17992636, - -5712544 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "68784b66-ff15-4b09-b28a-a2146c0f8907" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "superior temporal gyrus", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area TE 3 (STG)", - "arealabel": "Area-TE-3", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/BN5J-JT8", - "synonyms": [], - "rgb": [ - 159, - 104, - 108 - ], - "children": [ - { - "name": "Area TE 3 (STG) - left hemisphere", - "rgb": [ - 159, - 104, - 108 - ], - "labelIndex": 31, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -64398501, - -12497885, - 1316801 - ] - }, - { - "name": "Area TE 3 (STG) - right hemisphere", - "rgb": [ - 159, - 104, - 108 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 31, - "children": [], - "status": "publicP", - "position": [ - 65811519, - -9018989, - -1027621 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "7e1a3291-efdc-4ca6-a3d0-6c496c34639f" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "Heschl's gyrus", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area TE 1.2 (HESCHL)", - "arealabel": "Area-TE-1.2", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/R382-617", - "synonyms": [], - "rgb": [ - 202, - 251, - 192 - ], - "children": [ - { - "name": "Area TE 1.2 (HESCHL) - left hemisphere", - "rgb": [ - 202, - 251, - 192 - ], - "labelIndex": 30, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -50810427, - -6551343, - 1635071 - ] - }, - { - "name": "Area TE 1.2 (HESCHL) - right hemisphere", - "rgb": [ - 202, - 251, - 192 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 30, - "children": [], - "status": "publicP", - "position": [ - 55870330, - -2672527, - 52747 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "677cd48c-70fa-4bbd-9f0a-ffdc7744bc0f" - } - }, - "relatedAreas": [] - }, - { - "name": "Area TE 1.1 (HESCHL)", - "arealabel": "Area-TE-1.1", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/4HA3-BBE", - "synonyms": [], - "rgb": [ - 8, - 113, - 68 - ], - "children": [ - { - "name": "Area TE 1.1 (HESCHL) - left hemisphere", - "rgb": [ - 8, - 113, - 68 - ], - "labelIndex": 33, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -38219760, - -27125577, - 10774700 - ] - }, - { - "name": "Area TE 1.1 (HESCHL) - right hemisphere", - "rgb": [ - 8, - 113, - 68 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 33, - "children": [], - "status": "publicP", - "position": [ - 40719340, - -24106132, - 10308962 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "e2969911-77eb-4b21-af70-216cab5285b1" - } - }, - "relatedAreas": [] - }, - { - "name": "Area TE 1.0 (HESCHL)", - "arealabel": "Area-TE-1.0", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/MV3G-RET", - "synonyms": [], - "relatedAreas": [ - { - "name": "Area Te1", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "f424643e-9baf-4c50-9417-db1ac33dcd3e" - } - } - } - ], - "rgb": [ - 252, - 84, - 222 - ], - "children": [ - { - "name": "Area TE 1.0 (HESCHL) - left hemisphere", - "rgb": [ - 252, - 84, - 222 - ], - "labelIndex": 27, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -46560150, - -17508772, - 7622807 - ] - }, - { - "name": "Area TE 1.0 (HESCHL) - right hemisphere", - "rgb": [ - 252, - 84, - 222 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 27, - "children": [], - "status": "publicP", - "position": [ - 50392116, - -12932573, - 5942946 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "13e21153-2ba8-4212-b172-8894f1012225" - } - } - } - ] - }, - { - "name": "fusiform gyrus", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area FG2 (FusG)", - "arealabel": "Area-FG2", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/F2JH-KVV", - "synonyms": [], - "relatedAreas": [ - { - "name": "Area FG2", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "8f436328-4251-4706-ae38-767e1ab21c6f" - } - } - } - ], - "rgb": [ - 67, - 94, - 149 - ], - "children": [ - { - "name": "Area FG2 (FusG) - left hemisphere", - "rgb": [ - 67, - 94, - 149 - ], - "labelIndex": 106, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -43549584, - -65531770, - -16708135 - ] - }, - { - "name": "Area FG2 (FusG) - right hemisphere", - "rgb": [ - 67, - 94, - 149 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 106, - "children": [], - "status": "publicP", - "position": [ - 44839825, - -63606518, - -17316773 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "6e7a0441-4baa-4355-921b-50d23d07d50f" - } - } - }, - { - "name": "Area FG3 (FusG)", - "arealabel": "Area-FG3", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/Z0F6-0SY", - "synonyms": [], - "rgb": [ - 120, - 147, - 37 - ], - "children": [ - { - "name": "Area FG3 (FusG) - left hemisphere", - "rgb": [ - 120, - 147, - 37 - ], - "labelIndex": 239, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -29844935, - -45368421, - -14184493 - ] - }, - { - "name": "Area FG3 (FusG) - right hemisphere", - "rgb": [ - 120, - 147, - 37 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 239, - "children": [], - "status": "publicP", - "position": [ - 31148061, - -44485336, - -15533822 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "023f8ef7-c266-4c45-8bf2-4a17dc52985b" - } - }, - "relatedAreas": [] - }, - { - "name": "Area FG1 (FusG)", - "arealabel": "Area-FG1", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/5ZVQ-R8R", - "synonyms": [], - "rgb": [ - 131, - 183, - 58 - ], - "children": [ - { - "name": "Area FG1 (FusG) - left hemisphere", - "rgb": [ - 131, - 183, - 58 - ], - "labelIndex": 107, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -29006116, - -66264526, - -12290010 - ] - }, - { - "name": "Area FG1 (FusG) - right hemisphere", - "rgb": [ - 131, - 183, - 58 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 107, - "children": [], - "status": "publicP", - "position": [ - 32840456, - -64340456, - -12612536 - ] - } - ], - "relatedAreas": [ - { - "name": "Area FG1", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "6318e160-4ad2-4eec-8a2e-2df6fe07d8f4" - } - } - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "39fb34a8-fd6d-4fba-898c-2f6167e40459" - } - } - }, - { - "name": "Area FG4 (FusG)", - "arealabel": "Area-FG4", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/13RG-FYV", - "synonyms": [], - "relatedAreas": [ - { - "name": "Area FG2", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "8f436328-4251-4706-ae38-767e1ab21c6f" - } - } - } - ], - "rgb": [ - 170, - 220, - 175 - ], - "children": [ - { - "name": "Area FG4 (FusG) - left hemisphere", - "rgb": [ - 170, - 220, - 175 - ], - "labelIndex": 238, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -43204016, - -44325167, - -20016734 - ] - }, - { - "name": "Area FG4 (FusG) - right hemisphere", - "rgb": [ - 170, - 220, - 175 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 238, - "children": [], - "status": "publicP", - "position": [ - 43609694, - -43478025, - -22392295 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "fa602743-5f6e-49d1-9734-29dffaa95ff5" - } - } - } - ] - } - ] - }, - { - "name": "limbic lobe", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "cingulate gyrus, frontal part", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area p24c (pACC)", - "arealabel": "Area-p24c", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/QA7B-JM9", - "synonyms": [], - "rgb": [ - 241, - 164, - 195 - ], - "children": [ - { - "name": "Area p24c (pACC) - left hemisphere", - "rgb": [ - 241, - 164, - 195 - ], - "labelIndex": 232, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -8144989, - 41168443, - 14314854 - ] - }, - { - "name": "Area p24c (pACC) - right hemisphere", - "rgb": [ - 241, - 164, - 195 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 232, - "children": [], - "status": "publicP", - "position": [ - 9856593, - 40780558, - 12002406 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "e6507a3d-f2f8-4c17-84ff-0e7297e836a0" - } - }, - "relatedAreas": [] - }, - { - "name": "Area 25 (sACC)", - "arealabel": "Area-25", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/51AM-WN4", - "synonyms": [], - "rgb": [ - 170, - 68, - 220 - ], - "children": [ - { - "name": "Area 25 (sACC) - left hemisphere", - "rgb": [ - 170, - 68, - 220 - ], - "labelIndex": 184, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -3522692, - 13560250, - -11860720 - ] - }, - { - "name": "Area 25 (sACC) - right hemisphere", - "rgb": [ - 170, - 68, - 220 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 184, - "children": [], - "status": "publicP", - "position": [ - 4564663, - 12954463, - -12174863 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "9010ef76-accd-4308-9951-f37b6a10f42b" - } - }, - "relatedAreas": [] - }, - { - "name": "Area p24ab (pACC)", - "arealabel": "Area-p24ab", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/DHXC-2KN", - "synonyms": [], - "rgb": [ - 153, - 195, - 229 - ], - "children": [ - { - "name": "Area p24ab (pACC) - left hemisphere", - "rgb": [ - 153, - 195, - 229 - ], - "labelIndex": 231, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -2244059, - 38783168, - 6389109 - ] - }, - { - "name": "Area p24ab (pACC) - right hemisphere", - "rgb": [ - 153, - 195, - 229 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 231, - "children": [], - "status": "publicP", - "position": [ - 3429274, - 38385609, - 7809963 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "5dbb1035-487c-4f43-b551-ccadcf058340" - } - }, - "relatedAreas": [] - }, - { - "name": "Area s32 (sACC)", - "arealabel": "Area-s32", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/XTRR-172", - "synonyms": [], - "rgb": [ - 193, - 94, - 250 - ], - "children": [ - { - "name": "Area s32 (sACC) - left hemisphere", - "rgb": [ - 193, - 94, - 250 - ], - "labelIndex": 46, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -6738110, - 35256183, - -11765377 - ] - }, - { - "name": "Area s32 (sACC) - right hemisphere", - "rgb": [ - 193, - 94, - 250 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 46, - "children": [], - "status": "publicP", - "position": [ - 4307795, - 34460360, - -12141905 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "61b44255-ae3a-4a23-b1bc-7d303a48dbd3" - } - }, - "relatedAreas": [] - }, - { - "name": "Area 33 (ACC)", - "arealabel": "Area-33", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/X9QP-C6F", - "synonyms": [], - "rgb": [ - 51, - 57, - 245 - ], - "children": [ - { - "name": "Area 33 (ACC) - left hemisphere", - "rgb": [ - 51, - 57, - 245 - ], - "labelIndex": 39, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -4861218, - 14163048, - 15911877 - ] - }, - { - "name": "Area 33 (ACC) - right hemisphere", - "rgb": [ - 51, - 57, - 245 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 39, - "children": [], - "status": "publicP", - "position": [ - 5087045, - 15562321, - 16125051 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "b83a3330-b80e-42a0-b8d2-82f38784aa1d" - } - }, - "relatedAreas": [] - }, - { - "name": "Area p32 (pACC)", - "arealabel": "Area-p32", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/3JX0-7E5", - "synonyms": [], - "rgb": [ - 87, - 135, - 14 - ], - "children": [ - { - "name": "Area p32 (pACC) - left hemisphere", - "rgb": [ - 87, - 135, - 14 - ], - "labelIndex": 47, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -6122937, - 49256108, - 11929896 - ] - }, - { - "name": "Area p32 (pACC) - right hemisphere", - "rgb": [ - 87, - 135, - 14 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 47, - "children": [], - "status": "publicP", - "position": [ - 7759613, - 48520792, - 12436058 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "b09aaa77-f41b-4008-b8b9-f984b0417cf3" - } - }, - "relatedAreas": [] - }, - { - "name": "Area s24 (sACC)", - "arealabel": "Area-s24", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/HXWM-NRX", - "synonyms": [], - "rgb": [ - 133, - 34, - 201 - ], - "children": [ - { - "name": "Area s24 (sACC) - left hemisphere", - "rgb": [ - 133, - 34, - 201 - ], - "labelIndex": 183, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -3247887, - 24596479, - -9615493 - ] - }, - { - "name": "Area s24 (sACC) - right hemisphere", - "rgb": [ - 133, - 34, - 201 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 183, - "children": [], - "status": "publicP", - "position": [ - 3259899, - 23813535, - -9257019 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "d4ea6cc5-1e1d-4212-966f-81fed01eb648" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "hippocampal formation", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "HATA (Hippocampus)", - "arealabel": "HATA", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/M1XP-VSQ", - "synonyms": [], - "rgb": [ - 137, - 12, - 73 - ], - "children": [ - { - "name": "HATA (Hippocampus) - left hemisphere", - "rgb": [ - 137, - 12, - 73 - ], - "labelIndex": 68, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -13947917, - -9576389, - -18975694 - ] - }, - { - "name": "HATA (Hippocampus) - right hemisphere", - "rgb": [ - 137, - 12, - 73 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 68, - "children": [], - "status": "publicP", - "position": [ - 15080586, - -8358974, - -17871795 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "9ec4a423-70fa-43cd-90b3-fbc26a3cbc6c" - } - }, - "relatedAreas": [] - }, - { - "name": "Entorhinal Cortex", - "arealabel": "Entorhinal-Cortex", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/KNXY-B1Z", - "synonyms": [], - "rgb": [ - 35, - 159, - 214 - ], - "children": [ - { - "name": "Entorhinal Cortex - left hemisphere", - "rgb": [ - 35, - 159, - 214 - ], - "labelIndex": 60, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -20926052, - -6082765, - -33357509 - ] - }, - { - "name": "Entorhinal Cortex - right hemisphere", - "rgb": [ - 35, - 159, - 214 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 60, - "children": [], - "status": "publicP", - "position": [ - 22877203, - -3501469, - -32577556 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "030827d4-e0d1-4406-b71f-3f58dc2f9cca" - } - }, - "relatedAreas": [] - }, - { - "name": "CA (Hippocampus)", - "arealabel": "CA", - "status": "publicP", - "labelIndex": null, - "relatedAreas": [ - { - "name": "CA1 (Hippocampus)", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "bfc0beb7-310c-4c57-b810-2adc464bd02c" - } - } - } - ], - "doi": "https://doi.org/10.25493/B85T-D88", - "synonyms": [], - "rgb": [ - 250, - 191, - 217 - ], - "children": [ - { - "name": "CA (Hippocampus) - left hemisphere", - "rgb": [ - 250, - 191, - 217 - ], - "labelIndex": 191, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -27476326, - -26068931, - -11082817 - ] - }, - { - "name": "CA (Hippocampus) - right hemisphere", - "rgb": [ - 250, - 191, - 217 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 191, - "children": [], - "status": "publicP", - "position": [ - 29426785, - -24801145, - -11142814 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "a0d14d3e-bc30-41cf-8b28-540067897f80" - } - } - }, - { - "name": "DG (Hippocampus)", - "arealabel": "DG", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/M8JP-XQT", - "synonyms": [], - "rgb": [ - 149, - 55, - 120 - ], - "children": [ - { - "name": "DG (Hippocampus) - left hemisphere", - "rgb": [ - 149, - 55, - 120 - ], - "labelIndex": 61, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -26946498, - -26708171, - -9589494 - ] - }, - { - "name": "DG (Hippocampus) - right hemisphere", - "rgb": [ - 149, - 55, - 120 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 61, - "children": [], - "status": "publicP", - "position": [ - 28316456, - -24674684, - -10596203 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "0bea7e03-bfb2-4907-9d45-db9071ce627d" - } - }, - "relatedAreas": [] - }, - { - "name": "Subiculum (Hippocampus)", - "arealabel": "Subiculum", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/QKJH-F45", - "synonyms": [], - "rgb": [ - 111, - 125, - 219 - ], - "children": [ - { - "name": "Subiculum (Hippocampus) - left hemisphere", - "rgb": [ - 111, - 125, - 219 - ], - "labelIndex": 192, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -20352171, - -24057796, - -16326997 - ] - }, - { - "name": "Subiculum (Hippocampus) - right hemisphere", - "rgb": [ - 111, - 125, - 219 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 192, - "children": [], - "status": "publicP", - "position": [ - 22543982, - -23195614, - -15923499 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "7e2dab4c-a140-440d-a322-c1679adef2d4" - } - }, - "relatedAreas": [] - } - ] - } - ] - } - ] - } - ] - }, - { - "name": "metencephalon", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "cerebellum", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "cerebellar nuclei", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "globose nucleus", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Interposed Nucleus (Cerebellum)", - "arealabel": "Interposed-Nucleus", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/8PTB-JDH", - "synonyms": [], - "rgb": [ - 170, - 29, - 10 - ], - "children": [ - { - "name": "Interposed Nucleus (Cerebellum) - left hemisphere", - "rgb": [ - 170, - 29, - 10 - ], - "labelIndex": 251, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -8457921, - -55262376, - -30235149 - ] - }, - { - "name": "Interposed Nucleus (Cerebellum) - right hemisphere", - "rgb": [ - 170, - 29, - 10 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 251, - "children": [], - "status": "publicP", - "position": [ - 7917989, - -54201058, - -31489418 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "85e7bb13-4b73-4f6f-8222-3adb7b800788" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "dentate nucleus", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Dorsal Dentate Nucleus (Cerebellum)", - "arealabel": "Dorsal-Dentate-Nucleus", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/M5QG-SHH", - "synonyms": [], - "rgb": [ - 89, - 201, - 99 - ], - "children": [ - { - "name": "Dorsal Dentate Nucleus (Cerebellum) - left hemisphere", - "rgb": [ - 89, - 201, - 99 - ], - "labelIndex": 240, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -16612782, - -56036341, - -36064536 - ] - }, - { - "name": "Dorsal Dentate Nucleus (Cerebellum) - right hemisphere", - "rgb": [ - 89, - 201, - 99 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 240, - "children": [], - "status": "publicP", - "position": [ - 15388967, - -58303395, - -36586280 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "58095aef-da69-43d4-887c-009c095cecce" - } - }, - "relatedAreas": [] - }, - { - "name": "Ventral Dentate Nucleus (Cerebellum)", - "arealabel": "Ventral-Dentate-Nucleus", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/FQE5-5QR", - "synonyms": [], - "rgb": [ - 39, - 129, - 9 - ], - "children": [ - { - "name": "Ventral Dentate Nucleus (Cerebellum) - left hemisphere", - "rgb": [ - 39, - 129, - 9 - ], - "labelIndex": 241, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -13112867, - -56176072, - -29957111 - ] - }, - { - "name": "Ventral Dentate Nucleus (Cerebellum) - right hemisphere", - "rgb": [ - 39, - 129, - 9 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 241, - "children": [], - "status": "publicP", - "position": [ - 12107011, - -55974170, - -31385609 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "57282342-5a75-4e07-bcdc-2d368c517b71" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "fastigial nucleus", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Fastigial Nucleus (Cerebellum)", - "arealabel": "Fastigial-Nucleus", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/3YJ9-S6G", - "synonyms": [], - "rgb": [ - 200, - 100, - 10 - ], - "children": [ - { - "name": "Fastigial Nucleus (Cerebellum) - left hemisphere", - "rgb": [ - 200, - 100, - 10 - ], - "labelIndex": 219, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -3828877, - -53149733, - -29013369 - ] - }, - { - "name": "Fastigial Nucleus (Cerebellum) - right hemisphere", - "rgb": [ - 200, - 100, - 10 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 219, - "children": [], - "status": "publicP", - "position": [ - 3011287, - -53069977, - -29040632 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "e8abfe3d-8b64-45c2-8853-314d82873273" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "emboliform nucleus", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Interposed Nucleus (Cerebellum)", - "arealabel": "Interposed-Nucleus", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/8PTB-JDH", - "synonyms": [], - "rgb": [ - 170, - 29, - 10 - ], - "children": [ - { - "name": "Interposed Nucleus (Cerebellum) - left hemisphere", - "rgb": [ - 170, - 29, - 10 - ], - "labelIndex": 251, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -8457921, - -55262376, - -30235149 - ] - }, - { - "name": "Interposed Nucleus (Cerebellum) - right hemisphere", - "rgb": [ - 170, - 29, - 10 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 251, - "children": [], - "status": "publicP", - "position": [ - 7917989, - -54201058, - -31489418 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "85e7bb13-4b73-4f6f-8222-3adb7b800788" - } - }, - "relatedAreas": [] - } - ] - } - ] - } - ] - } - ] - } - ] - } - ], - "properties": { - "name": "MNI Colin 27", - "description": "A stereotaxic average of 27 T1-weighted MRI scans of the same individual. (Holmes et al., 1998), mapped to fit the MNI305 space. Although not capturing brain variability, it is well established in neuroscience due to its high definition. HBP provides the JuBrain probabilistic cytoarchitectonic atlas (Amunts et al.) in this space." - } -} - -export const JUBRAIN_COLIN = { - "name": "JuBrain Cytoarchitectonic Atlas", - "ngId": "jubrain colin v18 left", - "auxillaryMeshIndices": [ - 65535 - ], - "hasAdditionalViewMode": [ - "connectivity" - ], - "originDatasets": [ - { - "kgSchema": "minds/core/dataset/v1.0.0", - "kgId": "4ac9f0bc-560d-47e0-8916-7b24da9bb0ce" - } - ], - "properties": { - "version": "1.0", - "description": "This dataset contains the whole-brain parcellation of the JuBrain Cytoarchitectonic Atlas (Amunts and Zilles, 2015) in the MNI Colin 27 as well as the MNI ICBM 152 2009c nonlinear asymmetric reference space. The parcellation is derived from the individual probability maps (PMs) of the cytoarchitectonic regions released in the JuBrain Atlas, that are further combined into a Maximum Probability Map (MPM). The MPM is calculated by considering for each voxel the probability of all cytoarchitectonic areas released in the atlas, and determining the most probable assignment (Eickhoff 2005). Note that methodological improvements and integration of new brain structures may lead to small deviations in earlier released datasets.", - "publications": [ - { - "doi": "https://doi.org/10.1038/nrn2776", - "citation": "Zilles K, Amunts K (2010) Centenary of Brodmann’s map – conception and fate. Nature Reviews Neuroscience 11(2): 139-145 " - }, - { - "doi": "https://doi.org/10.1016/j.neuroimage.2007.02.037", - "citation": "Amunts K, Schleicher A, Zilles K (2007) Cytoarchitecture of the cerebral cortex – more than localization. Neuroimage 37: 1061-1065" - }, - { - "doi": "http://dx.doi.org/10.1016/B978-012693019-1/50023-X", - "citation": "Zilles K, Schleicher A, Palomero-Gallagher N, Amunts K (2002) Quantitative analysis of cyto- and receptor architecture of the human brain. In: /Brain Mapping: The Methods/, J. C. Mazziotta and A. Toga (eds.), USA: Elsevier, 2002, p. 573-602." - } - ] - }, - "regions": [ - { - "name": "telencephalon", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "cerebral nuclei", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "basal forebrain", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "magnocellular group within septum", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Ch 123 (Basal Forebrain)", - "arealabel": "Ch-123", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/7SEP-P2V", - "synonyms": [], - "rgb": [ - 124, - 233, - 167 - ], - "children": [ - { - "name": "Ch 123 (Basal Forebrain) - left hemisphere", - "rgb": [ - 124, - 233, - 167 - ], - "labelIndex": 286, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -2339339, - 4405405, - -8804805 - ] - }, - { - "name": "Ch 123 (Basal Forebrain) - right hemisphere", - "rgb": [ - 124, - 233, - 167 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 286, - "children": [], - "status": "publicP", - "position": [ - 3240000, - 5153846, - -8347692 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "bb111a95-e04c-4987-8254-4af4ed8b0022" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "sublenticular part of basal forebrain", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Ch 4 (Basal Forebrain)", - "arealabel": "Ch-4", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/VZJ5-8WJ", - "synonyms": [], - "rgb": [ - 116, - 243, - 12 - ], - "children": [ - { - "name": "Ch 4 (Basal Forebrain) - left hemisphere", - "rgb": [ - 116, - 243, - 12 - ], - "labelIndex": 264, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -16053628, - -454259, - -12470032 - ] - }, - { - "name": "Ch 4 (Basal Forebrain) - right hemisphere", - "rgb": [ - 116, - 243, - 12 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 264, - "children": [], - "status": "publicP", - "position": [ - 17655072, - 263768, - -11539130 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "a5c9d95f-8e7c-4454-91b6-a790387370fc" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "magnocellular group within horizontal limb of diagnoal band", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Ch 123 (Basal Forebrain)", - "arealabel": "Ch-123", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/7SEP-P2V", - "synonyms": [], - "rgb": [ - 124, - 233, - 167 - ], - "children": [ - { - "name": "Ch 123 (Basal Forebrain) - left hemisphere", - "rgb": [ - 124, - 233, - 167 - ], - "labelIndex": 286, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -2339339, - 4405405, - -8804805 - ] - }, - { - "name": "Ch 123 (Basal Forebrain) - right hemisphere", - "rgb": [ - 124, - 233, - 167 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 286, - "children": [], - "status": "publicP", - "position": [ - 3240000, - 5153846, - -8347692 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "bb111a95-e04c-4987-8254-4af4ed8b0022" - } - }, - "relatedAreas": [] - } - ] - } - ] - }, - { - "name": "amygdala", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "laterobasal group", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "LB (Amygdala)", - "arealabel": "LB", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/C3X0-NV3", - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "LB (Amygdala) - left hemisphere", - "rgb": null, - "labelIndex": 15, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP" - }, - { - "name": "LB (Amygdala) - right hemisphere", - "rgb": null, - "ngId": "jubrain colin v18 right", - "labelIndex": 15, - "children": [], - "status": "publicP" - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "708df0fa-e9a4-4c23-bd85-8957f6d30faf" - } - }, - "relatedAreas": [] - }, - { - "name": "LB (Amygdala)", - "arealabel": "LB", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/C3X0-NV3", - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "LB (Amygdala) - left hemisphere", - "rgb": null, - "labelIndex": 11, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP" - }, - { - "name": "LB (Amygdala) - right hemisphere", - "rgb": null, - "ngId": "jubrain colin v18 right", - "labelIndex": 11, - "children": [], - "status": "publicP" - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "708df0fa-e9a4-4c23-bd85-8957f6d30faf" - } - }, - "relatedAreas": [] - }, - { - "name": "LB (Amygdala)", - "arealabel": "LB", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/C3X0-NV3", - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "LB (Amygdala) - left hemisphere", - "rgb": null, - "labelIndex": 19, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP" - }, - { - "name": "LB (Amygdala) - right hemisphere", - "rgb": null, - "ngId": "jubrain colin v18 right", - "labelIndex": 19, - "children": [], - "status": "publicP" - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "708df0fa-e9a4-4c23-bd85-8957f6d30faf" - } - }, - "relatedAreas": [] - }, - { - "name": "LB (Amygdala)", - "arealabel": "LB", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/C3X0-NV3", - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "LB (Amygdala) - left hemisphere", - "rgb": null, - "labelIndex": 13, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -25304803, - -1696429, - -23766626 - ] - }, - { - "name": "LB (Amygdala) - right hemisphere", - "rgb": null, - "ngId": "jubrain colin v18 right", - "labelIndex": 13, - "children": [], - "status": "publicP", - "position": [ - 28015494, - -81343, - -24045836 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "708df0fa-e9a4-4c23-bd85-8957f6d30faf" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "superficial group", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "SF (Amygdala)", - "arealabel": "SF", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/WD31-SEA", - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "SF (Amygdala) - left hemisphere", - "rgb": null, - "labelIndex": 236, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -16044471, - 530048, - -20831731 - ] - }, - { - "name": "SF (Amygdala) - right hemisphere", - "rgb": null, - "ngId": "jubrain colin v18 right", - "labelIndex": 236, - "children": [], - "status": "publicP", - "position": [ - 19382770, - 1539804, - -19413304 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "48929163-bf7b-4471-9f14-991c5225eced" - } - }, - "relatedAreas": [] - }, - { - "name": "SF (Amygdala)", - "arealabel": "SF", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/WD31-SEA", - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "SF (Amygdala) - left hemisphere", - "rgb": null, - "labelIndex": 17, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP" - }, - { - "name": "SF (Amygdala) - right hemisphere", - "rgb": null, - "ngId": "jubrain colin v18 right", - "labelIndex": 17, - "children": [], - "status": "publicP" - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "48929163-bf7b-4471-9f14-991c5225eced" - } - }, - "relatedAreas": [] - }, - { - "name": "SF (Amygdala)", - "arealabel": "SF", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/WD31-SEA", - "synonyms": [], - "rgb": [ - 18, - 168, - 22 - ], - "children": [ - { - "name": "SF (Amygdala) - left hemisphere", - "rgb": [ - 18, - 168, - 22 - ], - "labelIndex": 186, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP" - }, - { - "name": "SF (Amygdala) - right hemisphere", - "rgb": [ - 18, - 168, - 22 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 186, - "children": [], - "status": "publicP" - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "48929163-bf7b-4471-9f14-991c5225eced" - } - }, - "relatedAreas": [] - }, - { - "name": "CM (Amygdala)", - "arealabel": "CM", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/36FR-C95", - "synonyms": [], - "rgb": [ - 102, - 180, - 202 - ], - "children": [ - { - "name": "CM (Amygdala) - left hemisphere", - "rgb": [ - 102, - 180, - 202 - ], - "labelIndex": 22, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP" - }, - { - "name": "CM (Amygdala) - right hemisphere", - "rgb": [ - 102, - 180, - 202 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 22, - "children": [], - "status": "publicP" - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "7aba8aef-6430-4fa7-ab54-8ecac558faed" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "fiber masses", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "VTM (Amygdala)", - "arealabel": "VTM", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/99HN-XRE", - "synonyms": [], - "rgb": [ - 89, - 178, - 185 - ], - "children": [ - { - "name": "VTM (Amygdala) - left hemisphere", - "rgb": [ - 89, - 178, - 185 - ], - "labelIndex": 228, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -23377907, - -9837209, - -14848837 - ] - }, - { - "name": "VTM (Amygdala) - right hemisphere", - "rgb": [ - 89, - 178, - 185 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 228, - "children": [], - "status": "publicP", - "position": [ - 25513514, - -8881081, - -15551351 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "a964e6e6-8014-41a2-b975-754d75cbb6f2" - } - }, - "relatedAreas": [] - }, - { - "name": "IF (Amygdala)", - "arealabel": "IF", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/GWPR-G6K", - "synonyms": [], - "rgb": [ - 120, - 190, - 129 - ], - "children": [ - { - "name": "IF (Amygdala) - left hemisphere", - "rgb": [ - 120, - 190, - 129 - ], - "labelIndex": 237, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -27588235, - -1431373, - -17460784 - ] - }, - { - "name": "IF (Amygdala) - right hemisphere", - "rgb": [ - 120, - 190, - 129 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 237, - "children": [], - "status": "publicP", - "position": [ - 29372549, - -813725, - -16578431 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "5a1391c8-6056-40e4-a19b-3774df42bd07" - } - }, - "relatedAreas": [] - }, - { - "name": "MF (Amygdala)", - "arealabel": "MF", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/9375-55V", - "synonyms": [], - "rgb": [ - 190, - 200, - 9 - ], - "children": [ - { - "name": "MF (Amygdala) - left hemisphere", - "rgb": [ - 190, - 200, - 9 - ], - "labelIndex": 235, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -18714286, - -6523810, - -15428571 - ] - }, - { - "name": "MF (Amygdala) - right hemisphere", - "rgb": [ - 190, - 200, - 9 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 235, - "children": [], - "status": "publicP", - "position": [ - 20976744, - -4930233, - -14441860 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "3741c788-9412-4b8e-9ab4-9ca2d3a715ca" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "centromedial group", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "CM (Amygdala)", - "arealabel": "CM", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/36FR-C95", - "synonyms": [], - "rgb": [ - 89, - 4, - 190 - ], - "children": [ - { - "name": "CM (Amygdala) - left hemisphere", - "rgb": [ - 89, - 4, - 190 - ], - "labelIndex": 16, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP" - }, - { - "name": "CM (Amygdala) - right hemisphere", - "rgb": [ - 89, - 4, - 190 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 16, - "children": [], - "status": "publicP" - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "7aba8aef-6430-4fa7-ab54-8ecac558faed" - } - }, - "relatedAreas": [] - }, - { - "name": "CM (Amygdala)", - "arealabel": "CM", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/36FR-C95", - "synonyms": [], - "rgb": [ - 9, - 120, - 220 - ], - "children": [ - { - "name": "CM (Amygdala) - left hemisphere", - "rgb": [ - 9, - 120, - 220 - ], - "labelIndex": 21, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -21108108, - -3376448, - -13214286 - ] - }, - { - "name": "CM (Amygdala) - right hemisphere", - "rgb": [ - 9, - 120, - 220 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 21, - "children": [], - "status": "publicP", - "position": [ - 23157767, - -2679612, - -12555825 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "7aba8aef-6430-4fa7-ab54-8ecac558faed" - } - }, - "relatedAreas": [] - } - ] - } - ] - } - ] - }, - { - "name": "cerebral cortex", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "parietal lobe", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "superior parietal lobule", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area 5L (SPL)", - "arealabel": "Area-5L", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/C1FQ-2F", - "synonyms": [], - "rgb": [ - 184, - 185, - 58 - ], - "children": [ - { - "name": "Area 5L (SPL) - left hemisphere", - "rgb": [ - 184, - 185, - 58 - ], - "labelIndex": 130, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -18807832, - -47524930, - 66950353 - ] - }, - { - "name": "Area 5L (SPL) - right hemisphere", - "rgb": [ - 184, - 185, - 58 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 130, - "children": [], - "status": "publicP", - "position": [ - 12970516, - -51174624, - 70371695 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "64555f7f-1b33-4ffe-9853-be41e7a21096" - } - }, - "relatedAreas": [] - }, - { - "name": "Area 7M (SPL)", - "arealabel": "Area-7M", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/F25F-EKW", - "synonyms": [], - "rgb": [ - 205, - 61, - 236 - ], - "children": [ - { - "name": "Area 7M (SPL) - left hemisphere", - "rgb": [ - 205, - 61, - 236 - ], - "labelIndex": 135, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -777896, - -78103082, - 35256111 - ] - }, - { - "name": "Area 7M (SPL) - right hemisphere", - "rgb": [ - 205, - 61, - 236 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 135, - "children": [], - "status": "publicP", - "position": [ - 4281250, - -75882812, - 38312500 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "0aacea5c-bc9e-483f-8376-25f176ada158" - } - }, - "relatedAreas": [] - }, - { - "name": "Area 7PC (SPL)", - "arealabel": "Area-7PC", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/Z45N-1T", - "synonyms": [], - "rgb": [ - 252, - 89, - 28 - ], - "children": [ - { - "name": "Area 7PC (SPL) - left hemisphere", - "rgb": [ - 252, - 89, - 28 - ], - "labelIndex": 132, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -32056266, - -48916454, - 60868713 - ] - }, - { - "name": "Area 7PC (SPL) - right hemisphere", - "rgb": [ - 252, - 89, - 28 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 132, - "children": [], - "status": "publicP", - "position": [ - 30055171, - -49079568, - 61493485 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "763140d3-7ba0-4f28-b0ac-c6cbda2d14e1" - } - }, - "relatedAreas": [] - }, - { - "name": "Area 5M (SPL)", - "arealabel": "Area-5M", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/Y12F-YMU", - "synonyms": [], - "rgb": [ - 225, - 245, - 76 - ], - "children": [ - { - "name": "Area 5M (SPL) - left hemisphere", - "rgb": [ - 225, - 245, - 76 - ], - "labelIndex": 131, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -7527881, - -41962560, - 59221721 - ] - }, - { - "name": "Area 5M (SPL) - right hemisphere", - "rgb": [ - 225, - 245, - 76 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 131, - "children": [], - "status": "publicP", - "position": [ - 4642562, - -44304959, - 60273140 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "abe105cf-2c29-46af-af75-6b46fdb75137" - } - }, - "relatedAreas": [] - }, - { - "name": "Area 7P (SPL)", - "arealabel": "Area-7P", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/C3HS-8R7", - "synonyms": [], - "rgb": [ - 52, - 20, - 106 - ], - "children": [ - { - "name": "Area 7P (SPL) - left hemisphere", - "rgb": [ - 52, - 20, - 106 - ], - "labelIndex": 208, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -7679310, - -76043295, - 52631801 - ] - }, - { - "name": "Area 7P (SPL) - right hemisphere", - "rgb": [ - 52, - 20, - 106 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 208, - "children": [], - "status": "publicP", - "position": [ - 14232037, - -74892094, - 56304919 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "af9c4f39-63a4-409f-b306-e5965d639f37" - } - }, - "relatedAreas": [] - }, - { - "name": "Area 5Ci (SPL)", - "arealabel": "Area-5Ci", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/SQVP-GK1", - "synonyms": [], - "rgb": [ - 79, - 242, - 146 - ], - "children": [ - { - "name": "Area 5Ci (SPL) - left hemisphere", - "rgb": [ - 79, - 242, - 146 - ], - "labelIndex": 136, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -14033790, - -35828311, - 43857534 - ] - }, - { - "name": "Area 5Ci (SPL) - right hemisphere", - "rgb": [ - 79, - 242, - 146 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 136, - "children": [], - "status": "publicP", - "position": [ - 10563961, - -36194957, - 46892989 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "07d08f74-af3d-4cbe-bc3c-f32b7f5c989f" - } - }, - "relatedAreas": [] - }, - { - "name": "Area 7A (SPL)", - "arealabel": "Area-7A", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/7HX2-AJH", - "synonyms": [], - "rgb": [ - 38, - 204, - 19 - ], - "children": [ - { - "name": "Area 7A (SPL) - left hemisphere", - "rgb": [ - 38, - 204, - 19 - ], - "labelIndex": 134, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -20856230, - -62269710, - 61643512 - ] - }, - { - "name": "Area 7A (SPL) - right hemisphere", - "rgb": [ - 38, - 204, - 19 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 134, - "children": [], - "status": "publicP", - "position": [ - 20910951, - -62880523, - 62944473 - ] - } - ], - "relatedAreas": [ - { - "name": "Area 7A", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "811f4adb-4a7c-45c1-8034-4afa9edf586a" - } - } - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "e26e999f-77ad-4934-9569-8290ed05ebda" - } - } - } - ] - }, - { - "name": "parietal operculum", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area OP3 (POperc)", - "arealabel": "Area-OP3", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/1Z8F-PX4", - "synonyms": [], - "rgb": [ - 58, - 122, - 80 - ], - "children": [ - { - "name": "Area OP3 (POperc) - left hemisphere", - "rgb": [ - 58, - 122, - 80 - ], - "labelIndex": 75, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -40814044, - -13737321, - 17669701 - ] - }, - { - "name": "Area OP3 (POperc) - right hemisphere", - "rgb": [ - 58, - 122, - 80 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 75, - "children": [], - "status": "publicP", - "position": [ - 41195980, - -11633166, - 18002513 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "f6f10b01-6c10-42cf-8129-f5aaf307a36b" - } - }, - "relatedAreas": [] - }, - { - "name": "Area OP4 (POperc)", - "arealabel": "Area-OP4", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/BVT0-H3U", - "synonyms": [], - "rgb": [ - 89, - 80, - 132 - ], - "children": [ - { - "name": "Area OP4 (POperc) - left hemisphere", - "rgb": [ - 89, - 80, - 132 - ], - "labelIndex": 72, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -60514139, - -10849614, - 15368038 - ] - }, - { - "name": "Area OP4 (POperc) - right hemisphere", - "rgb": [ - 89, - 80, - 132 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 72, - "children": [], - "status": "publicP", - "position": [ - 63398148, - -9211111, - 12780864 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "b1e7f0d2-6d37-4047-9c2e-a08c3f1e2a16" - } - }, - "relatedAreas": [] - }, - { - "name": "Area OP2 (POperc)", - "arealabel": "Area-OP2", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/5KBV-36J", - "synonyms": [], - "rgb": [ - 36, - 47, - 221 - ], - "children": [ - { - "name": "Area OP2 (POperc) - left hemisphere", - "rgb": [ - 36, - 47, - 221 - ], - "labelIndex": 74, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -36355372, - -23452479, - 18938017 - ] - }, - { - "name": "Area OP2 (POperc) - right hemisphere", - "rgb": [ - 36, - 47, - 221 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 74, - "children": [], - "status": "publicP", - "position": [ - 35629457, - -21159690, - 18021705 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "ab26cefd-f7d6-4442-8020-a6e418e673ff" - } - }, - "relatedAreas": [] - }, - { - "name": "Area OP1 (POperc)", - "arealabel": "Area-OP1", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/SH37-979", - "synonyms": [], - "rgb": [ - 250, - 182, - 34 - ], - "children": [ - { - "name": "Area OP1 (POperc) - left hemisphere", - "rgb": [ - 250, - 182, - 34 - ], - "labelIndex": 73, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -51566527, - -22523828, - 17190240 - ] - }, - { - "name": "Area OP1 (POperc) - right hemisphere", - "rgb": [ - 250, - 182, - 34 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 73, - "children": [], - "status": "publicP", - "position": [ - 52888430, - -20697107, - 17000826 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "402ec28d-0809-4226-91a4-900d9303291b" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "postcentral gyrus", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area 3b (PostCG)", - "arealabel": "Area-3b", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/2JK3-QXR", - "synonyms": [], - "relatedAreas": [ - { - "name": "Area 3b", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "74304fe9-452e-4ca3-97a3-8cf3459bb1a0" - } - } - } - ], - "rgb": [ - 239, - 246, - 155 - ], - "children": [ - { - "name": "Area 3b (PostCG) - left hemisphere", - "rgb": [ - 239, - 246, - 155 - ], - "labelIndex": 127, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -44439219, - -21735041, - 46012387 - ] - }, - { - "name": "Area 3b (PostCG) - right hemisphere", - "rgb": [ - 239, - 246, - 155 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 127, - "children": [], - "status": "publicP", - "position": [ - 38765839, - -25096118, - 48227174 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "b84f67bb-5d9f-4daf-a8d6-15f63f901bd4" - } - } - }, - { - "name": "Area 1 (PostCG)", - "arealabel": "Area-1", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/THB5-B64", - "synonyms": [], - "rgb": [ - 232, - 185, - 250 - ], - "children": [ - { - "name": "Area 1 (PostCG) - left hemisphere", - "rgb": [ - 232, - 185, - 250 - ], - "labelIndex": 125, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -47104485, - -28297920, - 57798046 - ] - }, - { - "name": "Area 1 (PostCG) - right hemisphere", - "rgb": [ - 232, - 185, - 250 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 125, - "children": [], - "status": "publicP", - "position": [ - 48452543, - -27132790, - 56150187 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "c9753e82-80ca-4074-a704-9dd2c4c0d58b" - } - }, - "relatedAreas": [] - }, - { - "name": "Area 2 (PostCS)", - "arealabel": "Area-2", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/QA8F-DD2", - "synonyms": [], - "rgb": [ - 23, - 13, - 35 - ], - "children": [ - { - "name": "Area 2 (PostCS) - left hemisphere", - "rgb": [ - 23, - 13, - 35 - ], - "labelIndex": 252, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -42268059, - -32424512, - 51210202 - ] - }, - { - "name": "Area 2 (PostCS) - right hemisphere", - "rgb": [ - 23, - 13, - 35 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 252, - "children": [], - "status": "publicP", - "position": [ - 38223619, - -34651627, - 52535010 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "f9147ae9-5cf0-41b2-89a3-e6e6df07bef1" - } - }, - "relatedAreas": [] - }, - { - "name": "Area 3a (PostCG)", - "arealabel": "Area-3a", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/C5QQ-EFB", - "synonyms": [], - "rgb": [ - 187, - 133, - 50 - ], - "children": [ - { - "name": "Area 3a (PostCG) - left hemisphere", - "rgb": [ - 187, - 133, - 50 - ], - "labelIndex": 126, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -31927553, - -25650901, - 44513889 - ] - }, - { - "name": "Area 3a (PostCG) - right hemisphere", - "rgb": [ - 187, - 133, - 50 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 126, - "children": [], - "status": "publicP", - "position": [ - 38813714, - -19184000, - 36284571 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "2657ecc1-da69-4a37-9b37-66ae95f9623c" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "inferior parietal lobule", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area PF (IPL)", - "arealabel": "Area-PF", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/F1TJ-54W", - "synonyms": [], - "relatedAreas": [ - { - "name": "Area PF", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "f4e177a6-1b2c-48d5-a62c-91949ba636e4" - } - } - } - ], - "rgb": [ - 226, - 211, - 61 - ], - "children": [ - { - "name": "Area PF (IPL) - left hemisphere", - "rgb": [ - 226, - 211, - 61 - ], - "labelIndex": 206, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -59814938, - -37432365, - 36569295 - ] - }, - { - "name": "Area PF (IPL) - right hemisphere", - "rgb": [ - 226, - 211, - 61 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 206, - "children": [], - "status": "publicP", - "position": [ - 64016699, - -33052700, - 30153112 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "18e5e1b0-6c25-4f55-a967-0834d2bd3ee4" - } - } - }, - { - "name": "Area PFcm (IPL)", - "arealabel": "Area-PFcm", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/8DP8-8HE", - "synonyms": [], - "relatedAreas": [ - { - "name": "Area PFcm", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "f07d441f-452f-471b-ac7c-0d3c2ae16fb2" - } - } - } - ], - "rgb": [ - 98, - 128, - 120 - ], - "children": [ - { - "name": "Area PFcm (IPL) - left hemisphere", - "rgb": [ - 98, - 128, - 120 - ], - "labelIndex": 113, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -51751410, - -36954069, - 22546334 - ] - }, - { - "name": "Area PFcm (IPL) - right hemisphere", - "rgb": [ - 98, - 128, - 120 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 113, - "children": [], - "status": "publicP", - "position": [ - 53524370, - -31637287, - 23177904 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "10502c3a-f20e-44fa-b985-786d6888d4bb" - } - } - }, - { - "name": "Area PGa (IPL)", - "arealabel": "Area-PGa", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/V5HY-XTS", - "synonyms": [], - "relatedAreas": [ - { - "name": "Area PGa", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "d5b168a3-a92e-4ab3-8b4d-61e58e5b7a1c" - } - } - } - ], - "rgb": [ - 42, - 236, - 131 - ], - "children": [ - { - "name": "Area PGa (IPL) - left hemisphere", - "rgb": [ - 42, - 236, - 131 - ], - "labelIndex": 110, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -48873487, - -60780569, - 37191889 - ] - }, - { - "name": "Area PGa (IPL) - right hemisphere", - "rgb": [ - 42, - 236, - 131 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 110, - "children": [], - "status": "publicP", - "position": [ - 55283797, - -55333653, - 30316395 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "d7f6c5be-93c6-4a16-8939-4420329d4147" - } - } - }, - { - "name": "Area PFt (IPL)", - "arealabel": "Area-PFt", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/JGM9-ZET", - "synonyms": [], - "relatedAreas": [ - { - "name": "Area PFt", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "9ff7fcc4-a88b-4bf8-be07-1386a3760a96" - } - } - } - ], - "rgb": [ - 120, - 135, - 232 - ], - "children": [ - { - "name": "Area PFt (IPL) - left hemisphere", - "rgb": [ - 120, - 135, - 232 - ], - "labelIndex": 109, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -55015237, - -27583919, - 38095874 - ] - }, - { - "name": "Area PFt (IPL) - right hemisphere", - "rgb": [ - 120, - 135, - 232 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 109, - "children": [], - "status": "publicP", - "position": [ - 54808632, - -24626296, - 37973570 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "847cef50-7340-470d-8580-327b4ce9db19" - } - } - }, - { - "name": "Area PFm (IPL)", - "arealabel": "Area-PFm", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/TB94-HRK", - "synonyms": [], - "relatedAreas": [ - { - "name": "Area PFm", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "3455ada4-48c3-4748-ae38-2fe3f376f0fc" - } - } - } - ], - "rgb": [ - 53, - 76, - 145 - ], - "children": [ - { - "name": "Area PFm (IPL) - left hemisphere", - "rgb": [ - 53, - 76, - 145 - ], - "labelIndex": 112, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -54527689, - -52389045, - 38877207 - ] - }, - { - "name": "Area PFm (IPL) - right hemisphere", - "rgb": [ - 53, - 76, - 145 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 112, - "children": [], - "status": "publicP", - "position": [ - 56990022, - -45541717, - 38606571 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "411edde9-685f-464b-970c-a929f9a4067c" - } - } - }, - { - "name": "Area PGp (IPL)", - "arealabel": "Area-PGp", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/FPFJ-ZCD", - "synonyms": [], - "rgb": [ - 92, - 116, - 83 - ], - "children": [ - { - "name": "Area PGp (IPL) - left hemisphere", - "rgb": [ - 92, - 116, - 83 - ], - "labelIndex": 108, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -44673441, - -73269937, - 29840224 - ] - }, - { - "name": "Area PGp (IPL) - right hemisphere", - "rgb": [ - 92, - 116, - 83 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 108, - "children": [], - "status": "publicP", - "position": [ - 47749459, - -70528695, - 30721440 - ] - } - ], - "relatedAreas": [ - { - "name": "Area PGp", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "1b00a0e4-9493-43ff-bfbd-b02119064813" - } - } - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "b3ef6947-76c9-4935-bbc6-8b2329c0967b" - } - } - }, - { - "name": "Area PFop (IPL)", - "arealabel": "Area-PFop", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/M2PM-92Q", - "synonyms": [], - "rgb": [ - 146, - 153, - 177 - ], - "children": [ - { - "name": "Area PFop (IPL) - left hemisphere", - "rgb": [ - 146, - 153, - 177 - ], - "labelIndex": 111, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -60026462, - -24694986, - 24259053 - ] - }, - { - "name": "Area PFop (IPL) - right hemisphere", - "rgb": [ - 146, - 153, - 177 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 111, - "children": [], - "status": "publicP", - "position": [ - 58286575, - -20617534, - 24917260 - ] - } - ], - "relatedAreas": [ - { - "name": "Area PFop", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "b4397c40-82e1-4d62-b97a-44e8d04b428b" - } - } - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "e8262e56-88fe-4006-b078-def4d78416b8" - } - } - } - ] - }, - { - "name": "parieto-occipital sulcus", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area hPO1 (POS)", - "arealabel": "Area-hPO1", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/W50A-FAP", - "synonyms": [], - "rgb": [ - 153, - 232, - 235 - ], - "children": [ - { - "name": "Area hPO1 (POS) - left hemisphere", - "rgb": [ - 153, - 232, - 235 - ], - "labelIndex": 297, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -15069260, - -80661951, - 37074565 - ] - }, - { - "name": "Area hPO1 (POS) - right hemisphere", - "rgb": [ - 153, - 232, - 235 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 297, - "children": [], - "status": "publicP", - "position": [ - 21853147, - -80927739, - 37048660 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "a78998c2-99d4-4738-bbda-82a317f713f1" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "intraparietal sulcus", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area hIP1 (IPS)", - "arealabel": "Area-hIP1", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/92FE-7S6", - "synonyms": [], - "rgb": [ - 66, - 149, - 82 - ], - "children": [ - { - "name": "Area hIP1 (IPS) - left hemisphere", - "rgb": [ - 66, - 149, - 82 - ], - "labelIndex": 128, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -36841999, - -49449871, - 40584028 - ] - }, - { - "name": "Area hIP1 (IPS) - right hemisphere", - "rgb": [ - 66, - 149, - 82 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 128, - "children": [], - "status": "publicP", - "position": [ - 40629988, - -48019372, - 39158853 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "7722c71f-fe84-4deb-8f6b-98e2aecf2e31" - } - }, - "relatedAreas": [] - }, - { - "name": "Area hIP7 (IPS)", - "arealabel": "Area-hIP7", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/WRCY-8Z1", - "synonyms": [], - "rgb": [ - 71, - 196, - 218 - ], - "children": [ - { - "name": "Area hIP7 (IPS) - left hemisphere", - "rgb": [ - 71, - 196, - 218 - ], - "labelIndex": 296, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -22044741, - -79989011, - 29353218 - ] - }, - { - "name": "Area hIP7 (IPS) - right hemisphere", - "rgb": [ - 71, - 196, - 218 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 296, - "children": [], - "status": "publicP", - "position": [ - 29041586, - -79117828, - 27046207 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "9c6c3c96-8129-4e0e-aa22-a0fb435aab45" - } - }, - "relatedAreas": [] - }, - { - "name": "Area hIP3 (IPS)", - "arealabel": "Area-hIP3", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/P8X0-V1G", - "synonyms": [], - "rgb": [ - 113, - 172, - 229 - ], - "children": [ - { - "name": "Area hIP3 (IPS) - left hemisphere", - "rgb": [ - 113, - 172, - 229 - ], - "labelIndex": 133, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -30430769, - -55031164, - 46842209 - ] - }, - { - "name": "Area hIP3 (IPS) - right hemisphere", - "rgb": [ - 113, - 172, - 229 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 133, - "children": [], - "status": "publicP", - "position": [ - 33538679, - -49884591, - 50461950 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "700ac6db-870d-44f1-8786-0c01207f992b" - } - }, - "relatedAreas": [] - }, - { - "name": "Area hIP2 (IPS)", - "arealabel": "Area-hIP2", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/EJTM-NDY", - "synonyms": [], - "rgb": [ - 127, - 245, - 203 - ], - "children": [ - { - "name": "Area hIP2 (IPS) - left hemisphere", - "rgb": [ - 127, - 245, - 203 - ], - "labelIndex": 129, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -46531100, - -41482722, - 43278044 - ] - }, - { - "name": "Area hIP2 (IPS) - right hemisphere", - "rgb": [ - 127, - 245, - 203 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 129, - "children": [], - "status": "publicP", - "position": [ - 44605145, - -39958613, - 45130872 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "4490ef3e-ce60-4453-9e9f-85388d0603cb" - } - }, - "relatedAreas": [] - }, - { - "name": "Area hIP4 (IPS)", - "arealabel": "Area-hIP4", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/TSEN-QSY", - "synonyms": [], - "rgb": [ - 254, - 52, - 184 - ], - "children": [ - { - "name": "Area hIP4 (IPS) - left hemisphere", - "rgb": [ - 254, - 52, - 184 - ], - "labelIndex": 294, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -29349066, - -79948651, - 25849585 - ] - }, - { - "name": "Area hIP4 (IPS) - right hemisphere", - "rgb": [ - 254, - 52, - 184 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 294, - "children": [], - "status": "publicP", - "position": [ - 37324927, - -76495150, - 22338021 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "5875bfe2-99ca-4e50-bce2-61c201c3dd54" - } - }, - "relatedAreas": [] - }, - { - "name": "Area hIP5 (IPS)", - "arealabel": "Area-hIP5", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/RNSM-Y4Y", - "synonyms": [], - "rgb": [ - 217, - 87, - 210 - ], - "children": [ - { - "name": "Area hIP5 (IPS) - left hemisphere", - "rgb": [ - 217, - 87, - 210 - ], - "labelIndex": 295, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -28321120, - -73162807, - 36664362 - ] - }, - { - "name": "Area hIP5 (IPS) - right hemisphere", - "rgb": [ - 217, - 87, - 210 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 295, - "children": [], - "status": "publicP", - "position": [ - 34614713, - -68930590, - 33299252 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "f9717dec-0310-4078-a4ae-294170b4fb37" - } - }, - "relatedAreas": [] - }, - { - "name": "Area hIP6 (IPS)", - "arealabel": "Area-hIP6", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/AFQR-50Q", - "synonyms": [], - "rgb": [ - 237, - 233, - 37 - ], - "children": [ - { - "name": "Area hIP6 (IPS) - left hemisphere", - "rgb": [ - 237, - 233, - 37 - ], - "labelIndex": 292, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -31988131, - -66522626, - 46155045 - ] - }, - { - "name": "Area hIP6 (IPS) - right hemisphere", - "rgb": [ - 237, - 233, - 37 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 292, - "children": [], - "status": "publicP", - "position": [ - 37069307, - -63723479, - 45628006 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "b9975f8e-f484-4e82-883a-5fd765855ae0" - } - }, - "relatedAreas": [] - }, - { - "name": "Area hIP8 (IPS)", - "arealabel": "Area-hIP8", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/YYT8-FT8", - "synonyms": [], - "rgb": [ - 223, - 109, - 3 - ], - "children": [ - { - "name": "Area hIP8 (IPS) - left hemisphere", - "rgb": [ - 223, - 109, - 3 - ], - "labelIndex": 293, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -18133307, - -72231198, - 43245125 - ] - }, - { - "name": "Area hIP8 (IPS) - right hemisphere", - "rgb": [ - 223, - 109, - 3 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 293, - "children": [], - "status": "publicP", - "position": [ - 26220986, - -71480127, - 41680048 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "a2c1acc7-7fdc-4fbd-90ee-729eda7fdff3" - } - }, - "relatedAreas": [] - } - ] - } - ] - }, - { - "name": "occiptal lobe", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "dorsal occipital cortex", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area hOc6 (POS)", - "arealabel": "Area-hOc6", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/4101-1ZG", - "synonyms": [], - "rgb": [ - 239, - 66, - 26 - ], - "children": [ - { - "name": "Area hOc6 (POS) - left hemisphere", - "rgb": [ - 239, - 66, - 26 - ], - "labelIndex": 291, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -15925775, - -70685971, - 16518760 - ] - }, - { - "name": "Area hOc6 (POS) - right hemisphere", - "rgb": [ - 239, - 66, - 26 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 291, - "children": [], - "status": "publicP", - "position": [ - 17750454, - -67625227, - 17755898 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "d72e0210-a910-4b15-bcaf-80c3433cd3e0" - } - }, - "relatedAreas": [] - }, - { - "name": "Area hOc4d (Cuneus)", - "arealabel": "Area-hOc4d", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/VSK5-DET", - "synonyms": [], - "rgb": [ - 109, - 218, - 10 - ], - "children": [ - { - "name": "Area hOc4d (Cuneus) - left hemisphere", - "rgb": [ - 109, - 218, - 10 - ], - "labelIndex": 119, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -17209585, - -87846006, - 25522684 - ] - }, - { - "name": "Area hOc4d (Cuneus) - right hemisphere", - "rgb": [ - 109, - 218, - 10 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 119, - "children": [], - "status": "publicP", - "position": [ - 20232373, - -87193644, - 27253227 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "8120426c-f65b-4426-8a58-3060e2334921" - } - }, - "relatedAreas": [] - }, - { - "name": "Area hOc3d (Cuneus)", - "arealabel": "Area-hOc3d", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/F9X3-JVJ", - "synonyms": [], - "rgb": [ - 105, - 191, - 48 - ], - "children": [ - { - "name": "Area hOc3d (Cuneus) - left hemisphere", - "rgb": [ - 105, - 191, - 48 - ], - "labelIndex": 120, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -12816505, - -91289984, - 21840872 - ] - }, - { - "name": "Area hOc3d (Cuneus) - right hemisphere", - "rgb": [ - 105, - 191, - 48 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 120, - "children": [], - "status": "publicP", - "position": [ - 16129503, - -88897084, - 23080617 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "d7ec4342-ae58-41e3-a68c-28e90a719d41" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "ventral occipital cortex", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area hOc3v (LingG)", - "arealabel": "Area-hOc3v", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/E5E8-1VV", - "synonyms": [], - "rgb": [ - 83, - 179, - 155 - ], - "children": [ - { - "name": "Area hOc3v (LingG) - left hemisphere", - "rgb": [ - 83, - 179, - 155 - ], - "labelIndex": 10, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -18685863, - -85629087, - -10106719 - ] - }, - { - "name": "Area hOc3v (LingG) - right hemisphere", - "rgb": [ - 83, - 179, - 155 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 10, - "children": [], - "status": "publicP", - "position": [ - 24296060, - -81686611, - -10031193 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "0d6392fd-b905-4bc3-bac9-fc44d8990a30" - } - }, - "relatedAreas": [] - }, - { - "name": "Area hOc4v (LingG)", - "arealabel": "Area-hOc4v", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/AASR-M8P", - "synonyms": [], - "rgb": [ - 222, - 77, - 155 - ], - "children": [ - { - "name": "Area hOc4v (LingG) - left hemisphere", - "rgb": [ - 222, - 77, - 155 - ], - "labelIndex": 9, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -26315808, - -78419533, - -12497238 - ] - }, - { - "name": "Area hOc4v (LingG) - right hemisphere", - "rgb": [ - 222, - 77, - 155 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 9, - "children": [], - "status": "publicP", - "position": [ - 32665897, - -76519832, - -12453305 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "27d91cbb-5611-4d38-bd17-c0f1ac22b4cc" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "occipital cortex", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area hOc2 (V2, 18)", - "arealabel": "Area-hOc2", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/QG9C-THD", - "synonyms": [], - "rgb": [ - 84, - 110, - 22 - ], - "children": [ - { - "name": "Area hOc2 (V2, 18) - left hemisphere", - "rgb": [ - 84, - 110, - 22 - ], - "labelIndex": 7, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -10521334, - -88185706, - 4055081 - ] - }, - { - "name": "Area hOc2 (V2, 18) - right hemisphere", - "rgb": [ - 84, - 110, - 22 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 7, - "children": [], - "status": "publicP", - "position": [ - 15409559, - -86163484, - 2905309 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "04674a3c-bb3a-495e-a466-206355e630bd" - } - }, - "relatedAreas": [] - }, - { - "name": "Area hOc1 (V1, 17, CalcS)", - "arealabel": "Area-hOc1", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/MXJ6-6DH", - "synonyms": [], - "rgb": [ - 190, - 132, - 147 - ], - "children": [ - { - "name": "Area hOc1 (V1, 17, CalcS) - left hemisphere", - "rgb": [ - 190, - 132, - 147 - ], - "labelIndex": 8, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -8533787, - -84646549, - 1855106 - ] - }, - { - "name": "Area hOc1 (V1, 17, CalcS) - right hemisphere", - "rgb": [ - 190, - 132, - 147 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 8, - "children": [], - "status": "publicP", - "position": [ - 14654595, - -81416396, - 1637838 - ] - } - ], - "relatedAreas": [ - { - "name": "Area hOc1", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "b851eb9d-9502-45e9-8dd8-2861f0e6da3f" - } - } - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "5151ab8f-d8cb-4e67-a449-afe2a41fb007" - } - } - } - ] - }, - { - "name": "lateral occipital cortex", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area hOc4lp (LOC)", - "arealabel": "Area-hOc4lp", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/4B87-Q8X", - "synonyms": [], - "rgb": [ - 96, - 113, - 253 - ], - "children": [ - { - "name": "Area hOc4lp (LOC) - left hemisphere", - "rgb": [ - 96, - 113, - 253 - ], - "labelIndex": 117, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -34066943, - -88725728, - 6360721 - ] - }, - { - "name": "Area hOc4lp (LOC) - right hemisphere", - "rgb": [ - 96, - 113, - 253 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 117, - "children": [], - "status": "publicP", - "position": [ - 38538256, - -86375516, - 4086228 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "9006ee6a-6dc1-4604-9f20-7e08b42d574d" - } - }, - "relatedAreas": [] - }, - { - "name": "Area hOc5 (LOC)", - "arealabel": "Area-hOc5", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/2WSH-MCT", - "synonyms": [], - "rgb": [ - 255, - 0, - 0 - ], - "children": [ - { - "name": "Area hOc5 (LOC) - left hemisphere", - "rgb": [ - 255, - 0, - 0 - ], - "labelIndex": 6, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -42484324, - -71486486, - 1795676 - ] - }, - { - "name": "Area hOc5 (LOC) - right hemisphere", - "rgb": [ - 255, - 0, - 0 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 6, - "children": [], - "status": "publicP", - "position": [ - 48090700, - -66172216, - 3121699 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "b40afb5a-e6a1-47b6-8a3e-1f8a20fbf99a" - } - }, - "relatedAreas": [] - }, - { - "name": "Area hOc4la (LOC)", - "arealabel": "Area-hOc4la", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/Z9JX-WKB", - "synonyms": [], - "rgb": [ - 233, - 168, - 189 - ], - "children": [ - { - "name": "Area hOc4la (LOC) - left hemisphere", - "rgb": [ - 233, - 168, - 189 - ], - "labelIndex": 118, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -46291484, - -76947955, - -372761 - ] - }, - { - "name": "Area hOc4la (LOC) - right hemisphere", - "rgb": [ - 233, - 168, - 189 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 118, - "children": [], - "status": "publicP", - "position": [ - 48566255, - -73862041, - -779202 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "94365b82-6204-4937-8b86-fe0433287938" - } - }, - "relatedAreas": [] - } - ] - } - ] - }, - { - "name": "frontal lobe", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "inferior frontal gyrus", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area 44 (IFG)", - "arealabel": "Area-44", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/F9P8-ZVW", - "synonyms": [], - "relatedAreas": [ - { - "name": "Area 44v", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "7e5e7aa8-28b8-445b-8980-2a6f3fa645b3" - } - } - }, - { - "name": "Area 44d", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "8aeae833-81c8-4e27-a8d6-deee339d6052" - } - } - } - ], - "rgb": [ - 54, - 74, - 75 - ], - "children": [ - { - "name": "Area 44 (IFG) - left hemisphere", - "rgb": [ - 54, - 74, - 75 - ], - "labelIndex": 2, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -54242820, - 11425127, - 18292735 - ] - }, - { - "name": "Area 44 (IFG) - right hemisphere", - "rgb": [ - 54, - 74, - 75 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 2, - "children": [], - "status": "publicP", - "position": [ - 56359074, - 11741030, - 13444358 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "8a6be82c-5947-4fff-8348-cf9bf73e4f40" - } - } - }, - { - "name": "Area 45 (IFG)", - "arealabel": "Area-45", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/MR1V-BJ3", - "synonyms": [], - "relatedAreas": [ - { - "name": "Area 45", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "131e6de8-b073-4f01-8f60-1bdb5a6c9a9a" - } - } - } - ], - "rgb": [ - 167, - 103, - 146 - ], - "children": [ - { - "name": "Area 45 (IFG) - left hemisphere", - "rgb": [ - 167, - 103, - 146 - ], - "labelIndex": 1, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -54903012, - 26558233, - 15528514 - ] - }, - { - "name": "Area 45 (IFG) - right hemisphere", - "rgb": [ - 167, - 103, - 146 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 1, - "children": [], - "status": "publicP", - "position": [ - 55787613, - 26216770, - 12102941 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "cb32e688-43f0-4ae3-9554-085973137663" - } - } - } - ] - }, - { - "name": "dorsal precentral gyrus", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area 6d2 (PreCG)", - "arealabel": "Area-6d2", - "status": "publicDOI", - "labelIndex": null, - "doi": "https://doi.org/10.25493/KXHS-N90", - "synonyms": [], - "rgb": [ - 170, - 151, - 180 - ], - "children": [ - { - "name": "Area 6d2 (PreCG) - left hemisphere", - "rgb": [ - 170, - 151, - 180 - ], - "labelIndex": 288, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -15757793, - 2030353, - 68024610 - ] - }, - { - "name": "Area 6d2 (PreCG) - right hemisphere", - "rgb": [ - 170, - 151, - 180 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 288, - "children": [], - "status": "publicDOI", - "position": [ - 14562976, - 2312675, - 68442439 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "963c5281-67df-4d41-9b91-60b31cf150c0" - } - }, - "relatedAreas": [] - }, - { - "name": "Area 6d1 (PreCG)", - "arealabel": "Area-6d1", - "status": "publicDOI", - "labelIndex": null, - "doi": "https://doi.org/10.25493/4WSQ-8FM", - "synonyms": [], - "rgb": [ - 45, - 33, - 27 - ], - "children": [ - { - "name": "Area 6d1 (PreCG) - left hemisphere", - "rgb": [ - 45, - 33, - 27 - ], - "labelIndex": 287, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -20332759, - -14746524, - 68590141 - ] - }, - { - "name": "Area 6d1 (PreCG) - right hemisphere", - "rgb": [ - 45, - 33, - 27 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 287, - "children": [], - "status": "publicDOI", - "position": [ - 20258981, - -16559656, - 68870890 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "a802f3dc-b7e5-48b7-9845-832a6e6f9b1c" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "posterior medial superior frontal gyrus", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area 6ma (preSMA, mesial SFG)", - "arealabel": "Area-6ma", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/WVNR-SPT", - "synonyms": [], - "rgb": [ - 204, - 108, - 222 - ], - "children": [ - { - "name": "Area 6ma (preSMA, mesial SFG) - left hemisphere", - "rgb": [ - 204, - 108, - 222 - ], - "labelIndex": 299, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -4083913, - 4296092, - 58555023 - ] - }, - { - "name": "Area 6ma (preSMA, mesial SFG) - right hemisphere", - "rgb": [ - 204, - 108, - 222 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 299, - "children": [], - "status": "publicP", - "position": [ - 5230140, - 4042128, - 58355079 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "07b4c6a1-8a24-4f88-8f73-b2ea06e1c2f3" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "superior frontal sulcus", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area 6d3 (SFS)", - "arealabel": "Area-6d3", - "status": "publicDOI", - "labelIndex": null, - "doi": "https://doi.org/10.25493/NVJ5-JJ", - "synonyms": [], - "rgb": [ - 55, - 239, - 21 - ], - "children": [ - { - "name": "Area 6d3 (SFS) - left hemisphere", - "rgb": [ - 55, - 239, - 21 - ], - "labelIndex": 289, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -23315931, - 4317151, - 51434008 - ] - }, - { - "name": "Area 6d3 (SFS) - right hemisphere", - "rgb": [ - 55, - 239, - 21 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 289, - "children": [], - "status": "publicDOI", - "position": [ - 25173639, - 1578188, - 53334281 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "266c1ada-1840-462f-8223-7ff2df457552" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "frontal pole", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area Fp1 (FPole)", - "arealabel": "Area-Fp1", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/PTKW-R7W", - "synonyms": [], - "rgb": [ - 226, - 14, - 200 - ], - "children": [ - { - "name": "Area Fp1 (FPole) - left hemisphere", - "rgb": [ - 226, - 14, - 200 - ], - "labelIndex": 212, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -16331031, - 64168302, - 549101 - ] - }, - { - "name": "Area Fp1 (FPole) - right hemisphere", - "rgb": [ - 226, - 14, - 200 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 212, - "children": [], - "status": "publicP", - "position": [ - 18482225, - 63988011, - -317043 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "10dc5343-941b-4e3e-80ed-df031c33bbc6" - } - }, - "relatedAreas": [] - }, - { - "name": "Area Fp2 (FPole)", - "arealabel": "Area-Fp2", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/GZW1-7R3", - "synonyms": [], - "rgb": [ - 239, - 137, - 211 - ], - "children": [ - { - "name": "Area Fp2 (FPole) - left hemisphere", - "rgb": [ - 239, - 137, - 211 - ], - "labelIndex": 211, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -3739067, - 59074587, - -1181973 - ] - }, - { - "name": "Area Fp2 (FPole) - right hemisphere", - "rgb": [ - 239, - 137, - 211 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 211, - "children": [], - "status": "publicP", - "position": [ - 6093420, - 59611191, - -509606 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "3bf7bde1-cc06-4657-b296-380275f9d4b8" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "precentral gyrus ", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area 4p (PreCG)", - "arealabel": "Area-4p", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/5HSF-81J", - "synonyms": [], - "relatedAreas": [ - { - "name": "Area 4p", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "861ab96a-c4b5-4ba6-bd40-1e80d4680f89" - } - } - } - ], - "rgb": [ - 116, - 92, - 124 - ], - "children": [ - { - "name": "Area 4p (PreCG) - left hemisphere", - "rgb": [ - 116, - 92, - 124 - ], - "labelIndex": 123, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -36140917, - -22750424, - 49282965 - ] - }, - { - "name": "Area 4p (PreCG) - right hemisphere", - "rgb": [ - 116, - 92, - 124 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 123, - "children": [], - "status": "publicP", - "position": [ - 37510795, - -21359659, - 46456250 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "82e6e826-a439-41db-84ff-4674ca3d643a" - } - } - }, - { - "name": "Area 4a (PreCG)", - "arealabel": "Area-4a", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/PVPP-P3Q", - "synonyms": [], - "rgb": [ - 118, - 239, - 183 - ], - "children": [ - { - "name": "Area 4a (PreCG) - left hemisphere", - "rgb": [ - 118, - 239, - 183 - ], - "labelIndex": 124, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -17367391, - -28669064, - 67404682 - ] - }, - { - "name": "Area 4a (PreCG) - right hemisphere", - "rgb": [ - 118, - 239, - 183 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 124, - "children": [], - "status": "publicP", - "position": [ - 9609157, - -31334779, - 68068112 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "175848ff-4c55-47e3-a0ae-f905a14e03cd" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "mesial precentral gyrus", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area 6mp (SMA, mesial SFG)", - "arealabel": "Area-6mp", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/2E1T-47F", - "synonyms": [], - "rgb": [ - 75, - 95, - 87 - ], - "children": [ - { - "name": "Area 6mp (SMA, mesial SFG) - left hemisphere", - "rgb": [ - 75, - 95, - 87 - ], - "labelIndex": 298, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -4094374, - -14286751, - 59329220 - ] - }, - { - "name": "Area 6mp (SMA, mesial SFG) - right hemisphere", - "rgb": [ - 75, - 95, - 87 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 298, - "children": [], - "status": "publicP", - "position": [ - 4949202, - -13788668, - 57534028 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "def99e8e-ce8f-4a62-bd5d-739948c4b010" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "medial orbitofrontal cortex", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area Fo1 (OFC)", - "arealabel": "Area-Fo1", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/H2N2-6J2", - "synonyms": [], - "rgb": [ - 7, - 255, - 179 - ], - "children": [ - { - "name": "Area Fo1 (OFC) - left hemisphere", - "rgb": [ - 7, - 255, - 179 - ], - "labelIndex": 3, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -7962771, - 41364968, - -22537687 - ] - }, - { - "name": "Area Fo1 (OFC) - right hemisphere", - "rgb": [ - 7, - 255, - 179 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 3, - "children": [], - "status": "publicP", - "position": [ - 9705948, - 40760961, - -22481988 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "3864cb8c-f277-4de6-9f8d-c76d71d7e9a9" - } - }, - "relatedAreas": [] - }, - { - "name": "Area Fo3 (OFC)", - "arealabel": "Area-Fo3", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/E1YQ-65U", - "synonyms": [], - "rgb": [ - 182, - 189, - 250 - ], - "children": [ - { - "name": "Area Fo3 (OFC) - left hemisphere", - "rgb": [ - 182, - 189, - 250 - ], - "labelIndex": 5, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -21866985, - 33732378, - -19882472 - ] - }, - { - "name": "Area Fo3 (OFC) - right hemisphere", - "rgb": [ - 182, - 189, - 250 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 5, - "children": [], - "status": "publicP", - "position": [ - 22929678, - 33527877, - -20231493 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "741f6a9e-cfd7-4173-ac7d-ee616c29555e" - } - }, - "relatedAreas": [] - }, - { - "name": "Area Fo2 (OFC)", - "arealabel": "Area-Fo2", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/3JB9-2V2", - "synonyms": [], - "rgb": [ - 0, - 255, - 0 - ], - "children": [ - { - "name": "Area Fo2 (OFC) - left hemisphere", - "rgb": [ - 0, - 255, - 0 - ], - "labelIndex": 4, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -8588272, - 22532156, - -20474464 - ] - }, - { - "name": "Area Fo2 (OFC) - right hemisphere", - "rgb": [ - 0, - 255, - 0 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 4, - "children": [], - "status": "publicP", - "position": [ - 9164379, - 21928964, - -20593342 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "30a04d2b-58e1-43d7-8b8f-1f0b598382d0" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "frontal operculum ", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area OP8 (Frontal Operculum)", - "arealabel": "Area-OP8", - "status": "publicDOI", - "labelIndex": null, - "doi": "https://doi.org/10.25493/NGF8-TA4", - "synonyms": [], - "rgb": [ - 29, - 76, - 168 - ], - "children": [ - { - "name": "Area OP8 (Frontal Operculum) - left hemisphere", - "rgb": [ - 29, - 76, - 168 - ], - "labelIndex": 273, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -41777921, - 17183344, - 7912847 - ] - }, - { - "name": "Area OP8 (Frontal Operculum) - right hemisphere", - "rgb": [ - 29, - 76, - 168 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 273, - "children": [], - "status": "publicDOI", - "position": [ - 42725111, - 16774146, - 7832095 - ] - } - ] - }, - { - "name": "Area OP9 (Frontal Operculum)", - "arealabel": "Area-OP9", - "status": "publicDOI", - "labelIndex": null, - "doi": "https://doi.org/10.25493/3A30-5E4", - "synonyms": [], - "rgb": [ - 175, - 123, - 34 - ], - "children": [ - { - "name": "Area OP9 (Frontal Operculum) - left hemisphere", - "rgb": [ - 175, - 123, - 34 - ], - "labelIndex": 274, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -45090542, - 25998787, - 5597413 - ] - }, - { - "name": "Area OP9 (Frontal Operculum) - right hemisphere", - "rgb": [ - 175, - 123, - 34 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 274, - "children": [], - "status": "publicDOI", - "position": [ - 44374928, - 26272467, - 2966228 - ] - } - ] - } - ] - }, - { - "name": "lateral orbitofrontal cortex", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area Fo5 (OFC)", - "arealabel": "Area-Fo5", - "status": "publicDOI", - "labelIndex": null, - "doi": "https://doi.org/10.25493/HJMY-ZZP", - "synonyms": [], - "rgb": [ - 219, - 11, - 91 - ], - "children": [ - { - "name": "Area Fo5 (OFC) - left hemisphere", - "rgb": [ - 219, - 11, - 91 - ], - "labelIndex": 325, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -38055351, - 56315867, - -8720295 - ] - }, - { - "name": "Area Fo5 (OFC) - right hemisphere", - "rgb": [ - 219, - 11, - 91 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 325, - "children": [], - "status": "publicDOI", - "position": [ - 40545983, - 54504228, - -4983615 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "3fd2e113-ec08-407b-bc88-172c9285694a" - } - }, - "relatedAreas": [] - }, - { - "name": "Area Fo4 (OFC)", - "arealabel": "Area-Fo4", - "status": "publicDOI", - "labelIndex": null, - "doi": "https://doi.org/10.25493/29G0-66F", - "synonyms": [], - "rgb": [ - 163, - 204, - 53 - ], - "children": [ - { - "name": "Area Fo4 (OFC) - left hemisphere", - "rgb": [ - 163, - 204, - 53 - ], - "labelIndex": 324, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -27573653, - 52998204, - -14510778 - ] - }, - { - "name": "Area Fo4 (OFC) - right hemisphere", - "rgb": [ - 163, - 204, - 53 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 324, - "children": [], - "status": "publicDOI", - "position": [ - 33636124, - 52034755, - -15509742 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "2cdee956-207a-4d4d-b051-bef80045210b" - } - }, - "relatedAreas": [] - }, - { - "name": "Area Fo6 (OFC)", - "arealabel": "Area-Fo6", - "status": "publicDOI", - "labelIndex": null, - "doi": "https://doi.org/10.25493/34Q4-H62", - "synonyms": [], - "rgb": [ - 199, - 156, - 187 - ], - "children": [ - { - "name": "Area Fo6 (OFC) - left hemisphere", - "rgb": [ - 199, - 156, - 187 - ], - "labelIndex": 326, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -44272971, - 42876258, - -12938967 - ] - }, - { - "name": "Area Fo6 (OFC) - right hemisphere", - "rgb": [ - 199, - 156, - 187 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 326, - "children": [], - "status": "publicDOI", - "position": [ - 48891176, - 40513824, - -12457353 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "330ae178-557c-4bd0-a932-f138c0a05345" - } - }, - "relatedAreas": [] - }, - { - "name": "Area Fo7 (OFC)", - "arealabel": "Area-Fo7", - "status": "publicDOI", - "labelIndex": null, - "doi": "https://doi.org/10.25493/3WEV-561", - "synonyms": [], - "rgb": [ - 64, - 211, - 186 - ], - "children": [ - { - "name": "Area Fo7 (OFC) - left hemisphere", - "rgb": [ - 64, - 211, - 186 - ], - "labelIndex": 327, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -36046240, - 37308943, - -11666667 - ] - }, - { - "name": "Area Fo7 (OFC) - right hemisphere", - "rgb": [ - 64, - 211, - 186 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 327, - "children": [], - "status": "publicDOI", - "position": [ - 37850755, - 37700302, - -13777644 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "1b882148-fcdd-4dbe-b33d-659957840e9e" - } - }, - "relatedAreas": [] - } - ] - } - ] - }, - { - "name": "insula", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "granular insula", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area Ig1 (Insula)", - "arealabel": "Area-Ig1", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/EKV9-29D", - "synonyms": [], - "rgb": [ - 18, - 111, - 40 - ], - "children": [ - { - "name": "Area Ig1 (Insula) - left hemisphere", - "rgb": [ - 18, - 111, - 40 - ], - "labelIndex": 115, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -33211215, - -24171963, - 9923364 - ] - }, - { - "name": "Area Ig1 (Insula) - right hemisphere", - "rgb": [ - 18, - 111, - 40 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 115, - "children": [], - "status": "publicP", - "position": [ - 33707983, - -23338235, - 9071429 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "46cf08af-8086-4e8a-9e9f-182ca583bdf0" - } - }, - "relatedAreas": [] - }, - { - "name": "Area Ig3 (Insula)", - "arealabel": "Area-Ig3", - "status": "publicDOI", - "labelIndex": null, - "doi": "", - "synonyms": [], - "rgb": [ - 105, - 253, - 197 - ], - "children": [ - { - "name": "Area Ig3 (Insula) - left hemisphere", - "rgb": [ - 105, - 253, - 197 - ], - "labelIndex": 336, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -37956284, - -14423497, - 13513661 - ] - }, - { - "name": "Area Ig3 (Insula) - right hemisphere", - "rgb": [ - 105, - 253, - 197 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 336, - "children": [], - "status": "publicDOI", - "position": [ - 38219144, - -13750630, - 13916877 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "10dba769-4f6c-40f9-8ffd-e0cce71c5adb" - } - }, - "relatedAreas": [] - }, - { - "name": "Area Ig2 (Insula)", - "arealabel": "Area-Ig2", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/662G-E0W", - "synonyms": [], - "rgb": [ - 105, - 61, - 82 - ], - "children": [ - { - "name": "Area Ig2 (Insula) - left hemisphere", - "rgb": [ - 105, - 61, - 82 - ], - "labelIndex": 114, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -37117338, - -17859895, - 5094571 - ] - }, - { - "name": "Area Ig2 (Insula) - right hemisphere", - "rgb": [ - 105, - 61, - 82 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 114, - "children": [], - "status": "publicP", - "position": [ - 37843632, - -16445145, - 5703657 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "49092952-1eef-4b89-b8bf-1bf1f25f149a" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "agranular insula", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area Ia (Insula)", - "arealabel": "Area-Ia", - "status": "publicDOI", - "labelIndex": null, - "doi": "https://doi.org/10.25493/WW8G-T2G", - "synonyms": [], - "rgb": [ - 71, - 217, - 62 - ], - "children": [ - { - "name": "Area Ia (Insula) - left hemisphere", - "rgb": [ - 71, - 217, - 62 - ], - "labelIndex": 339, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -41612827, - -1876485, - -7019002 - ] - }, - { - "name": "Area Ia (Insula) - right hemisphere", - "rgb": [ - 71, - 217, - 62 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 339, - "children": [], - "status": "publicDOI", - "position": [ - 43525000, - 36538, - -7609615 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "110d0d7b-cb88-48ea-9caf-863f548dbe38" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "dys-/agranular insula", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area Id7 (Insula)", - "arealabel": "Area-Id7", - "status": "publicDOI", - "labelIndex": null, - "doi": "https://doi.org/10.25493/88QG-JMS", - "synonyms": [], - "rgb": [ - 101, - 202, - 38 - ], - "children": [ - { - "name": "Area Id7 (Insula) - left hemisphere", - "rgb": [ - 101, - 202, - 38 - ], - "labelIndex": 159, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -30926962, - 23741297, - 4787031 - ] - }, - { - "name": "Area Id7 (Insula) - right hemisphere", - "rgb": [ - 101, - 202, - 38 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 159, - "children": [], - "status": "publicDOI", - "position": [ - 35034429, - 24873239, - 2446009 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "3d5729f5-55c6-412a-8fc1-41a95c71b13a" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "dysgranular insula", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area Id2 (Insula)", - "arealabel": "Area-Id2", - "status": "publicDOI", - "labelIndex": null, - "doi": "", - "synonyms": [], - "rgb": [ - 225, - 126, - 73 - ], - "children": [ - { - "name": "Area Id2 (Insula) - left hemisphere", - "rgb": [ - 225, - 126, - 73 - ], - "labelIndex": 56, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -41933981, - -11436893, - 4091262 - ] - }, - { - "name": "Area Id2 (Insula) - right hemisphere", - "rgb": [ - 225, - 126, - 73 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 56, - "children": [], - "status": "publicDOI", - "position": [ - 44043478, - -10289855, - 3759834 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "cf9dea67-649d-4034-ae57-ec389f339277" - } - }, - "relatedAreas": [] - }, - { - "name": "Area Id1 (Insula)", - "arealabel": "Area-Id1", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/F37H-8WB", - "synonyms": [], - "rgb": [ - 141, - 112, - 216 - ], - "children": [ - { - "name": "Area Id1 (Insula) - left hemisphere", - "rgb": [ - 141, - 112, - 216 - ], - "labelIndex": 116, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -40090747, - -18279359, - -4567616 - ] - }, - { - "name": "Area Id1 (Insula) - right hemisphere", - "rgb": [ - 141, - 112, - 216 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 116, - "children": [], - "status": "publicP", - "position": [ - 40527825, - -17443508, - -4688027 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "c22055c1-514f-4096-906b-abf57286053b" - } - }, - "relatedAreas": [] - }, - { - "name": "Area Id3 (Insula)", - "arealabel": "Area-Id3", - "status": "publicDOI", - "labelIndex": null, - "doi": "", - "synonyms": [], - "rgb": [ - 32, - 32, - 58 - ], - "children": [ - { - "name": "Area Id3 (Insula) - left hemisphere", - "rgb": [ - 32, - 32, - 58 - ], - "labelIndex": 57, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -40414195, - -7819915, - -8263771 - ] - }, - { - "name": "Area Id3 (Insula) - right hemisphere", - "rgb": [ - 32, - 32, - 58 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 57, - "children": [], - "status": "publicDOI", - "position": [ - 41459316, - -6224335, - -9042586 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "3dcfcfc2-035c-4785-a820-a671f2104ac3" - } - }, - "relatedAreas": [] - }, - { - "name": "Area Id5 (Insula)", - "arealabel": "Area-Id5", - "status": "publicDOI", - "labelIndex": null, - "doi": "https://doi.org/10.25493/5CK1-B1G", - "synonyms": [], - "rgb": [ - 112, - 6, - 50 - ], - "children": [ - { - "name": "Area Id5 (Insula) - left hemisphere", - "rgb": [ - 112, - 6, - 50 - ], - "labelIndex": 338, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -40174302, - -3354190, - 741899 - ] - }, - { - "name": "Area Id5 (Insula) - right hemisphere", - "rgb": [ - 112, - 6, - 50 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 338, - "children": [], - "status": "publicDOI", - "position": [ - 41094953, - -2659538, - 607357 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "e03cd3c6-d0be-481c-b906-9b39c1d0b641" - } - }, - "relatedAreas": [] - }, - { - "name": "Area Id6 (Insula)", - "arealabel": "Area-Id6", - "status": "publicDOI", - "labelIndex": null, - "doi": "https://doi.org/10.25493/54HZ-KFQ", - "synonyms": [], - "rgb": [ - 138, - 127, - 119 - ], - "children": [ - { - "name": "Area Id6 (Insula) - left hemisphere", - "rgb": [ - 138, - 127, - 119 - ], - "labelIndex": 340, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -36392282, - 9843698, - 3385341 - ] - }, - { - "name": "Area Id6 (Insula) - right hemisphere", - "rgb": [ - 138, - 127, - 119 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 340, - "children": [], - "status": "publicDOI", - "position": [ - 37750946, - 10762642, - 3041624 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "31bbe92d-e5e8-4cf4-be5d-e6b12c71a107" - } - }, - "relatedAreas": [] - }, - { - "name": "Area Id4 (Insula)", - "arealabel": "Area-Id4", - "status": "publicDOI", - "labelIndex": null, - "doi": "https://doi.org/10.25493/K63G-89H", - "synonyms": [], - "rgb": [ - 38, - 174, - 113 - ], - "children": [ - { - "name": "Area Id4 (Insula) - left hemisphere", - "rgb": [ - 38, - 174, - 113 - ], - "labelIndex": 337, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -37055965, - -3505155, - 11422680 - ] - }, - { - "name": "Area Id4 (Insula) - right hemisphere", - "rgb": [ - 38, - 174, - 113 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 337, - "children": [], - "status": "publicDOI", - "position": [ - 37461444, - -3746634, - 10858017 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "f480ed72-5ca5-4d1f-8905-cbe9bedcfaee" - } - }, - "relatedAreas": [] - } - ] - } - ] - }, - { - "name": "temporal lobe", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "superior temporal sulcus", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area STS2 (STS)", - "arealabel": "Area-STS2", - "status": "publicDOI", - "labelIndex": null, - "doi": "https://doi.org/10.25493/KHY9-J3Y", - "synonyms": [], - "rgb": [ - 62, - 117, - 123 - ], - "children": [ - { - "name": "Area STS2 (STS) - left hemisphere", - "rgb": [ - 62, - 117, - 123 - ], - "labelIndex": 272, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -56352486, - -8557380, - -14844672 - ] - }, - { - "name": "Area STS2 (STS) - right hemisphere", - "rgb": [ - 62, - 117, - 123 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 272, - "children": [], - "status": "publicDOI", - "position": [ - 56942990, - -8020716, - -16067930 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "278fc30f-2e24-4046-856b-95dfaf561635" - } - }, - "relatedAreas": [] - }, - { - "name": "Area STS1 (STS)", - "arealabel": "Area-STS1", - "status": "publicDOI", - "labelIndex": null, - "doi": "https://doi.org/10.25493/F6DF-H8P", - "synonyms": [], - "rgb": [ - 205, - 228, - 4 - ], - "children": [ - { - "name": "Area STS1 (STS) - left hemisphere", - "rgb": [ - 205, - 228, - 4 - ], - "labelIndex": 271, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicDOI", - "position": [ - -54514755, - -16753913, - -5260713 - ] - }, - { - "name": "Area STS1 (STS) - right hemisphere", - "rgb": [ - 205, - 228, - 4 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 271, - "children": [], - "status": "publicDOI", - "position": [ - 54536567, - -17992636, - -5712544 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "68784b66-ff15-4b09-b28a-a2146c0f8907" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "superior temporal gyrus", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area TE 3 (STG)", - "arealabel": "Area-TE-3", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/BN5J-JT8", - "synonyms": [], - "rgb": [ - 159, - 104, - 108 - ], - "children": [ - { - "name": "Area TE 3 (STG) - left hemisphere", - "rgb": [ - 159, - 104, - 108 - ], - "labelIndex": 31, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -64398501, - -12497885, - 1316801 - ] - }, - { - "name": "Area TE 3 (STG) - right hemisphere", - "rgb": [ - 159, - 104, - 108 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 31, - "children": [], - "status": "publicP", - "position": [ - 65811519, - -9018989, - -1027621 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "7e1a3291-efdc-4ca6-a3d0-6c496c34639f" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "Heschl's gyrus", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area TE 1.2 (HESCHL)", - "arealabel": "Area-TE-1.2", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/R382-617", - "synonyms": [], - "rgb": [ - 202, - 251, - 192 - ], - "children": [ - { - "name": "Area TE 1.2 (HESCHL) - left hemisphere", - "rgb": [ - 202, - 251, - 192 - ], - "labelIndex": 30, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -50810427, - -6551343, - 1635071 - ] - }, - { - "name": "Area TE 1.2 (HESCHL) - right hemisphere", - "rgb": [ - 202, - 251, - 192 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 30, - "children": [], - "status": "publicP", - "position": [ - 55870330, - -2672527, - 52747 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "677cd48c-70fa-4bbd-9f0a-ffdc7744bc0f" - } - }, - "relatedAreas": [] - }, - { - "name": "Area TE 1.1 (HESCHL)", - "arealabel": "Area-TE-1.1", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/4HA3-BBE", - "synonyms": [], - "rgb": [ - 8, - 113, - 68 - ], - "children": [ - { - "name": "Area TE 1.1 (HESCHL) - left hemisphere", - "rgb": [ - 8, - 113, - 68 - ], - "labelIndex": 33, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -38219760, - -27125577, - 10774700 - ] - }, - { - "name": "Area TE 1.1 (HESCHL) - right hemisphere", - "rgb": [ - 8, - 113, - 68 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 33, - "children": [], - "status": "publicP", - "position": [ - 40719340, - -24106132, - 10308962 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "e2969911-77eb-4b21-af70-216cab5285b1" - } - }, - "relatedAreas": [] - }, - { - "name": "Area TE 1.0 (HESCHL)", - "arealabel": "Area-TE-1.0", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/MV3G-RET", - "synonyms": [], - "relatedAreas": [ - { - "name": "Area Te1", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "f424643e-9baf-4c50-9417-db1ac33dcd3e" - } - } - } - ], - "rgb": [ - 252, - 84, - 222 - ], - "children": [ - { - "name": "Area TE 1.0 (HESCHL) - left hemisphere", - "rgb": [ - 252, - 84, - 222 - ], - "labelIndex": 27, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -46560150, - -17508772, - 7622807 - ] - }, - { - "name": "Area TE 1.0 (HESCHL) - right hemisphere", - "rgb": [ - 252, - 84, - 222 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 27, - "children": [], - "status": "publicP", - "position": [ - 50392116, - -12932573, - 5942946 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "13e21153-2ba8-4212-b172-8894f1012225" - } - } - } - ] - }, - { - "name": "fusiform gyrus", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area FG2 (FusG)", - "arealabel": "Area-FG2", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/F2JH-KVV", - "synonyms": [], - "relatedAreas": [ - { - "name": "Area FG2", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "8f436328-4251-4706-ae38-767e1ab21c6f" - } - } - } - ], - "rgb": [ - 67, - 94, - 149 - ], - "children": [ - { - "name": "Area FG2 (FusG) - left hemisphere", - "rgb": [ - 67, - 94, - 149 - ], - "labelIndex": 106, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -43549584, - -65531770, - -16708135 - ] - }, - { - "name": "Area FG2 (FusG) - right hemisphere", - "rgb": [ - 67, - 94, - 149 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 106, - "children": [], - "status": "publicP", - "position": [ - 44839825, - -63606518, - -17316773 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "6e7a0441-4baa-4355-921b-50d23d07d50f" - } - } - }, - { - "name": "Area FG3 (FusG)", - "arealabel": "Area-FG3", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/Z0F6-0SY", - "synonyms": [], - "rgb": [ - 120, - 147, - 37 - ], - "children": [ - { - "name": "Area FG3 (FusG) - left hemisphere", - "rgb": [ - 120, - 147, - 37 - ], - "labelIndex": 239, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -29844935, - -45368421, - -14184493 - ] - }, - { - "name": "Area FG3 (FusG) - right hemisphere", - "rgb": [ - 120, - 147, - 37 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 239, - "children": [], - "status": "publicP", - "position": [ - 31148061, - -44485336, - -15533822 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "023f8ef7-c266-4c45-8bf2-4a17dc52985b" - } - }, - "relatedAreas": [] - }, - { - "name": "Area FG1 (FusG)", - "arealabel": "Area-FG1", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/5ZVQ-R8R", - "synonyms": [], - "rgb": [ - 131, - 183, - 58 - ], - "children": [ - { - "name": "Area FG1 (FusG) - left hemisphere", - "rgb": [ - 131, - 183, - 58 - ], - "labelIndex": 107, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -29006116, - -66264526, - -12290010 - ] - }, - { - "name": "Area FG1 (FusG) - right hemisphere", - "rgb": [ - 131, - 183, - 58 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 107, - "children": [], - "status": "publicP", - "position": [ - 32840456, - -64340456, - -12612536 - ] - } - ], - "relatedAreas": [ - { - "name": "Area FG1", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "6318e160-4ad2-4eec-8a2e-2df6fe07d8f4" - } - } - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "39fb34a8-fd6d-4fba-898c-2f6167e40459" - } - } - }, - { - "name": "Area FG4 (FusG)", - "arealabel": "Area-FG4", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/13RG-FYV", - "synonyms": [], - "relatedAreas": [ - { - "name": "Area FG2", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "8f436328-4251-4706-ae38-767e1ab21c6f" - } - } - } - ], - "rgb": [ - 170, - 220, - 175 - ], - "children": [ - { - "name": "Area FG4 (FusG) - left hemisphere", - "rgb": [ - 170, - 220, - 175 - ], - "labelIndex": 238, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -43204016, - -44325167, - -20016734 - ] - }, - { - "name": "Area FG4 (FusG) - right hemisphere", - "rgb": [ - 170, - 220, - 175 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 238, - "children": [], - "status": "publicP", - "position": [ - 43609694, - -43478025, - -22392295 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "fa602743-5f6e-49d1-9734-29dffaa95ff5" - } - } - } - ] - } - ] - }, - { - "name": "limbic lobe", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "cingulate gyrus, frontal part", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Area p24c (pACC)", - "arealabel": "Area-p24c", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/QA7B-JM9", - "synonyms": [], - "rgb": [ - 241, - 164, - 195 - ], - "children": [ - { - "name": "Area p24c (pACC) - left hemisphere", - "rgb": [ - 241, - 164, - 195 - ], - "labelIndex": 232, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -8144989, - 41168443, - 14314854 - ] - }, - { - "name": "Area p24c (pACC) - right hemisphere", - "rgb": [ - 241, - 164, - 195 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 232, - "children": [], - "status": "publicP", - "position": [ - 9856593, - 40780558, - 12002406 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "e6507a3d-f2f8-4c17-84ff-0e7297e836a0" - } - }, - "relatedAreas": [] - }, - { - "name": "Area 25 (sACC)", - "arealabel": "Area-25", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/51AM-WN4", - "synonyms": [], - "rgb": [ - 170, - 68, - 220 - ], - "children": [ - { - "name": "Area 25 (sACC) - left hemisphere", - "rgb": [ - 170, - 68, - 220 - ], - "labelIndex": 184, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -3522692, - 13560250, - -11860720 - ] - }, - { - "name": "Area 25 (sACC) - right hemisphere", - "rgb": [ - 170, - 68, - 220 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 184, - "children": [], - "status": "publicP", - "position": [ - 4564663, - 12954463, - -12174863 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "9010ef76-accd-4308-9951-f37b6a10f42b" - } - }, - "relatedAreas": [] - }, - { - "name": "Area p24ab (pACC)", - "arealabel": "Area-p24ab", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/DHXC-2KN", - "synonyms": [], - "rgb": [ - 153, - 195, - 229 - ], - "children": [ - { - "name": "Area p24ab (pACC) - left hemisphere", - "rgb": [ - 153, - 195, - 229 - ], - "labelIndex": 231, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -2244059, - 38783168, - 6389109 - ] - }, - { - "name": "Area p24ab (pACC) - right hemisphere", - "rgb": [ - 153, - 195, - 229 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 231, - "children": [], - "status": "publicP", - "position": [ - 3429274, - 38385609, - 7809963 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "5dbb1035-487c-4f43-b551-ccadcf058340" - } - }, - "relatedAreas": [] - }, - { - "name": "Area s32 (sACC)", - "arealabel": "Area-s32", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/XTRR-172", - "synonyms": [], - "rgb": [ - 193, - 94, - 250 - ], - "children": [ - { - "name": "Area s32 (sACC) - left hemisphere", - "rgb": [ - 193, - 94, - 250 - ], - "labelIndex": 46, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -6738110, - 35256183, - -11765377 - ] - }, - { - "name": "Area s32 (sACC) - right hemisphere", - "rgb": [ - 193, - 94, - 250 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 46, - "children": [], - "status": "publicP", - "position": [ - 4307795, - 34460360, - -12141905 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "61b44255-ae3a-4a23-b1bc-7d303a48dbd3" - } - }, - "relatedAreas": [] - }, - { - "name": "Area 33 (ACC)", - "arealabel": "Area-33", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/X9QP-C6F", - "synonyms": [], - "rgb": [ - 51, - 57, - 245 - ], - "children": [ - { - "name": "Area 33 (ACC) - left hemisphere", - "rgb": [ - 51, - 57, - 245 - ], - "labelIndex": 39, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -4861218, - 14163048, - 15911877 - ] - }, - { - "name": "Area 33 (ACC) - right hemisphere", - "rgb": [ - 51, - 57, - 245 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 39, - "children": [], - "status": "publicP", - "position": [ - 5087045, - 15562321, - 16125051 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "b83a3330-b80e-42a0-b8d2-82f38784aa1d" - } - }, - "relatedAreas": [] - }, - { - "name": "Area p32 (pACC)", - "arealabel": "Area-p32", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/3JX0-7E5", - "synonyms": [], - "rgb": [ - 87, - 135, - 14 - ], - "children": [ - { - "name": "Area p32 (pACC) - left hemisphere", - "rgb": [ - 87, - 135, - 14 - ], - "labelIndex": 47, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -6122937, - 49256108, - 11929896 - ] - }, - { - "name": "Area p32 (pACC) - right hemisphere", - "rgb": [ - 87, - 135, - 14 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 47, - "children": [], - "status": "publicP", - "position": [ - 7759613, - 48520792, - 12436058 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "b09aaa77-f41b-4008-b8b9-f984b0417cf3" - } - }, - "relatedAreas": [] - }, - { - "name": "Area s24 (sACC)", - "arealabel": "Area-s24", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/HXWM-NRX", - "synonyms": [], - "rgb": [ - 133, - 34, - 201 - ], - "children": [ - { - "name": "Area s24 (sACC) - left hemisphere", - "rgb": [ - 133, - 34, - 201 - ], - "labelIndex": 183, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -3247887, - 24596479, - -9615493 - ] - }, - { - "name": "Area s24 (sACC) - right hemisphere", - "rgb": [ - 133, - 34, - 201 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 183, - "children": [], - "status": "publicP", - "position": [ - 3259899, - 23813535, - -9257019 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "d4ea6cc5-1e1d-4212-966f-81fed01eb648" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "hippocampal formation", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "HATA (Hippocampus)", - "arealabel": "HATA", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/M1XP-VSQ", - "synonyms": [], - "rgb": [ - 137, - 12, - 73 - ], - "children": [ - { - "name": "HATA (Hippocampus) - left hemisphere", - "rgb": [ - 137, - 12, - 73 - ], - "labelIndex": 68, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -13947917, - -9576389, - -18975694 - ] - }, - { - "name": "HATA (Hippocampus) - right hemisphere", - "rgb": [ - 137, - 12, - 73 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 68, - "children": [], - "status": "publicP", - "position": [ - 15080586, - -8358974, - -17871795 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "9ec4a423-70fa-43cd-90b3-fbc26a3cbc6c" - } - }, - "relatedAreas": [] - }, - { - "name": "Entorhinal Cortex", - "arealabel": "Entorhinal-Cortex", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/KNXY-B1Z", - "synonyms": [], - "rgb": [ - 35, - 159, - 214 - ], - "children": [ - { - "name": "Entorhinal Cortex - left hemisphere", - "rgb": [ - 35, - 159, - 214 - ], - "labelIndex": 60, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -20926052, - -6082765, - -33357509 - ] - }, - { - "name": "Entorhinal Cortex - right hemisphere", - "rgb": [ - 35, - 159, - 214 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 60, - "children": [], - "status": "publicP", - "position": [ - 22877203, - -3501469, - -32577556 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "030827d4-e0d1-4406-b71f-3f58dc2f9cca" - } - }, - "relatedAreas": [] - }, - { - "name": "CA (Hippocampus)", - "arealabel": "CA", - "status": "publicP", - "labelIndex": null, - "relatedAreas": [ - { - "name": "CA1 (Hippocampus)", - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "bfc0beb7-310c-4c57-b810-2adc464bd02c" - } - } - } - ], - "doi": "https://doi.org/10.25493/B85T-D88", - "synonyms": [], - "rgb": [ - 250, - 191, - 217 - ], - "children": [ - { - "name": "CA (Hippocampus) - left hemisphere", - "rgb": [ - 250, - 191, - 217 - ], - "labelIndex": 191, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -27476326, - -26068931, - -11082817 - ] - }, - { - "name": "CA (Hippocampus) - right hemisphere", - "rgb": [ - 250, - 191, - 217 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 191, - "children": [], - "status": "publicP", - "position": [ - 29426785, - -24801145, - -11142814 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "a0d14d3e-bc30-41cf-8b28-540067897f80" - } - } - }, - { - "name": "DG (Hippocampus)", - "arealabel": "DG", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/M8JP-XQT", - "synonyms": [], - "rgb": [ - 149, - 55, - 120 - ], - "children": [ - { - "name": "DG (Hippocampus) - left hemisphere", - "rgb": [ - 149, - 55, - 120 - ], - "labelIndex": 61, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -26946498, - -26708171, - -9589494 - ] - }, - { - "name": "DG (Hippocampus) - right hemisphere", - "rgb": [ - 149, - 55, - 120 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 61, - "children": [], - "status": "publicP", - "position": [ - 28316456, - -24674684, - -10596203 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "0bea7e03-bfb2-4907-9d45-db9071ce627d" - } - }, - "relatedAreas": [] - }, - { - "name": "Subiculum (Hippocampus)", - "arealabel": "Subiculum", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/QKJH-F45", - "synonyms": [], - "rgb": [ - 111, - 125, - 219 - ], - "children": [ - { - "name": "Subiculum (Hippocampus) - left hemisphere", - "rgb": [ - 111, - 125, - 219 - ], - "labelIndex": 192, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -20352171, - -24057796, - -16326997 - ] - }, - { - "name": "Subiculum (Hippocampus) - right hemisphere", - "rgb": [ - 111, - 125, - 219 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 192, - "children": [], - "status": "publicP", - "position": [ - 22543982, - -23195614, - -15923499 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "7e2dab4c-a140-440d-a322-c1679adef2d4" - } - }, - "relatedAreas": [] - } - ] - } - ] - } - ] - } - ] - }, - { - "name": "metencephalon", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "cerebellum", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "cerebellar nuclei", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "globose nucleus", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Interposed Nucleus (Cerebellum)", - "arealabel": "Interposed-Nucleus", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/8PTB-JDH", - "synonyms": [], - "rgb": [ - 170, - 29, - 10 - ], - "children": [ - { - "name": "Interposed Nucleus (Cerebellum) - left hemisphere", - "rgb": [ - 170, - 29, - 10 - ], - "labelIndex": 251, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -8457921, - -55262376, - -30235149 - ] - }, - { - "name": "Interposed Nucleus (Cerebellum) - right hemisphere", - "rgb": [ - 170, - 29, - 10 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 251, - "children": [], - "status": "publicP", - "position": [ - 7917989, - -54201058, - -31489418 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "85e7bb13-4b73-4f6f-8222-3adb7b800788" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "dentate nucleus", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Dorsal Dentate Nucleus (Cerebellum)", - "arealabel": "Dorsal-Dentate-Nucleus", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/M5QG-SHH", - "synonyms": [], - "rgb": [ - 89, - 201, - 99 - ], - "children": [ - { - "name": "Dorsal Dentate Nucleus (Cerebellum) - left hemisphere", - "rgb": [ - 89, - 201, - 99 - ], - "labelIndex": 240, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -16612782, - -56036341, - -36064536 - ] - }, - { - "name": "Dorsal Dentate Nucleus (Cerebellum) - right hemisphere", - "rgb": [ - 89, - 201, - 99 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 240, - "children": [], - "status": "publicP", - "position": [ - 15388967, - -58303395, - -36586280 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "58095aef-da69-43d4-887c-009c095cecce" - } - }, - "relatedAreas": [] - }, - { - "name": "Ventral Dentate Nucleus (Cerebellum)", - "arealabel": "Ventral-Dentate-Nucleus", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/FQE5-5QR", - "synonyms": [], - "rgb": [ - 39, - 129, - 9 - ], - "children": [ - { - "name": "Ventral Dentate Nucleus (Cerebellum) - left hemisphere", - "rgb": [ - 39, - 129, - 9 - ], - "labelIndex": 241, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -13112867, - -56176072, - -29957111 - ] - }, - { - "name": "Ventral Dentate Nucleus (Cerebellum) - right hemisphere", - "rgb": [ - 39, - 129, - 9 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 241, - "children": [], - "status": "publicP", - "position": [ - 12107011, - -55974170, - -31385609 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "57282342-5a75-4e07-bcdc-2d368c517b71" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "fastigial nucleus", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Fastigial Nucleus (Cerebellum)", - "arealabel": "Fastigial-Nucleus", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/3YJ9-S6G", - "synonyms": [], - "rgb": [ - 200, - 100, - 10 - ], - "children": [ - { - "name": "Fastigial Nucleus (Cerebellum) - left hemisphere", - "rgb": [ - 200, - 100, - 10 - ], - "labelIndex": 219, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -3828877, - -53149733, - -29013369 - ] - }, - { - "name": "Fastigial Nucleus (Cerebellum) - right hemisphere", - "rgb": [ - 200, - 100, - 10 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 219, - "children": [], - "status": "publicP", - "position": [ - 3011287, - -53069977, - -29040632 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "e8abfe3d-8b64-45c2-8853-314d82873273" - } - }, - "relatedAreas": [] - } - ] - }, - { - "name": "emboliform nucleus", - "status": null, - "labelIndex": null, - "synonyms": [], - "rgb": null, - "children": [ - { - "name": "Interposed Nucleus (Cerebellum)", - "arealabel": "Interposed-Nucleus", - "status": "publicP", - "labelIndex": null, - "doi": "https://doi.org/10.25493/8PTB-JDH", - "synonyms": [], - "rgb": [ - 170, - 29, - 10 - ], - "children": [ - { - "name": "Interposed Nucleus (Cerebellum) - left hemisphere", - "rgb": [ - 170, - 29, - 10 - ], - "labelIndex": 251, - "ngId": "jubrain colin v18 left", - "children": [], - "status": "publicP", - "position": [ - -8457921, - -55262376, - -30235149 - ] - }, - { - "name": "Interposed Nucleus (Cerebellum) - right hemisphere", - "rgb": [ - 170, - 29, - 10 - ], - "ngId": "jubrain colin v18 right", - "labelIndex": 251, - "children": [], - "status": "publicP", - "position": [ - 7917989, - -54201058, - -31489418 - ] - } - ], - "fullId": { - "kg": { - "kgSchema": "minds/core/parcellationregion/v1.0.0", - "kgId": "85e7bb13-4b73-4f6f-8222-3adb7b800788" - } - }, - "relatedAreas": [] - } - ] - } - ] - } - ] - } - ] - } - ] -} diff --git a/src/api/service.ts b/src/api/service.ts index 89a5f262a..e2604e432 100644 --- a/src/api/service.ts +++ b/src/api/service.ts @@ -1,9 +1,10 @@ import { Inject, Injectable, Optional } from "@angular/core"; import { select, Store } from "@ngrx/store"; import { Subject } from "rxjs"; -import { distinctUntilChanged, filter, map, take } from "rxjs/operators"; -import { SAPI, SapiAtlasModel, SapiParcellationModel, SapiRegionModel, SapiSpaceModel, OpenMINDSCoordinatePoint } from "src/atlasComponents/sapi"; -import { SxplrCoordinatePointExtension } from "src/atlasComponents/sapi/type"; +import { distinctUntilChanged, filter, map, switchMap, take } from "rxjs/operators"; +import { SAPI } from "src/atlasComponents/sapi"; +import { SxplrAtlas, SxplrParcellation, SxplrRegion, SxplrTemplate, Point } from "src/atlasComponents/sapi/type_sxplr"; +import { SxplrCoordinatePointExtension } from "src/atlasComponents/sapi/type_v3"; import { MainState, atlasSelection, userInteraction, annotation, atlasAppearance } from "src/state" import { ClickInterceptor, CLICK_INTERCEPTOR_INJECTOR } from "src/util"; import { CANCELLABLE_DIALOG, CANCELLABLE_DIALOG_OPTS } from "src/util/interfaces"; @@ -20,8 +21,8 @@ type AtId = { } type RequestUserTypes = { - region: SapiRegionModel - point: OpenMINDSCoordinatePoint + region: SxplrRegion + point: Point confirm: void input: string } @@ -38,15 +39,15 @@ type RequestUser<T extends keyof RequestUserTypes> = { export type ApiBoothEvents = { getAllAtlases: { request: null - response: SapiAtlasModel[] + response: SxplrAtlas[] } getSupportedTemplates: { request: null - response: SapiSpaceModel[] + response: SxplrTemplate[] } getSupportedParcellations: { request: null - response: SapiParcellationModel[] + response: SxplrParcellation[] } selectAtlas: { @@ -72,7 +73,7 @@ export type ApiBoothEvents = { type: 'region' | 'point' message: string } - response: SapiRegionModel | OpenMINDSCoordinatePoint + response: SxplrRegion | Point } addAnnotations: { @@ -135,11 +136,11 @@ export type HeartbeatEvents = { } export type BroadCastingApiEvents = { - atlasSelected: SapiAtlasModel - templateSelected: SapiSpaceModel - parcellationSelected: SapiParcellationModel - allRegions: SapiRegionModel[] - regionsSelected: SapiRegionModel[] + atlasSelected: SxplrAtlas + templateSelected: SxplrTemplate + parcellationSelected: SxplrParcellation + allRegions: SxplrRegion[] + regionsSelected: SxplrRegion[] navigation: MainState['[state.atlasSelection]']['navigation'] } @@ -187,7 +188,7 @@ export class ApiService implements BoothResponder<ApiBoothEvents>{ const { type } = this.requestUserQueue[0] if (type === "region") { - let moRegion: SapiRegionModel + let moRegion: SxplrRegion this.store.pipe( select(userInteraction.selectors.mousingOverRegions), filter(val => val.length > 0), @@ -201,7 +202,7 @@ export class ApiService implements BoothResponder<ApiBoothEvents>{ } if (type === "point") { - let point: OpenMINDSCoordinatePoint + let point: Point this.store.pipe( select(userInteraction.selectors.mousingOverPosition), take(1) @@ -302,8 +303,9 @@ export class ApiService implements BoothResponder<ApiBoothEvents>{ case 'getSupportedParcellations': { if (!event.id) return const parcs = await this.store.pipe( - atlasSelection.fromRootStore.allAvailParcs(this.sapi), - take(1) + select(atlasSelection.selectors.selectedAtlas), + switchMap(atlas => this.sapi.getAllParcellations(atlas)), + take(1), ).toPromise() return { id: event.id, @@ -314,7 +316,8 @@ export class ApiService implements BoothResponder<ApiBoothEvents>{ case 'getSupportedTemplates': { if (!event.id) return const spaces = await this.store.pipe( - atlasSelection.fromRootStore.allAvailSpaces(this.sapi), + select(atlasSelection.selectors.selectedAtlas), + switchMap(atlas => this.sapi.getAllSpaces(atlas)), take(1) ).toPromise() return { diff --git a/src/atlasComponents/sapi/core/base.ts b/src/atlasComponents/sapi/core/base.ts new file mode 100644 index 000000000..2fa7e1897 --- /dev/null +++ b/src/atlasComponents/sapi/core/base.ts @@ -0,0 +1,34 @@ +import { Observable } from "rxjs" +import { SAPI } from "../sapi.service" +import { RouteParam, SapiQueryPriorityArg } from "../type_v3" + +const AllFeatures = { + // Feature: "Feature", + CorticalProfile: "CorticalProfile", + // EbrainsDataFeature: "EbrainsDataFeature", + RegionalConnectivity: "RegionalConnectivity", + Tabular: "Tabular", + GeneExpressions: "GeneExpressions", + VolumeOfInterest: "VolumeOfInterest", +} as const + +type AF = keyof typeof AllFeatures + +export abstract class SAPIBase<T extends AF> { + + public abstract features$: Observable<string[]> + + constructor( + private _sapi: SAPI, + ){} + + getFeatures(featureType: T, param: RouteParam<`/feature/${T}`> & Partial<SapiQueryPriorityArg>) { + const route = `/feature/${featureType}` as `/feature/${T}` + return this._sapi.v3Get(route, param) + } + + getFeatureInstance(featureType: T, param: RouteParam<`/feature/${T}/{feature_id}`> & Partial<SapiQueryPriorityArg>) { + let route = `/feature/${featureType}/{feature_id}` as `/feature/${T}/{feature_id}` + return this._sapi.v3Get(route, param) + } +} diff --git a/src/atlasComponents/sapi/core/sapiParcellation.ts b/src/atlasComponents/sapi/core/sapiParcellation.ts index 085c5a82b..7d36e1202 100644 --- a/src/atlasComponents/sapi/core/sapiParcellation.ts +++ b/src/atlasComponents/sapi/core/sapiParcellation.ts @@ -1,73 +1,36 @@ -import { Observable } from "rxjs" +import { Observable, of } from "rxjs" import { switchMap } from "rxjs/operators" -import { SapiVolumeModel } from ".." import { SAPI } from "../sapi.service" -import {SapiParcellationFeatureModel, SapiParcellationModel, SapiQueryPriorityArg, SapiRegionModel} from "../type" +import { SapiParcellationModel, SapiQueryPriorityArg, SapiRegionModel, RouteParam } from "../type_v3" +import { SAPIBase } from "./base" -type PaginationQuery = { - size: number - page: number -} +/** + * All valid parcellation features + */ +const ParcellationFeatures = { + RegionalConnectivity: "RegionalConnectivity", +} as const -type ParcellationPaginationQuery = { - type?: string - size?: number - page: number -} +export type PF = keyof typeof ParcellationFeatures -export class SAPIParcellation{ +export class SAPIParcellation extends SAPIBase<PF>{ constructor(private sapi: SAPI, public atlasId: string, public id: string){ - + super(sapi) } getDetail(queryParam?: SapiQueryPriorityArg): Observable<SapiParcellationModel>{ - return SAPI.BsEndpoint$.pipe( - switchMap(endpt => this.sapi.httpGet<SapiParcellationModel>( - `${endpt}/atlases/${encodeURIComponent(this.atlasId)}/parcellations/${encodeURIComponent(this.id)}`, - null, - queryParam - )) - ) + return this.sapi.v3Get(`/parcellations/{parcellation_id}`, { + path: { + parcellation_id: this.id + }, + priority: queryParam?.priority + }) } - getRegions(spaceId: string, queryParam?: SapiQueryPriorityArg): Observable<SapiRegionModel[]> { - return SAPI.BsEndpoint$.pipe( - switchMap(endpt => this.sapi.httpGet<SapiRegionModel[]>( - `${endpt}/atlases/${encodeURIComponent(this.atlasId)}/parcellations/${encodeURIComponent(this.id)}/regions`, - { - space_id: spaceId - }, - queryParam - )) - ) - } - getVolumes(): Observable<SapiVolumeModel[]>{ - return SAPI.BsEndpoint$.pipe( - switchMap(endpt => this.sapi.httpGet<SapiVolumeModel[]>( - `${endpt}/atlases/${encodeURIComponent(this.atlasId)}/parcellations/${encodeURIComponent(this.id)}/volumes` - )) - ) + getLabelledMap(spaceId: string, queryParam?: SapiQueryPriorityArg) { + return this.sapi.getMap(this.id, spaceId, "LABELLED", queryParam) } - getFeatures(parcPagination?: ParcellationPaginationQuery, queryParam?: SapiQueryPriorityArg): Observable<SapiParcellationFeatureModel[]> { - return SAPI.BsEndpoint$.pipe( - switchMap(endpt => this.sapi.httpGet<SapiParcellationFeatureModel[]>( - `${endpt}/atlases/${encodeURIComponent(this.atlasId)}/parcellations/${encodeURIComponent(this.id)}/features`, - { - type: parcPagination?.type, - size: parcPagination?.size?.toString() || '5', - page: parcPagination?.page.toString() || '0', - }, - queryParam - )) - ) - } - - getFeatureInstance(instanceId: string): Observable<SapiParcellationFeatureModel> { - return SAPI.BsEndpoint$.pipe( - switchMap(endpt => this.sapi.http.get<SapiParcellationFeatureModel>( - `${endpt}/atlases/${encodeURIComponent(this.atlasId)}/parcellations/${encodeURIComponent(this.id)}/features/${encodeURIComponent(instanceId)}`, - )) - ) - } + static Features$ = of(Object.keys(ParcellationFeatures) as PF[]) + public features$ = SAPIParcellation.Features$ } diff --git a/src/atlasComponents/sapi/core/sapiRegion.ts b/src/atlasComponents/sapi/core/sapiRegion.ts index d9263cea0..a8fd531d9 100644 --- a/src/atlasComponents/sapi/core/sapiRegion.ts +++ b/src/atlasComponents/sapi/core/sapiRegion.ts @@ -1,22 +1,44 @@ import { SAPI } from ".."; -import { SapiRegionalFeatureModel, SapiRegionMapInfoModel, SapiRegionModel, cleanIeegSessionDatasets, SapiIeegSessionModel, CleanedIeegDataset, SapiVolumeModel, PaginatedResponse } from "../type"; +import { SapiRegionModel, RouteParam } from "../type_v3"; import { strToRgb, hexToRgb } from 'common/util' -import { merge, Observable, of } from "rxjs"; -import { catchError, map, scan, switchMap } from "rxjs/operators"; +import { NEVER, Observable, of } from "rxjs"; +import { map } from "rxjs/operators"; +import { SAPIBase } from "./base"; +import { SxplrRegion } from "../type_sxplr"; -export class SAPIRegion{ +/** + * All valid region features + */ +const RegionFeatures = { + // ReceptorDensityFingerprint: "ReceptorDensityFingerprint", + // GeneExpressions: "GeneExpressions", + // EbrainsDataFeature: "EbrainsDataFeature", + + // ReceptorDensityProfile: "ReceptorDensityProfile", + // BigBrainIntensityProfile: "BigBrainIntensityProfile", + // CellDensityProfile: "CellDensityProfile", + // LayerwiseBigBrainIntensities: "LayerwiseBigBrainIntensities", + // LayerwiseCellDensity: "LayerwiseCellDensity", + + Tabular: "Tabular", + CorticalProfile: "CorticalProfile", +} as const - static GetDisplayColor(region: SapiRegionModel): [number, number, number]{ +type RF = keyof typeof RegionFeatures + +export class SAPIRegion extends SAPIBase<RF>{ + + static GetDisplayColor(region: SxplrRegion): [number, number, number]{ if (!region) { throw new Error(`region must be provided!`) } - if (region.hasAnnotation?.displayColor) { - return hexToRgb(region.hasAnnotation.displayColor) - } - return strToRgb(JSON.stringify(region)) + return region.color + // if (region.hasAnnotation?.displayColor) { + // return hexToRgb(region.hasAnnotation.displayColor) + // } + // return strToRgb(JSON.stringify(region)) } - private prefix$: Observable<string> constructor( private sapi: SAPI, @@ -24,97 +46,81 @@ export class SAPIRegion{ public parcId: string, public id: string, ){ - this.prefix$ = SAPI.BsEndpoint$.pipe( - map(endpt => `${endpt}/atlases/${encodeURIComponent(this.atlasId)}/parcellations/${encodeURIComponent(this.parcId)}/regions/${encodeURIComponent(this.id)}`) - ) + super(sapi) } - getFeatures(spaceId: string): Observable<(SapiRegionalFeatureModel | CleanedIeegDataset)[]> { - return merge( - this.prefix$.pipe( - switchMap(prefix => - this.sapi.httpGet<SapiRegionalFeatureModel[]>( - `${prefix}/features`, - { - space_id: spaceId - } - ).pipe( - catchError((err, obs) => { - return of([]) - }) - ) - ) - ), - spaceId - ? this.sapi.getSpace(this.atlasId, spaceId).getFeatures({ parcellationId: this.parcId, region: this.id }).pipe( - catchError((err, obs) => { - return of([]) - }), - map(feats => { - const ieegSessions: SapiIeegSessionModel[] = feats.filter(feat => feat["@type"] === "siibra/features/ieegSession") - return cleanIeegSessionDatasets(ieegSessions) - }), - ) - : of([] as CleanedIeegDataset[]) - ).pipe( - scan((acc, curr) => [...acc, ...curr], []) - ) - } + static Features: RF[] = Object.keys(RegionFeatures) as RF[] + static Features$ = of(SAPIRegion.Features) + public features$ = SAPIRegion.Features$ - getFeatureInstance(instanceId: string, spaceId: string = null): Observable<SapiRegionalFeatureModel> { - return this.prefix$.pipe( - switchMap(prefix => this.sapi.httpGet<SapiRegionalFeatureModel>( - `${prefix}/features/${encodeURIComponent(instanceId)}`, - { - space_id: spaceId - } - )) - ) + /** + * @param spaceId + * @returns + */ + getMapInfo(spaceId: string): Observable<{min: number, max: number}> { + return this.sapi.v3Get("/map/statistical_map.info.json", { + query: { + parcellation_id: this.parcId, + region_id: this.id, + space_id: spaceId + } + }) } - getMapInfo(spaceId: string): Observable<SapiRegionMapInfoModel> { - return this.prefix$.pipe( - switchMap(prefix => this.sapi.http.get<SapiRegionMapInfoModel>( - `${prefix}/regional_map/info`, - { - params: { + /** + * @param spaceId + * @returns + */ + getMapUrl(spaceId: string): Observable<string> { + return SAPI.BsEndpoint$.pipe( + map(endpoint => { + const { path, params } = this.sapi.v3GetRoute("/map/statistical_map.nii.gz", { + query: { + parcellation_id: this.parcId, + region_id: this.id, space_id: spaceId } + }) + + const search = new URLSearchParams() + for (const key in params) { + search.set(key, params[key].toString()) } - )) - ) - } - getMapUrl(spaceId: string): Observable<string> { - return this.prefix$.pipe( - map(prefix => `${prefix}/regional_map/map?space_id=${encodeURI(spaceId)}`) + return `${endpoint}${path}?${search.toString()}` + }) ) } - getVolumes(): Observable<PaginatedResponse<SapiVolumeModel>>{ - return this.prefix$.pipe( - switchMap(prefix => this.sapi.httpGet<PaginatedResponse<SapiVolumeModel>>( - `${prefix}/volumes` - )) - ) + /** + * + * @deprecated + * @param volumeId + * @returns + */ + getVolumeInstance(volumeId: string): Observable<never> { + return NEVER } - getVolumeInstance(volumeId: string): Observable<SapiVolumeModel> { - return this.prefix$.pipe( - switchMap(prefix => this.sapi.httpGet<SapiVolumeModel>( - `${prefix}/volumes/${encodeURIComponent(volumeId)}` - )) - ) + getDetail(spaceId: string): Observable<SapiRegionModel> { + return this.sapi.v3Get("/regions/{region_id}", { + path: { + region_id: this.id + }, + query: { + parcellation_id: this.parcId, + space_id: spaceId + } + }) } - getDetail(spaceId: string): Observable<SapiRegionModel> { - return this.prefix$.pipe( - switchMap(prefix => this.sapi.httpGet<SapiRegionModel>( - prefix, - { - space_id: spaceId - } - )) - ) + getMap(spaceId: string, mapType: RouteParam<"/map">['query']['map_type']) { + return this.sapi.v3Get("/map", { + query: { + space_id: spaceId, + parcellation_id: this.parcId, + map_type: mapType, + } + }) } } diff --git a/src/atlasComponents/sapi/core/sapiSpace.ts b/src/atlasComponents/sapi/core/sapiSpace.ts index af2171077..a11e99786 100644 --- a/src/atlasComponents/sapi/core/sapiSpace.ts +++ b/src/atlasComponents/sapi/core/sapiSpace.ts @@ -1,8 +1,18 @@ -import { Observable, throwError } from "rxjs" +import { Observable, of, throwError } from "rxjs" import { SAPI } from '../sapi.service' -import { camelToSnake } from 'common/util' -import {SapiQueryPriorityArg, SapiSpaceModel, SapiSpatialFeatureModel, SapiVolumeModel} from "../type" +import { SxplrTemplate } from "../type_sxplr" import { map, switchMap } from "rxjs/operators" +import { SAPIBase } from "./base" +import { SapiQueryPriorityArg } from "../type_v3" + +/** + * All valid parcellation features + */ +const SpaceFeatures = { + VolumeOfInterest: "VolumeOfInterest", +} as const + +export type SF = keyof typeof SpaceFeatures type FeatureResponse = { features: { @@ -21,9 +31,13 @@ type BBoxSpatialFEatureOpts = { type SpatialFeatureOpts = RegionalSpatialFeatureOpts | BBoxSpatialFEatureOpts -export class SAPISpace{ +export class SAPISpace extends SAPIBase<SF>{ + + static Features$ = of(Object.keys(SpaceFeatures) as SF[]) + public features$ = SAPISpace.Features$ constructor(private sapi: SAPI, public atlasId: string, public id: string){ + super(sapi) this.prefix$ = SAPI.BsEndpoint$.pipe( map(endpt => `${endpt}/atlases/${encodeURIComponent(this.atlasId)}/spaces/${encodeURIComponent(this.id)}`) ) @@ -41,35 +55,9 @@ export class SAPISpace{ ) } - getFeatures(opts: SpatialFeatureOpts): Observable<SapiSpatialFeatureModel[]> { - const query: Record<string, string> = {} - for (const [key, value] of Object.entries(opts)) { - query[camelToSnake(key)] = value - } + getDetail(param?: SapiQueryPriorityArg): Observable<SxplrTemplate>{ return this.prefix$.pipe( - switchMap(prefix => this.sapi.httpGet<SapiSpatialFeatureModel[]>( - `${prefix}/features`, - query - )) - ) - } - - getFeatureInstance(instanceId: string, opts: SpatialFeatureOpts): Observable<SapiSpatialFeatureModel> { - const query: Record<string, string> = {} - for (const [key, value] of Object.entries(opts)) { - query[camelToSnake(key)] = value - } - return this.prefix$.pipe( - switchMap(prefix => this.sapi.httpGet<SapiSpatialFeatureModel>( - `${prefix}/features/${encodeURIComponent(instanceId)}`, - query - )) - ) - } - - getDetail(param?: SapiQueryPriorityArg): Observable<SapiSpaceModel>{ - return this.prefix$.pipe( - switchMap(prefix => this.sapi.httpGet<SapiSpaceModel>( + switchMap(prefix => this.sapi.httpGet<SxplrTemplate>( `${prefix}`, null, param @@ -77,30 +65,4 @@ export class SAPISpace{ ) } - getVolumes(): Observable<SapiVolumeModel[]>{ - return this.prefix$.pipe( - switchMap(prefix => this.sapi.httpGet<SapiVolumeModel[]>( - `${prefix}/volumes`, - )) - ) - } - - getTemplateSize() { - return this.getVolumes().pipe( - switchMap(volumes => { - const ngVolumes = volumes.filter(vol => vol["@type"] === "spy/volume/neuroglancer/precomputed") - if (ngVolumes.length === 0) return throwError(`template ${this.id} has no ng volume.`) - return this.sapi.httpGet<any>(`${ngVolumes[0].data.url}/info`).pipe( - map(infoJson => { - const { resolution, size } = infoJson.scales[0] - return { - voxel: size as [number, number, number], - real: [0, 1, 2].map(idx => resolution[idx] * size[idx]) as [number, number, number], - transform: ngVolumes[0].data?.detail?.['neuroglancer/precomputed']?.['transform'] as number[][] - } - }) - ) - }) - ) - } } diff --git a/src/atlasComponents/sapi/features/sapiFeature.ts b/src/atlasComponents/sapi/features/sapiFeature.ts index f2f341acc..73d6a8ea3 100644 --- a/src/atlasComponents/sapi/features/sapiFeature.ts +++ b/src/atlasComponents/sapi/features/sapiFeature.ts @@ -1,6 +1,6 @@ +import { throwError } from "rxjs"; import { switchMap } from "rxjs/operators"; import { SAPI } from "../sapi.service"; -import { SapiFeatureModel } from "../type"; export class SAPIFeature { constructor(private sapi: SAPI, public id: string, public opts: Record<string, string> = {}){ @@ -8,9 +8,6 @@ export class SAPIFeature { } public detail$ = SAPI.BsEndpoint$.pipe( - switchMap(endpt => this.sapi.httpGet<SapiFeatureModel>( - `${endpt}/features/${this.id}`, - this.opts - )) + switchMap(endpt => throwError(`IMPLEMENT ME`)) ) } diff --git a/src/atlasComponents/sapi/index.ts b/src/atlasComponents/sapi/index.ts index e5d8afd20..356276003 100644 --- a/src/atlasComponents/sapi/index.ts +++ b/src/atlasComponents/sapi/index.ts @@ -1,22 +1,5 @@ export { SAPIModule } from './module' -export { - SapiAtlasModel, - SapiParcellationModel, - SapiSpaceModel, - SapiRegionModel, - SapiVolumeModel, - SapiDatasetModel, - SapiRegionalFeatureModel, - SapiSpatialFeatureModel, - SapiFeatureModel, - SapiParcellationFeatureModel, - CleanedIeegDataset, - SxplrCleanedFeatureModel, - OpenMINDSCoordinatePoint, - CLEANED_IEEG_DATASET_TYPE, -} from "./type" - export { SAPI } from "./sapi.service" export { SAPIAtlas, diff --git a/src/atlasComponents/sapi/sapi.service.ts b/src/atlasComponents/sapi/sapi.service.ts index 8a44d6236..34977f4b8 100644 --- a/src/atlasComponents/sapi/sapi.service.ts +++ b/src/atlasComponents/sapi/sapi.service.ts @@ -1,18 +1,13 @@ import { Injectable } from "@angular/core"; import { HttpClient } from '@angular/common/http'; -import { map, shareReplay, switchMap, take } from "rxjs/operators"; +import { catchError, map, shareReplay, switchMap, take, tap } from "rxjs/operators"; import { SAPIAtlas, SAPISpace } from './core' import { - SapiAtlasModel, - SapiModalityModel, - SapiParcellationModel, SapiQueryPriorityArg, - SapiRegionalFeatureModel, - SapiRegionModel, - SapiSpaceModel, - SpyNpArrayDataModel, - SxplrCleanedFeatureModel -} from "./type"; +} from "./type_v3"; +import { + translateV3Entities +} from "./translate_v3" import { getExportNehuba } from "src/util/fn"; import { SAPIParcellation } from "./core/sapiParcellation"; import { SAPIRegion } from "./core/sapiRegion" @@ -20,22 +15,35 @@ import { MatSnackBar } from "@angular/material/snack-bar"; import { AtlasWorkerService } from "src/atlasViewer/atlasViewer.workerService.service"; import { EnumColorMapName } from "src/util/colorMaps"; import { PRIORITY_HEADER } from "src/util/priority"; -import { NEVER, Observable } from "rxjs"; +import { forkJoin, from, NEVER, Observable, of, throwError } from "rxjs"; import { SAPIFeature } from "./features"; import { environment } from "src/environments/environment" +import { PathReturn, RouteParam, SapiRoute } from "./type_v3"; +import { BoundingBox, SxplrAtlas, SxplrParcellation, SxplrRegion, SxplrTemplate, VoiFeature } from "./type_sxplr"; + export const SIIBRA_API_VERSION_HEADER_KEY='x-siibra-api-version' -export const SIIBRA_API_VERSION = '0.2.3' +export const EXPECTED_SIIBRA_API_VERSION = '0.3.0' type RegistryType = SAPIAtlas | SAPISpace | SAPIParcellation let BS_ENDPOINT_CACHED_VALUE: Observable<string> = null +type PaginatedResponse<T> = { + items: T[] + total: number + page: number + size: number + pages?: number +} + @Injectable({ providedIn: 'root' }) export class SAPI{ + static API_VERSION = null + /** * Used to clear BsEndPoint, so the next static get BsEndpoints$ will * fetch again. Only used for unit test of BsEndpoint$ @@ -44,10 +52,43 @@ export class SAPI{ BS_ENDPOINT_CACHED_VALUE = null } + iteratePages<T>(resp: PaginatedResponse<T>, cb: (page: number) => Observable<PaginatedResponse<T>>) { + /** + * technically, it's easier to use a concat + merge + reduce map rather than forkJoin + flatmap + * but merge does not guarantee same order, forkjoin does + * I don't know if page order matters, but it's good to be safe + */ + const pages = Math.ceil(resp.total / resp.size) + return forkJoin([ + of(resp.items), + + /** + * similar to python's range function, this function generates a uniformly increasing array, to pages + * discarding first, since we already got it + */ + ...Array(pages).fill(null).map((_, idx) => idx + 1).slice(1) + .map(page => + cb(page).pipe( + map(v => v.items) + ) + ) + ]).pipe( + map(arrOfArr => arrOfArr.flatMap(v => v)) + ) + } + static async VerifyEndpoint(url: string): Promise<string> { const resp = await fetch(`${url}/atlases`) - const atlases = await resp.json() - if (atlases.length > 0) return url + await resp.json() + if (resp.status >= 400) { + return Promise.reject(resp.statusText) + } + + if (!SAPI.API_VERSION) { + SAPI.API_VERSION = resp.headers.get(SIIBRA_API_VERSION_HEADER_KEY) + console.log(`siibra-api::version::${SAPI.API_VERSION}, expecting::${EXPECTED_SIIBRA_API_VERSION}`) + } + return url } /** @@ -123,11 +164,6 @@ export class SAPI{ this._map[id] = { func, args } } } - - getAtlas(atlasId: string): SAPIAtlas { - return new SAPIAtlas(this, atlasId) - } - getSpace(atlasId: string, spaceId: string): SAPISpace { return new SAPISpace(this, atlasId, spaceId) } @@ -140,35 +176,116 @@ export class SAPI{ return new SAPIRegion(this, atlasId, parcId, regionId) } - getSpaceDetail(atlasId: string, spaceId: string, param?: SapiQueryPriorityArg): Observable<SapiSpaceModel> { - return this.getSpace(atlasId, spaceId).getDetail(param) + getSpaceDetail(_atlasId: string, spaceId: string, param?: SapiQueryPriorityArg): Observable<SxplrTemplate> { + return this.v3Get("/spaces/{space_id}", { + path: { + space_id: spaceId + }, + priority: param?.priority + }).pipe( + switchMap(v => translateV3Entities.translateTemplate(v)) + ) } - getParcDetail(atlasId: string, parcId: string, param?: SapiQueryPriorityArg): Observable<SapiParcellationModel> { - return this.getParcellation(atlasId, parcId).getDetail(param) + getParcDetail(atlasId: string, parcId: string, param?: SapiQueryPriorityArg): Observable<SxplrParcellation> { + return this.v3Get("/parcellations/{parcellation_id}", { + path: { + parcellation_id: parcId + }, + priority: param?.priority + }).pipe( + switchMap(v => translateV3Entities.translateParcellation(v)) + ) } - getParcRegions(atlasId: string, parcId: string, spaceId: string, queryParam?: SapiQueryPriorityArg): Observable<SapiRegionModel[]> { - const parc = this.getParcellation(atlasId, parcId) - return parc.getRegions(spaceId, queryParam) + getParcRegions(atlasId: string, parcId: string, spaceId: string, queryParam?: SapiQueryPriorityArg) { + const param = { + query: { + parcellation_id: parcId, + }, + priority: queryParam?.priority + } + return this.v3Get("/regions", param).pipe( + switchMap(resp => + this.iteratePages( + resp, + (page) => this.v3Get("/regions", { + ...param, + query: { + ...param.query, + page + }, + }) + ).pipe( + switchMap(regions => forkJoin(regions.map(r => translateV3Entities.translateRegion(r)))), + ) + ), + ) + } + + getMap(parcId: string, spaceId: string, mapType: "LABELLED" | "STATISTICAL", queryParam?: SapiQueryPriorityArg) { + return this.v3Get("/map", { + query: { + map_type: mapType, + parcellation_id: parcId, + space_id: spaceId + } + }) } getFeature(featureId: string, opts: Record<string, string> = {}) { return new SAPIFeature(this, featureId, opts) } - getRegionFeatures(atlasId: string, parcId: string, spaceId: string, regionId: string, priority = 0): Observable<(SapiRegionalFeatureModel | SxplrCleanedFeatureModel)[]>{ + getModalities() { + return this.v3Get("/feature/_types", { query: {} }).pipe( + map(v => v.items) + ) + } - const reg = this.getRegion(atlasId, parcId, regionId) - return reg.getFeatures(spaceId) + v3GetRoute<T extends SapiRoute>(route: T, sapiParam: RouteParam<T>) { + const params: Record<string, string|number> = "query" in sapiParam ? sapiParam["query"] : {} + const _path: Record<string, string|number> = "path" in sapiParam ? sapiParam["path"] : {} + let path: string = route + for (const key in _path) { + path = path.replace(`{${key}}`, _path[key].toString()) + } + return { path, params } } - getModalities(): Observable<SapiModalityModel[]> { + /** + * Should be privated. All components use this method forms a tight coupling to API + * Use this method sparingly! + * @param route + * @param sapiParam + * @returns + */ + v3Get<T extends SapiRoute>(route: T, sapiParam: RouteParam<T> & Partial<{ priority: number }>){ return SAPI.BsEndpoint$.pipe( - switchMap(endpt => this.http.get<SapiModalityModel[]>(`${endpt}/modalities`)) + switchMap(endpoint => { + const headers: Record<string, string> = {} + if (sapiParam?.priority) { + headers[PRIORITY_HEADER] = sapiParam.priority.toString() + } + const { path, params } = this.v3GetRoute(route, sapiParam) + return this.http.get<PathReturn<T>>( + `${endpoint}${path}`, + { + headers, + params + } + ) + }) ) } + /** + * @deprecated + * @param url + * @param params + * @param sapiParam + * @returns + */ httpGet<T>(url: string, params?: Record<string, string>, sapiParam?: SapiQueryPriorityArg){ const headers: Record<string, string> = {} if (sapiParam?.priority) { @@ -183,25 +300,183 @@ export class SAPI{ ) } - public atlases$ = SAPI.BsEndpoint$.pipe( - switchMap(endpt => this.http.get<SapiAtlasModel[]>( - `${endpt}/atlases`, - { - observe: "response" - } + public atlases$ = this.v3Get("/atlases", { + query: {} + }).pipe( + switchMap(atlases => forkJoin( + atlases.items.map(atlas => translateV3Entities.translateAtlas(atlas)) )), - map(resp => { - const respVersion = resp.headers.get(SIIBRA_API_VERSION_HEADER_KEY) - if (respVersion !== SIIBRA_API_VERSION) { - this.snackbar.open(`Expecting ${SIIBRA_API_VERSION}, got ${respVersion}. Some functionalities may not work as expected.`, 'Dismiss', { + tap(() => { + const respVersion = SAPI.API_VERSION + if (respVersion !== EXPECTED_SIIBRA_API_VERSION) { + this.snackbar.open(`Expecting ${EXPECTED_SIIBRA_API_VERSION}, got ${respVersion}. Some functionalities may not work as expected.`, 'Dismiss', { duration: 5000 }) } - console.log(`siibra-api::version::${respVersion}, expecting::${SIIBRA_API_VERSION}`) - return resp.body }), - shareReplay(1) + shareReplay(1), ) + + + public getAllSpaces(atlas: SxplrAtlas): Observable<SxplrTemplate[]> { + return forkJoin( + translateV3Entities.retrieveAtlas(atlas).spaces.map( + spc => this.v3Get("/spaces/{space_id}", { path: { space_id: spc["@id"] } }).pipe( + switchMap(v => translateV3Entities.translateTemplate(v)) + ) + ) + ) + } + + public getAllParcellations(atlas: SxplrAtlas): Observable<SxplrParcellation[]> { + return forkJoin( + translateV3Entities.retrieveAtlas(atlas).parcellations.map( + parc => this.v3Get("/parcellations/{parcellation_id}", { path: { parcellation_id: parc["@id"] } }).pipe( + switchMap(v => translateV3Entities.translateParcellation(v)) + ) + ) + ) + } + + #tmplToParcMap = new Map<string, SxplrParcellation[]>() + public getSupportedParcellations(atlas: SxplrAtlas, template: SxplrTemplate): Observable<any|SxplrParcellation[]> { + if (!template) { + return throwError(`template cannot be empty!`) + } + if (this.#tmplToParcMap.has(template.id)) { + return of(this.#tmplToParcMap.get(template.id)) + } + return this.getAllParcellations(atlas).pipe( + switchMap(parcs => forkJoin( + parcs.map( + parc => this.getMap( + parc.id, + template.id, + "LABELLED" + ).pipe( + catchError((err, obs) => of(null as SxplrParcellation)), + map(_map => _map && parc) + ) + ) + ).pipe( + map(arr => { + const val = arr.filter(v => !!v) + this.#tmplToParcMap.set(template.id, val) + return val + }) + )) + ) + } + + #parcIdToTmplMap = new Map<string, SxplrTemplate[]>() + public getSupportedTemplates(atlas: SxplrAtlas, parc: SxplrParcellation): Observable<SxplrTemplate[]> { + if (!parc) { + return throwError(`parc cannot be empty!`) + } + if (this.#parcIdToTmplMap.has(parc.id)) { + return of(this.#parcIdToTmplMap.get(parc.id)) + } + return this.getAllSpaces(atlas).pipe( + switchMap(spaces => forkJoin( + spaces.map( + space => this.getMap( + parc.id, + space.id, + "LABELLED" + ).pipe( + catchError((err, obs) => of(null)), + map(_map => _map && space) + ) + ) + ).pipe( + map(arr => { + const val = arr.filter(v => !!v) + this.#parcIdToTmplMap.set(parc.id, val) + return val + }) + )) + ) + } + + public getVoiFeatures(bbox: BoundingBox): Observable<VoiFeature[]> { + /** + * FIXME iterate over all pages + */ + return this.v3Get("/feature/VolumeOfInterest", { + query: { + space_id: bbox.space.id, + bbox: JSON.stringify([bbox.minpoint, bbox.maxpoint]), + } + }).pipe( + switchMap(v => Promise.all(v.items.map(item => translateV3Entities.translateVoi(item)))) + ) + } + + private async getLabelledMap(parcellation: SxplrParcellation, template: SxplrTemplate) { + // No need to retrieve sapi object, since we know @id maps to id + return await this.v3Get("/map", { + query: { + map_type: "LABELLED", + parcellation_id: parcellation.id, + space_id: template.id + } + }).toPromise() + } + + public getVoxelTemplateImage(template: SxplrTemplate) { + return from(translateV3Entities.translateSpaceToVolumeImage(template)) + } + + public getVoxelAuxMesh(template: SxplrTemplate) { + return from(translateV3Entities.translateSpaceToAuxMesh(template)) + } + + public getSurfaceTemplateImage(template: SxplrTemplate) { + return from(translateV3Entities.translateSpaceToSurfaceImage(template)) + } + /** + * Even though this creates a rather tight coupling between sapi.server and nehuba viewer module + * This is better than the alternative, which is creating a tight coupling between nehuba viewer module and siibra-api + */ + + public async getTranslatedLabelledNgMap(parcellation: SxplrParcellation, template: SxplrTemplate) { + if (!parcellation || !template) return {} + const map = await this.getLabelledMap(parcellation, template) + return await translateV3Entities.translateLabelledMapToNgSegLayers(map) + } + + public async getTranslatedLabelledThreeMap(parcellation: SxplrParcellation, template: SxplrTemplate){ + if (!parcellation || !template) return {} + const map = await this.getLabelledMap(parcellation, template) + return await translateV3Entities.translateLabelledMapToThreeLabel(map) + } + + #tmplParcMap = new Map<string, PathReturn<"/map">>() + public async getRegionLabelIndices(tmpl: SxplrTemplate, parc: SxplrParcellation, region: SxplrRegion) { + const key = `${tmpl.id}::${parc.id}` + + if (!this.#tmplParcMap.has(key)) { + const _map = await this.v3Get("/map", { + query: { + map_type: "LABELLED", + parcellation_id: parc.id, + space_id: tmpl.id + } + }).toPromise() + this.#tmplParcMap.set(key, _map) + } + + const { indices } = this.#tmplParcMap.get(key) + const index = indices[region.name] || [] + if (index.length === 0) { + throw new Error(`No map index found for ${region.name}`) + } + if (index.length !== 1) { + console.warn(`Multiple map indicies found... Using the first one`) + } + const _index = index[0] + return _index.label + } constructor( public http: HttpClient, @@ -213,11 +488,12 @@ export class SAPI{ } this.atlases$.subscribe(atlases => { for (const atlas of atlases) { - for (const space of atlas.spaces) { + const sapiAtlas = translateV3Entities.retrieveAtlas(atlas) + for (const space of sapiAtlas.spaces) { this.registry.set(space["@id"], this.getSpace.bind(this), [atlas["@id"], space["@id"]]) this.getSpaceDetail(atlas["@id"], space["@id"]) } - for (const parc of atlas.parcellations) { + for (const parc of sapiAtlas.parcellations) { this.registry.set(parc["@id"], this.getParcellation.bind(this), [atlas["@id"], parc["@id"]]) this.getParcDetail(atlas["@id"], parc["@id"]) } @@ -225,8 +501,16 @@ export class SAPI{ }) } - async processNpArrayData<T extends keyof ProcessTypedArrayResult>(input: SpyNpArrayDataModel, method: PARSE_TYPEDARRAY = PARSE_TYPEDARRAY.RAW_ARRAY, params: ProcessTypedArrayResult[T]['input'] = null): Promise<ProcessTypedArrayResult[T]['output']> { - + /** + * + * @deprecated + * @param input + * @param method + * @param params + * @returns + */ + async processNpArrayData<T extends keyof ProcessTypedArrayResult>(input: any /*SpyNpArrayDataModel*/, method: PARSE_TYPEDARRAY = PARSE_TYPEDARRAY.RAW_ARRAY, params: ProcessTypedArrayResult[T]['input'] = null): Promise<ProcessTypedArrayResult[T]['output']> { + return null const supportedDtype = [ "uint8", "int32", @@ -300,6 +584,9 @@ export class SAPI{ } } +/** + * @deprecated + */ export enum PARSE_TYPEDARRAY { CANVAS_FORTRAN_RGBA="CANVAS_FORTRAN_RGBA", CANVAS_COLORMAP_RGBA="CANVAS_COLORMAP_RGBA", diff --git a/src/atlasComponents/sapi/schema.ts b/src/atlasComponents/sapi/schema.ts index 49f3d1b3f..abec3c870 100644 --- a/src/atlasComponents/sapi/schema.ts +++ b/src/atlasComponents/sapi/schema.ts @@ -1,2035 +1,2035 @@ -/** - * This file was auto-generated by openapi-typescript. - * Do not make direct changes to the file. - */ +// /** +// * This file was auto-generated by openapi-typescript. +// * Do not make direct changes to the file. +// */ -export interface paths { - "/atlases/{atlas_id}/parcellations/{parcellation_id}/regions": { - /** Returns all regions for a given parcellation id. */ - get: operations["get_all_regions_from_atlas_parc_space_atlases__atlas_id__parcellations__parcellation_id__regions_get"] - } - "/atlases/{atlas_id}/parcellations/{parcellation_id}/regions/{region_id}/features": { - /** Returns all regional features for a region. */ - get: operations["get_all_regional_features_for_region_atlases__atlas_id__parcellations__parcellation_id__regions__region_id__features_get"] - } - "/atlases/{atlas_id}/parcellations/{parcellation_id}/regions/{region_id}/features/{feature_id}": { - /** Returns a feature for a region, as defined by the modality and feature ID */ - get: operations["get_single_detailed_regional_feature_atlases__atlas_id__parcellations__parcellation_id__regions__region_id__features__feature_id__get"] - } - "/atlases/{atlas_id}/parcellations/{parcellation_id}/regions/{region_id}/regional_map/info": { - /** Returns information about a regional map for given region name. */ - get: operations["get_regional_map_info_atlases__atlas_id__parcellations__parcellation_id__regions__region_id__regional_map_info_get"] - } - "/atlases/{atlas_id}/parcellations/{parcellation_id}/regions/{region_id}/regional_map/map": { - /** Returns a regional map for given region name. */ - get: operations["get_regional_map_file_atlases__atlas_id__parcellations__parcellation_id__regions__region_id__regional_map_map_get"] - } - "/atlases/{atlas_id}/parcellations/{parcellation_id}/regions/{region_id}/volumes": { - get: operations["get_regional_volumes_atlases__atlas_id__parcellations__parcellation_id__regions__region_id__volumes_get"] - } - "/atlases/{atlas_id}/parcellations/{parcellation_id}/regions/{region_id}/volumes/{volume_id}": { - get: operations["get_regional_volumes_atlases__atlas_id__parcellations__parcellation_id__regions__region_id__volumes__volume_id__get"] - } - "/atlases/{atlas_id}/parcellations/{parcellation_id}/regions/{region_id}": { - get: operations["get_single_region_detail_atlases__atlas_id__parcellations__parcellation_id__regions__region_id__get"] - } - "/atlases/{atlas_id}/parcellations": { - /** Returns all parcellations that are defined in the siibra client for given atlas. */ - get: operations["get_all_parcellations_atlases__atlas_id__parcellations_get"] - } - "/atlases/{atlas_id}/parcellations/{parcellation_id}/features/{feature_id}": { - /** Returns a global feature for a specific modality id. */ - get: operations["get_single_detailed_global_feature_atlases__atlas_id__parcellations__parcellation_id__features__feature_id__get"] - } - "/atlases/{atlas_id}/parcellations/{parcellation_id}/features": { - /** Returns all global features for a parcellation. */ - get: operations["get_all_global_features_for_parcellation_atlases__atlas_id__parcellations__parcellation_id__features_get"] - } - "/atlases/{atlas_id}/parcellations/{parcellation_id}/volumes": { - /** Returns one parcellation for given id. */ - get: operations["get_volumes_for_parcellation_atlases__atlas_id__parcellations__parcellation_id__volumes_get"] - } - "/atlases/{atlas_id}/parcellations/{parcellation_id}": { - /** Returns one parcellation for given id. */ - get: operations["get_single_parcellation_detail_atlases__atlas_id__parcellations__parcellation_id__get"] - } - "/atlases/{atlas_id}/spaces": { - /** Returns all spaces that are defined in the siibra client. */ - get: operations["get_all_spaces_atlases__atlas_id__spaces_get"] - } - "/atlases/{atlas_id}/spaces/{space_id}/templates": { - /** Returns a template for a given space id. */ - get: operations["get_template_by_space_id_atlases__atlas_id__spaces__space_id__templates_get"] - } - "/atlases/{atlas_id}/spaces/{space_id}/parcellation_maps": { - /** Returns all parcellation maps for a given space id. */ - get: operations["get_parcellation_map_for_space_atlases__atlas_id__spaces__space_id__parcellation_maps_get"] - } - "/atlases/{atlas_id}/spaces/{space_id}/features/{feature_id}": { - /** - * Get a detailed view on a single spatial feature. - * A parcellation id and region id can be provided optional to get more details. - */ - get: operations["get_single_detailed_spatial_feature_atlases__atlas_id__spaces__space_id__features__feature_id__get"] - } - "/atlases/{atlas_id}/spaces/{space_id}/features": { - /** Return all possible feature names and links to get more details */ - get: operations["get_all_spatial_features_for_space_atlases__atlas_id__spaces__space_id__features_get"] - } - "/atlases/{atlas_id}/spaces/{space_id}/volumes": { - get: operations["get_volumes_for_space_atlases__atlas_id__spaces__space_id__volumes_get"] - } - "/atlases/{atlas_id}/spaces/{space_id}": { - /** Returns one space for given id, with links to further resources */ - get: operations["get_single_space_detail_atlases__atlas_id__spaces__space_id__get"] - } - "/atlases": { - /** Get all atlases known by siibra. */ - get: operations["get_all_atlases_atlases_get"] - } - "/atlases/{atlas_id}": { - /** Get more information for a specific atlas with links to further objects. */ - get: operations["get_atlas_by_id_atlases__atlas_id__get"] - } - "/genes": { - /** Return all genes (name, acronym) in siibra */ - get: operations["get_gene_names_genes_get"] - } - "/modalities": { - /** Return all possible modalities */ - get: operations["get_all_available_modalities_modalities_get"] - } - "/features/{feature_id}": { - /** - * Get all details for one feature by id. - * Since the feature id is unique, no atlas concept is required. - * - * Further optional params can extend the result. - * :param feature_id: - * :param atlas_id: - * :param space_id: - * :param parcellation_id: - * :param region_id: - * :return: FeatureModels - */ - get: operations["get_feature_details_features__feature_id__get"] - } -} +// export interface paths { +// "/atlases/{atlas_id}/parcellations/{parcellation_id}/regions": { +// /** Returns all regions for a given parcellation id. */ +// get: operations["get_all_regions_from_atlas_parc_space_atlases__atlas_id__parcellations__parcellation_id__regions_get"] +// } +// "/atlases/{atlas_id}/parcellations/{parcellation_id}/regions/{region_id}/features": { +// /** Returns all regional features for a region. */ +// get: operations["get_all_regional_features_for_region_atlases__atlas_id__parcellations__parcellation_id__regions__region_id__features_get"] +// } +// "/atlases/{atlas_id}/parcellations/{parcellation_id}/regions/{region_id}/features/{feature_id}": { +// /** Returns a feature for a region, as defined by the modality and feature ID */ +// get: operations["get_single_detailed_regional_feature_atlases__atlas_id__parcellations__parcellation_id__regions__region_id__features__feature_id__get"] +// } +// "/atlases/{atlas_id}/parcellations/{parcellation_id}/regions/{region_id}/regional_map/info": { +// /** Returns information about a regional map for given region name. */ +// get: operations["get_regional_map_info_atlases__atlas_id__parcellations__parcellation_id__regions__region_id__regional_map_info_get"] +// } +// "/atlases/{atlas_id}/parcellations/{parcellation_id}/regions/{region_id}/regional_map/map": { +// /** Returns a regional map for given region name. */ +// get: operations["get_regional_map_file_atlases__atlas_id__parcellations__parcellation_id__regions__region_id__regional_map_map_get"] +// } +// "/atlases/{atlas_id}/parcellations/{parcellation_id}/regions/{region_id}/volumes": { +// get: operations["get_regional_volumes_atlases__atlas_id__parcellations__parcellation_id__regions__region_id__volumes_get"] +// } +// "/atlases/{atlas_id}/parcellations/{parcellation_id}/regions/{region_id}/volumes/{volume_id}": { +// get: operations["get_regional_volumes_atlases__atlas_id__parcellations__parcellation_id__regions__region_id__volumes__volume_id__get"] +// } +// "/atlases/{atlas_id}/parcellations/{parcellation_id}/regions/{region_id}": { +// get: operations["get_single_region_detail_atlases__atlas_id__parcellations__parcellation_id__regions__region_id__get"] +// } +// "/atlases/{atlas_id}/parcellations": { +// /** Returns all parcellations that are defined in the siibra client for given atlas. */ +// get: operations["get_all_parcellations_atlases__atlas_id__parcellations_get"] +// } +// "/atlases/{atlas_id}/parcellations/{parcellation_id}/features/{feature_id}": { +// /** Returns a global feature for a specific modality id. */ +// get: operations["get_single_detailed_global_feature_atlases__atlas_id__parcellations__parcellation_id__features__feature_id__get"] +// } +// "/atlases/{atlas_id}/parcellations/{parcellation_id}/features": { +// /** Returns all global features for a parcellation. */ +// get: operations["get_all_global_features_for_parcellation_atlases__atlas_id__parcellations__parcellation_id__features_get"] +// } +// "/atlases/{atlas_id}/parcellations/{parcellation_id}/volumes": { +// /** Returns one parcellation for given id. */ +// get: operations["get_volumes_for_parcellation_atlases__atlas_id__parcellations__parcellation_id__volumes_get"] +// } +// "/atlases/{atlas_id}/parcellations/{parcellation_id}": { +// /** Returns one parcellation for given id. */ +// get: operations["get_single_parcellation_detail_atlases__atlas_id__parcellations__parcellation_id__get"] +// } +// "/atlases/{atlas_id}/spaces": { +// /** Returns all spaces that are defined in the siibra client. */ +// get: operations["get_all_spaces_atlases__atlas_id__spaces_get"] +// } +// "/atlases/{atlas_id}/spaces/{space_id}/templates": { +// /** Returns a template for a given space id. */ +// get: operations["get_template_by_space_id_atlases__atlas_id__spaces__space_id__templates_get"] +// } +// "/atlases/{atlas_id}/spaces/{space_id}/parcellation_maps": { +// /** Returns all parcellation maps for a given space id. */ +// get: operations["get_parcellation_map_for_space_atlases__atlas_id__spaces__space_id__parcellation_maps_get"] +// } +// "/atlases/{atlas_id}/spaces/{space_id}/features/{feature_id}": { +// /** +// * Get a detailed view on a single spatial feature. +// * A parcellation id and region id can be provided optional to get more details. +// */ +// get: operations["get_single_detailed_spatial_feature_atlases__atlas_id__spaces__space_id__features__feature_id__get"] +// } +// "/atlases/{atlas_id}/spaces/{space_id}/features": { +// /** Return all possible feature names and links to get more details */ +// get: operations["get_all_spatial_features_for_space_atlases__atlas_id__spaces__space_id__features_get"] +// } +// "/atlases/{atlas_id}/spaces/{space_id}/volumes": { +// get: operations["get_volumes_for_space_atlases__atlas_id__spaces__space_id__volumes_get"] +// } +// "/atlases/{atlas_id}/spaces/{space_id}": { +// /** Returns one space for given id, with links to further resources */ +// get: operations["get_single_space_detail_atlases__atlas_id__spaces__space_id__get"] +// } +// "/atlases": { +// /** Get all atlases known by siibra. */ +// get: operations["get_all_atlases_atlases_get"] +// } +// "/atlases/{atlas_id}": { +// /** Get more information for a specific atlas with links to further objects. */ +// get: operations["get_atlas_by_id_atlases__atlas_id__get"] +// } +// "/genes": { +// /** Return all genes (name, acronym) in siibra */ +// get: operations["get_gene_names_genes_get"] +// } +// "/modalities": { +// /** Return all possible modalities */ +// get: operations["get_all_available_modalities_modalities_get"] +// } +// "/features/{feature_id}": { +// /** +// * Get all details for one feature by id. +// * Since the feature id is unique, no atlas concept is required. +// * +// * Further optional params can extend the result. +// * :param feature_id: +// * :param atlas_id: +// * :param space_id: +// * :param parcellation_id: +// * :param region_id: +// * :return: FeatureModels +// */ +// get: operations["get_feature_details_features__feature_id__get"] +// } +// } -export interface components { - schemas: { - /** AutoradiographyDataModel */ - AutoradiographyDataModel: { - /** - * Content Type - * @default application/octet-stream - */ - content_type?: string - /** - * Content Encoding - * @default gzip; base64 - */ - content_encoding?: string - /** X-Width */ - "x-width": number - /** X-Height */ - "x-height": number - /** X-Channel */ - "x-channel": number - /** Dtype */ - dtype: string - /** Content */ - content: string - } - /** AxesOrigin */ - AxesOrigin: { - /** - * @Context - * @default [object Object] - */ - "@context"?: components["schemas"]["VocabModel"] - /** - * typeOfUncertainty - * @description Distinct technique used to quantify the uncertainty of a measurement. - */ - typeOfUncertainty?: unknown - /** - * uncertainty - * @description Quantitative value range defining the uncertainty of a measurement. - */ - uncertainty?: number[] - /** - * unit - * @description Determinate quantity adopted as a standard of measurement. - */ - unit?: unknown - /** - * value - * @description Entry for a property. - */ - value: number - } - /** BaseDatasetJsonModel */ - BaseDatasetJsonModel: { - /** @Id */ - "@id": string - /** - * @Type - * @constant - */ - "@type"?: "https://openminds.ebrains.eu/core/DatasetVersion" - metadata: components["schemas"]["siibra__openminds__core__v4__products__datasetVersion__Model"] - /** Urls */ - urls: components["schemas"]["Url"][] - } - /** BestViewPoint */ - BestViewPoint: { - /** - * @Context - * @default [object Object] - */ - "@context"?: components["schemas"]["VocabModel"] - /** - * coordinateSpace - * @description Two or three dimensional geometric setting. - */ - coordinateSpace: unknown - /** - * Coordinates - * @description Structured information on a quantitative value. - */ - coordinates: components["schemas"]["siibra__openminds__SANDS__v3__atlas__parcellationEntityVersion__Coordinates"][] - } - /** BoundingBoxModel */ - BoundingBoxModel: { - /** @Type */ - "@type": string - /** Space */ - space: { [key: string]: string } - center: components["schemas"]["siibra__openminds__SANDS__v3__miscellaneous__coordinatePoint__Model"] - minpoint: components["schemas"]["siibra__openminds__SANDS__v3__miscellaneous__coordinatePoint__Model"] - maxpoint: components["schemas"]["siibra__openminds__SANDS__v3__miscellaneous__coordinatePoint__Model"] - /** Shape */ - shape: number[] - /** Isplanar */ - isPlanar: boolean - } - /** ConnectivityMatrixDataModel */ - ConnectivityMatrixDataModel: { - /** @Id */ - "@id": string - /** @Type */ - "@type": string - /** Name */ - name?: string - /** Description */ - description?: string - /** Citation */ - citation?: string - /** Authors */ - authors?: string[] - /** Cohort */ - cohort?: string - /** Subject */ - subject?: string - /** Filename */ - filename?: string - /** Dataset Id */ - dataset_id?: string - /** Parcellations */ - parcellations: { [key: string]: string }[] - matrix?: components["schemas"]["NpArrayDataModel"] - /** Columns */ - columns?: string[] - } - /** CorticalCellDistributionModel */ - CorticalCellDistributionModel: { - /** @Id */ - "@id": string - /** - * @Type - * @constant - */ - "@type"?: "siibra/features/cells" - metadata: components["schemas"]["siibra__openminds__core__v4__products__datasetVersion__Model"] - /** Urls */ - urls: components["schemas"]["Url"][] - /** Cells */ - cells?: components["schemas"]["CorticalCellModel"][] - /** Section */ - section?: string - /** Patch */ - patch?: string - } - /** CorticalCellModel */ - CorticalCellModel: { - /** X */ - x: number - /** Y */ - y: number - /** Area */ - area: number - /** Layer */ - layer: number - /** Instance Label */ - "instance label": number - } - /** DatasetJsonModel */ - DatasetJsonModel: { - /** @Id */ - "@id": string - /** - * @Type - * @constant - */ - "@type"?: "https://openminds.ebrains.eu/core/DatasetVersion" - metadata: components["schemas"]["siibra__openminds__core__v4__products__datasetVersion__Model"] - /** Urls */ - urls: components["schemas"]["Url"][] - } - /** FingerPrintDataModel */ - FingerPrintDataModel: { - /** Mean */ - mean: number - /** Std */ - std: number - /** Unit */ - unit: string - } - /** HTTPValidationError */ - HTTPValidationError: { - /** Detail */ - detail?: components["schemas"]["ValidationError"][] - } - /** HasAnnotation */ - HasAnnotation: { - /** - * @Context - * @default [object Object] - */ - "@context"?: components["schemas"]["VocabModel"] - /** - * Bestviewpoint - * @description Structured information on a coordinate point. - */ - bestViewPoint?: components["schemas"]["BestViewPoint"] - /** - * criteria - * @description Aspects or standards on which a judgement or decision is based. - */ - criteria?: unknown - /** - * criteriaQualityType - * @description Distinct class that defines how the judgement or decision was made for a particular criteria. - */ - criteriaQualityType: unknown - /** - * displayColor - * @description Preferred coloring. - */ - displayColor?: string - /** - * inspiredBy - * @description Reference to an inspiring element. - */ - inspiredBy?: unknown[] - /** - * internalIdentifier - * @description Term or code that identifies someone or something within a particular product. - */ - internalIdentifier: string - /** - * laterality - * @description Differentiation between a pair of lateral homologous parts of the body. - */ - laterality?: unknown[] - /** - * visualizedIn - * @description Reference to an image in which something is visible. - */ - visualizedIn?: unknown - } - /** HasTerminologyVersion */ - HasTerminologyVersion: { - /** - * @Context - * @default [object Object] - */ - "@context"?: components["schemas"]["VocabModel"] - /** - * definedIn - * @description Reference to a file instance in which something is stored. - */ - definedIn?: unknown[] - /** hasEntityVersion */ - hasEntityVersion: unknown[] - /** - * ontologyIdentifier - * @description Term or code used to identify something or someone registered within a particular ontology. - */ - ontologyIdentifier?: string[] - } - /** HrefModel */ - HrefModel: { - /** Href */ - href: string - } - /** IEEGContactPointModel */ - IEEGContactPointModel: { - /** Inroi */ - inRoi?: boolean - /** Id */ - id: string - point: components["schemas"]["siibra__openminds__SANDS__v3__miscellaneous__coordinatePoint__Model"] - } - /** IEEGElectrodeModel */ - IEEGElectrodeModel: { - /** Inroi */ - inRoi?: boolean - /** Electrode Id */ - electrode_id: string - /** Contact Points */ - contact_points: { - [key: string]: components["schemas"]["IEEGContactPointModel"] - } - } - /** IEEGSessionModel */ - IEEGSessionModel: { - /** Inroi */ - inRoi?: boolean - /** @Id */ - "@id": string - /** - * @Type - * @constant - */ - "@type"?: "siibra/features/ieegSession" - dataset: components["schemas"]["DatasetJsonModel"] - /** Sub Id */ - sub_id: string - /** Electrodes */ - electrodes: { - [key: string]: components["schemas"]["IEEGElectrodeModel"] - } - } - /** NeurotransmitterMarkupModel */ - NeurotransmitterMarkupModel: { - /** Latex */ - latex: string - /** Markdown */ - markdown: string - /** Name */ - name: string - /** Label */ - label: string - } - /** NiiMetadataModel */ - NiiMetadataModel: { - /** Min */ - min: number - /** Max */ - max: number - } - /** NpArrayDataModel */ - NpArrayDataModel: { - /** - * Content Type - * @default application/octet-stream - */ - content_type?: string - /** - * Content Encoding - * @default gzip; base64 - */ - content_encoding?: string - /** X-Width */ - "x-width": number - /** X-Height */ - "x-height": number - /** X-Channel */ - "x-channel": number - /** Dtype */ - dtype: string - /** Content */ - content: string - } - /** Page[Union[siibra.features.connectivity.ConnectivityMatrixDataModel, app.models.SerializationErrorModel]] */ - "Page_Union_siibra.features.connectivity.ConnectivityMatrixDataModel__app.models.SerializationErrorModel__": { - /** Items */ - items: (Partial<components["schemas"]["ConnectivityMatrixDataModel"]> & - Partial<components["schemas"]["SerializationErrorModel"]>)[] - /** Total */ - total: number - /** Page */ - page: number - /** Size */ - size: number - } - /** Page[VolumeModel] */ - Page_VolumeModel_: { - /** Items */ - items: components["schemas"]["VolumeModel"][] - /** Total */ - total: number - /** Page */ - page: number - /** Size */ - size: number - } - /** ProfileDataModel */ - ProfileDataModel: { - density: components["schemas"]["NpArrayDataModel"] - /** Unit */ - unit: string - } - /** QuantitativeOverlapItem */ - QuantitativeOverlapItem: { - /** - * @Context - * @default [object Object] - */ - "@context"?: components["schemas"]["VocabModel"] - /** - * typeOfUncertainty - * @description Distinct technique used to quantify the uncertainty of a measurement. - */ - typeOfUncertainty?: unknown - /** - * uncertainty - * @description Quantitative value range defining the uncertainty of a measurement. - */ - uncertainty?: number[] - /** - * unit - * @description Determinate quantity adopted as a standard of measurement. - */ - unit?: unknown - /** - * value - * @description Entry for a property. - */ - value: number - } - /** QuantitativeOverlapItem1 */ - QuantitativeOverlapItem1: { - /** - * @Context - * @default [object Object] - */ - "@context"?: components["schemas"]["VocabModel"] - /** - * maxValue - * @description Greatest quantity attained or allowed. - */ - maxValue: number - /** maxValueUnit */ - maxValueUnit?: unknown - /** - * minValue - * @description Smallest quantity attained or allowed. - */ - minValue: number - /** minValueUnit */ - minValueUnit?: unknown - } - /** ReceptorDataModel */ - ReceptorDataModel: { - /** Autoradiographs */ - autoradiographs: { - [key: string]: components["schemas"]["AutoradiographyDataModel"] - } - /** Profiles */ - profiles: { [key: string]: components["schemas"]["ProfileDataModel"] } - /** Fingerprints */ - fingerprints: { - [key: string]: components["schemas"]["FingerPrintDataModel"] - } - /** Receptor Symbols */ - receptor_symbols: { - [key: string]: components["schemas"]["SymbolMarkupClass"] - } - } - /** ReceptorDatasetModel */ - ReceptorDatasetModel: { - /** @Id */ - "@id": string - /** - * @Type - * @constant - */ - "@type"?: "siibra/features/receptor" - metadata: components["schemas"]["siibra__openminds__core__v4__products__datasetVersion__Model"] - /** Urls */ - urls: components["schemas"]["Url"][] - data?: components["schemas"]["ReceptorDataModel"] - } - /** ReceptorMarkupModel */ - ReceptorMarkupModel: { - /** Latex */ - latex: string - /** Markdown */ - markdown: string - /** Name */ - name: string - } - /** RelationAssessmentItem */ - RelationAssessmentItem: { - /** - * @Context - * @default [object Object] - */ - "@context"?: components["schemas"]["VocabModel"] - /** - * criteria - * @description Aspects or standards on which a judgement or decision is based. - */ - criteria?: unknown - /** - * inRelationTo - * @description Reference to a related element. - */ - inRelationTo: unknown - /** - * qualitativeOverlap - * @description Semantic characterization of how much two things occupy the same space. - */ - qualitativeOverlap: unknown - } - /** RelationAssessmentItem1 */ - RelationAssessmentItem1: { - /** - * @Context - * @default [object Object] - */ - "@context"?: components["schemas"]["VocabModel"] - /** - * criteria - * @description Aspects or standards on which a judgement or decision is based. - */ - criteria?: unknown - /** - * inRelationTo - * @description Reference to a related element. - */ - inRelationTo: unknown - /** Quantitativeoverlap */ - quantitativeOverlap: Partial< - components["schemas"]["QuantitativeOverlapItem"] - > & - Partial<components["schemas"]["QuantitativeOverlapItem1"]> - } - /** SapiAtlasModel */ - SapiAtlasModel: { - /** Links */ - links: { [key: string]: components["schemas"]["HrefModel"] } - /** @Id */ - "@id": string - /** Name */ - name: string - /** - * @Type - * @constant - */ - "@type"?: "juelich/iav/atlas/v1.0.0" - /** Spaces */ - spaces: components["schemas"]["SiibraAtIdModel"][] - /** Parcellations */ - parcellations: components["schemas"]["SiibraAtIdModel"][] - species: components["schemas"]["SpeciesModel"] - } - /** SapiParcellationModel */ - SapiParcellationModel: { - /** Links */ - links: { [key: string]: components["schemas"]["HrefModel"] } - /** @Id */ - "@id": string - /** - * @Type - * @constant - */ - "@type"?: "minds/core/parcellationatlas/v1.0.0" - /** Name */ - name: string - /** Modality */ - modality?: string - /** Datasets */ - datasets: components["schemas"]["DatasetJsonModel"][] - /** Brainatlasversions */ - brainAtlasVersions: components["schemas"]["siibra__openminds__SANDS__v3__atlas__brainAtlasVersion__Model"][] - version?: components["schemas"]["SiibraParcellationVersionModel"] - } - /** SapiSpaceModel */ - SapiSpaceModel: { - /** Links */ - links: { [key: string]: components["schemas"]["HrefModel"] } - /** - * @Context - * @default [object Object] - */ - "@context"?: components["schemas"]["VocabModel"] - /** - * @Id - * @description Metadata node identifier. - */ - "@id": string - /** @Type */ - "@type": string - /** - * anatomicalAxesOrientation - * @description Relation between reference planes used in anatomy and mathematics. - */ - anatomicalAxesOrientation: { [key: string]: unknown } - /** - * Axesorigin - * @description Structured information on a quantitative value. - */ - axesOrigin: components["schemas"]["AxesOrigin"][] - /** - * defaultImage - * @description Two or three dimensional image that particluarly represents a specific coordinate space. - */ - defaultImage?: unknown[] - /** - * digitalIdentifier - * @description Digital handle to identify objects or legal persons. - */ - digitalIdentifier?: { [key: string]: unknown } - /** - * fullName - * @description Whole, non-abbreviated name of something or somebody. - */ - fullName: string - /** - * homepage - * @description Main website of something or someone. - */ - homepage?: { [key: string]: unknown } - /** - * howToCite - * @description Preferred format for citing a particular object or legal person. - */ - howToCite?: string - /** - * nativeUnit - * @description Determinate quantity used in the original measurement. - */ - nativeUnit: { [key: string]: unknown } - /** - * ontologyIdentifier - * @description Term or code used to identify something or someone registered within a particular ontology. - */ - ontologyIdentifier?: string[] - /** - * releaseDate - * Format: date - * @description Fixed date on which a product is due to become or was made available for the general public to see or buy - */ - releaseDate: string - /** - * shortName - * @description Shortened or fully abbreviated name of something or somebody. - */ - shortName: string - /** - * versionIdentifier - * @description Term or code used to identify the version of something. - */ - versionIdentifier: string - } - /** SerializationErrorModel */ - SerializationErrorModel: { - /** - * Type - * @constant - */ - type?: "spy/serialization-error" - /** Message */ - message: string - } - /** SiibraAtIdModel */ - SiibraAtIdModel: { - /** @Id */ - "@id": string - } - /** SiibraParcellationVersionModel */ - SiibraParcellationVersionModel: { - /** Name */ - name: string - /** Deprecated */ - deprecated?: boolean - prev?: components["schemas"]["SiibraAtIdModel"] - next?: components["schemas"]["SiibraAtIdModel"] - } - /** SpeciesModel */ - SpeciesModel: { - /** - * @Context - * @default [object Object] - */ - "@context"?: components["schemas"]["VocabModel"] - /** - * @Id - * @description Metadata node identifier. - */ - "@id": string - /** @Type */ - "@type": string - /** - * definition - * @description Short, but precise statement of the meaning of a word, word group, sign or a symbol. - */ - definition?: string - /** - * description - * @description Longer statement or account giving the characteristics of someone or something. - */ - description?: string - /** - * interlexIdentifier - * @description Persistent identifier for a term registered in the InterLex project. - */ - interlexIdentifier?: string - /** - * knowledgeSpaceLink - * @description Persistent link to an encyclopedia entry in the Knowledge Space project. - */ - knowledgeSpaceLink?: string - /** - * name - * @description Word or phrase that constitutes the distinctive designation of a being or thing. - */ - name: string - /** - * preferredOntologyIdentifier - * @description Persistent identifier of a preferred ontological term. - */ - preferredOntologyIdentifier?: string - /** - * synonym - * @description Words or expressions used in the same language that have the same or nearly the same meaning in some or all senses. - */ - synonym?: string[] - /** Kgv1Id */ - kgV1Id: string - } - /** SymbolMarkupClass */ - SymbolMarkupClass: { - receptor: components["schemas"]["ReceptorMarkupModel"] - neurotransmitter: components["schemas"]["NeurotransmitterMarkupModel"] - } - /** Url */ - Url: { - /** Doi */ - doi: string - /** Cite */ - cite?: string - } - /** VOIDataModel */ - VOIDataModel: { - /** @Id */ - "@id": string - /** - * @Type - * @constant - */ - "@type"?: "siibra/features/voi" - metadata: components["schemas"]["siibra__openminds__core__v4__products__datasetVersion__Model"] - /** Urls */ - urls: components["schemas"]["Url"][] - /** Volumes */ - volumes: components["schemas"]["VolumeModel"][] - location: components["schemas"]["BoundingBoxModel"] - } - /** ValidationError */ - ValidationError: { - /** Location */ - loc: (Partial<string> & Partial<number>)[] - /** Message */ - msg: string - /** Error Type */ - type: string - } - /** VocabModel */ - VocabModel: { - /** @Vocab */ - "@vocab": string - } - /** VolumeDataModel */ - VolumeDataModel: { - /** Type */ - type: string - /** Is Volume */ - is_volume: boolean - /** Is Surface */ - is_surface: boolean - /** Detail */ - detail: { [key: string]: unknown } - space: components["schemas"]["SiibraAtIdModel"] - /** Url */ - url?: string - /** Url Map */ - url_map?: { [key: string]: string } - /** Map Type */ - map_type?: string - /** Volume Type */ - volume_type?: string - } - /** VolumeModel */ - VolumeModel: { - /** @Id */ - "@id": string - /** @Type */ - "@type": string - metadata: components["schemas"]["siibra__openminds__core__v4__products__datasetVersion__Model"] - /** Urls */ - urls: components["schemas"]["Url"][] - data: components["schemas"]["VolumeDataModel"] - } - /** Copyright */ - siibra__openminds__SANDS__v3__atlas__brainAtlasVersion__Copyright: { - /** - * @Context - * @default [object Object] - */ - "@context"?: components["schemas"]["VocabModel"] - /** - * holder - * @description Legal person in possession of something. - */ - holder: unknown[] - /** - * year - * @description Cycle in the Gregorian calendar specified by a number and comprised of 365 or 366 days divided into 12 months beginning with January and ending with December. - */ - year: string - } - /** Model */ - siibra__openminds__SANDS__v3__atlas__brainAtlasVersion__Model: { - /** - * @Context - * @default [object Object] - */ - "@context"?: components["schemas"]["VocabModel"] - /** - * @Id - * @description Metadata node identifier. - */ - "@id": string - /** @Type */ - "@type": string - /** abbreviation */ - abbreviation?: string - /** - * accessibility - * @description Level to which something is accessible to someone or something. - */ - accessibility: { [key: string]: unknown } - /** atlasType */ - atlasType?: { [key: string]: unknown } - /** - * author - * @description Creator of a literary or creative work, as well as a dataset publication. - */ - author?: unknown[] - /** - * coordinateSpace - * @description Two or three dimensional geometric setting. - */ - coordinateSpace: { [key: string]: unknown } - /** - * Copyright - * @description Structured information on the copyright. - */ - copyright?: components["schemas"]["siibra__openminds__SANDS__v3__atlas__brainAtlasVersion__Copyright"] - /** - * custodian - * @description The 'custodian' is a legal person who is responsible for the content and quality of the data, metadata, and/or code of a research product. - */ - custodian?: unknown[] - /** - * description - * @description Longer statement or account giving the characteristics of someone or something. - */ - description?: string - /** - * digitalIdentifier - * @description Digital handle to identify objects or legal persons. - */ - digitalIdentifier?: { [key: string]: unknown } - /** - * fullDocumentation - * @description Non-abridged instructions, comments, and information for using a particular product. - */ - fullDocumentation: { [key: string]: unknown } - /** - * fullName - * @description Whole, non-abbreviated name of something or somebody. - */ - fullName?: string - /** - * funding - * @description Money provided by a legal person for a particular purpose. - */ - funding?: unknown[] - hasTerminologyVersion: components["schemas"]["HasTerminologyVersion"] - /** - * homepage - * @description Main website of something or someone. - */ - homepage?: { [key: string]: unknown } - /** - * howToCite - * @description Preferred format for citing a particular object or legal person. - */ - howToCite?: string - /** - * isAlternativeVersionOf - * @description Reference to an original form where the essence was preserved, but presented in an alternative form. - */ - isAlternativeVersionOf?: unknown[] - /** - * isNewVersionOf - * @description Reference to a previous (potentially outdated) particular form of something. - */ - isNewVersionOf?: { [key: string]: unknown } - /** - * keyword - * @description Significant word or concept that are representative of something or someone. - */ - keyword?: unknown[] - /** - * license - * @description Grant by a party to another party as an element of an agreement between those parties that permits to do, use, or own something. - */ - license: { [key: string]: unknown } - /** - * ontologyIdentifier - * @description Term or code used to identify something or someone registered within a particular ontology. - */ - ontologyIdentifier?: string[] - /** - * Othercontribution - * @description Structured information on the contribution made to a research product. - */ - otherContribution?: components["schemas"]["siibra__openminds__SANDS__v3__atlas__brainAtlasVersion__OtherContribution"] - /** - * relatedPublication - * @description Reference to something that was made available for the general public to see or buy. - */ - relatedPublication?: unknown[] - /** - * releaseDate - * Format: date - * @description Fixed date on which a product is due to become or was made available for the general public to see or buy - */ - releaseDate: string - /** - * repository - * @description Place, room, or container where something is deposited or stored. - */ - repository?: { [key: string]: unknown } - /** - * shortName - * @description Shortened or fully abbreviated name of something or somebody. - */ - shortName: string - /** - * supportChannel - * @description Way of communication used to interact with users or customers. - */ - supportChannel?: string[] - /** - * versionIdentifier - * @description Term or code used to identify the version of something. - */ - versionIdentifier: string - /** - * versionInnovation - * @description Documentation on what changed in comparison to a previously published form of something. - */ - versionInnovation: string - } - /** OtherContribution */ - siibra__openminds__SANDS__v3__atlas__brainAtlasVersion__OtherContribution: { - /** - * @Context - * @default [object Object] - */ - "@context"?: components["schemas"]["VocabModel"] - /** - * contributionType - * @description Distinct class of what was given or supplied as a part or share. - */ - contributionType: unknown[] - /** - * contributor - * @description Legal person that gave or supplied something as a part or share. - */ - contributor: unknown - } - /** Coordinates */ - siibra__openminds__SANDS__v3__atlas__parcellationEntityVersion__Coordinates: { - /** - * @Context - * @default [object Object] - */ - "@context"?: components["schemas"]["VocabModel"] - /** - * typeOfUncertainty - * @description Distinct technique used to quantify the uncertainty of a measurement. - */ - typeOfUncertainty?: unknown - /** - * uncertainty - * @description Quantitative value range defining the uncertainty of a measurement. - */ - uncertainty?: number[] - /** - * unit - * @description Determinate quantity adopted as a standard of measurement. - */ - unit?: unknown - /** - * value - * @description Entry for a property. - */ - value: number - } - /** Model */ - siibra__openminds__SANDS__v3__atlas__parcellationEntityVersion__Model: { - /** - * @Context - * @default [object Object] - */ - "@context"?: components["schemas"]["VocabModel"] - /** - * @Id - * @description Metadata node identifier. - */ - "@id": string - /** @Type */ - "@type": string - hasAnnotation?: components["schemas"]["HasAnnotation"] - /** - * hasParent - * @description Reference to a parent object or legal person. - */ - hasParent?: unknown[] - /** lookupLabel */ - lookupLabel?: string - /** - * name - * @description Word or phrase that constitutes the distinctive designation of a being or thing. - */ - name?: string - /** - * ontologyIdentifier - * @description Term or code used to identify something or someone registered within a particular ontology. - */ - ontologyIdentifier?: string[] - /** Relationassessment */ - relationAssessment?: Partial< - components["schemas"]["RelationAssessmentItem"] - > & - Partial<components["schemas"]["RelationAssessmentItem1"]> - /** - * versionIdentifier - * @description Term or code used to identify the version of something. - */ - versionIdentifier: string - /** - * versionInnovation - * @description Documentation on what changed in comparison to a previously published form of something. - */ - versionInnovation?: string - } - /** Coordinates */ - siibra__openminds__SANDS__v3__miscellaneous__coordinatePoint__Coordinates: { - /** - * @Context - * @default [object Object] - */ - "@context"?: components["schemas"]["VocabModel"] - /** - * typeOfUncertainty - * @description Distinct technique used to quantify the uncertainty of a measurement. - */ - typeOfUncertainty?: unknown - /** - * uncertainty - * @description Quantitative value range defining the uncertainty of a measurement. - */ - uncertainty?: number[] - /** - * unit - * @description Determinate quantity adopted as a standard of measurement. - */ - unit?: unknown - /** - * value - * @description Entry for a property. - */ - value: number - } - /** Model */ - siibra__openminds__SANDS__v3__miscellaneous__coordinatePoint__Model: { - /** - * @Context - * @default [object Object] - */ - "@context"?: components["schemas"]["VocabModel"] - /** - * @Id - * @description Metadata node identifier. - */ - "@id": string - /** @Type */ - "@type": string - /** - * coordinateSpace - * @description Two or three dimensional geometric setting. - */ - coordinateSpace: { [key: string]: unknown } - /** - * Coordinates - * @description Structured information on a quantitative value. - */ - coordinates: components["schemas"]["siibra__openminds__SANDS__v3__miscellaneous__coordinatePoint__Coordinates"][] - } - /** Copyright */ - siibra__openminds__core__v4__products__datasetVersion__Copyright: { - /** - * @Context - * @default [object Object] - */ - "@context"?: components["schemas"]["VocabModel"] - /** - * holder - * @description Legal person in possession of something. - */ - holder: unknown[] - /** - * year - * @description Cycle in the Gregorian calendar specified by a number and comprised of 365 or 366 days divided into 12 months beginning with January and ending with December. - */ - year: string - } - /** Model */ - siibra__openminds__core__v4__products__datasetVersion__Model: { - /** - * @Context - * @default [object Object] - */ - "@context"?: components["schemas"]["VocabModel"] - /** - * @Id - * @description Metadata node identifier. - */ - "@id": string - /** @Type */ - "@type": string - /** - * accessibility - * @description Level to which something is accessible to someone or something. - */ - accessibility: { [key: string]: unknown } - /** - * author - * @description Creator of a literary or creative work, as well as a dataset publication. - */ - author?: unknown[] - /** behavioralProtocol */ - behavioralProtocol?: unknown[] - /** - * Copyright - * @description Structured information on the copyright. - */ - copyright?: components["schemas"]["siibra__openminds__core__v4__products__datasetVersion__Copyright"] - /** - * custodian - * @description The 'custodian' is a legal person who is responsible for the content and quality of the data, metadata, and/or code of a research product. - */ - custodian?: unknown[] - /** dataType */ - dataType: unknown[] - /** - * description - * @description Longer statement or account giving the characteristics of someone or something. - */ - description?: string - /** - * digitalIdentifier - * @description Digital handle to identify objects or legal persons. - */ - digitalIdentifier: { [key: string]: unknown } - /** - * ethicsAssessment - * @description Judgment about the applied principles of conduct governing an individual or a group. - */ - ethicsAssessment: { [key: string]: unknown } - /** experimentalApproach */ - experimentalApproach: unknown[] - /** - * fullDocumentation - * @description Non-abridged instructions, comments, and information for using a particular product. - */ - fullDocumentation: { [key: string]: unknown } - /** - * fullName - * @description Whole, non-abbreviated name of something or somebody. - */ - fullName?: string - /** - * funding - * @description Money provided by a legal person for a particular purpose. - */ - funding?: unknown[] - /** - * homepage - * @description Main website of something or someone. - */ - homepage?: { [key: string]: unknown } - /** - * howToCite - * @description Preferred format for citing a particular object or legal person. - */ - howToCite?: string - /** - * inputData - * @description Data that is put into a process or machine. - */ - inputData?: unknown[] - /** - * isAlternativeVersionOf - * @description Reference to an original form where the essence was preserved, but presented in an alternative form. - */ - isAlternativeVersionOf?: unknown[] - /** - * isNewVersionOf - * @description Reference to a previous (potentially outdated) particular form of something. - */ - isNewVersionOf?: { [key: string]: unknown } - /** - * keyword - * @description Significant word or concept that are representative of something or someone. - */ - keyword?: unknown[] - /** - * license - * @description Grant by a party to another party as an element of an agreement between those parties that permits to do, use, or own something. - */ - license: { [key: string]: unknown } - /** - * Othercontribution - * @description Structured information on the contribution made to a research product. - */ - otherContribution?: components["schemas"]["siibra__openminds__core__v4__products__datasetVersion__OtherContribution"] - /** preparationDesign */ - preparationDesign?: unknown[] - /** - * relatedPublication - * @description Reference to something that was made available for the general public to see or buy. - */ - relatedPublication?: unknown[] - /** - * releaseDate - * Format: date - * @description Fixed date on which a product is due to become or was made available for the general public to see or buy - */ - releaseDate: string - /** - * repository - * @description Place, room, or container where something is deposited or stored. - */ - repository?: { [key: string]: unknown } - /** - * shortName - * @description Shortened or fully abbreviated name of something or somebody. - */ - shortName: string - /** studiedSpecimen */ - studiedSpecimen?: unknown[] - /** - * studyTarget - * @description Structure or function that was targeted within a study. - */ - studyTarget?: unknown[] - /** - * supportChannel - * @description Way of communication used to interact with users or customers. - */ - supportChannel?: string[] - /** - * technique - * @description Method of accomplishing a desired aim. - */ - technique: unknown[] - /** - * versionIdentifier - * @description Term or code used to identify the version of something. - */ - versionIdentifier: string - /** - * versionInnovation - * @description Documentation on what changed in comparison to a previously published form of something. - */ - versionInnovation: string - } - /** OtherContribution */ - siibra__openminds__core__v4__products__datasetVersion__OtherContribution: { - /** - * @Context - * @default [object Object] - */ - "@context"?: components["schemas"]["VocabModel"] - /** - * contributionType - * @description Distinct class of what was given or supplied as a part or share. - */ - contributionType: unknown[] - /** - * contributor - * @description Legal person that gave or supplied something as a part or share. - */ - contributor: unknown - } - } -} +// export interface components { +// schemas: { +// /** AutoradiographyDataModel */ +// AutoradiographyDataModel: { +// /** +// * Content Type +// * @default application/octet-stream +// */ +// content_type?: string +// /** +// * Content Encoding +// * @default gzip; base64 +// */ +// content_encoding?: string +// /** X-Width */ +// "x-width": number +// /** X-Height */ +// "x-height": number +// /** X-Channel */ +// "x-channel": number +// /** Dtype */ +// dtype: string +// /** Content */ +// content: string +// } +// /** AxesOrigin */ +// AxesOrigin: { +// /** +// * @Context +// * @default [object Object] +// */ +// "@context"?: components["schemas"]["VocabModel"] +// /** +// * typeOfUncertainty +// * @description Distinct technique used to quantify the uncertainty of a measurement. +// */ +// typeOfUncertainty?: unknown +// /** +// * uncertainty +// * @description Quantitative value range defining the uncertainty of a measurement. +// */ +// uncertainty?: number[] +// /** +// * unit +// * @description Determinate quantity adopted as a standard of measurement. +// */ +// unit?: unknown +// /** +// * value +// * @description Entry for a property. +// */ +// value: number +// } +// /** BaseDatasetJsonModel */ +// BaseDatasetJsonModel: { +// /** @Id */ +// "@id": string +// /** +// * @Type +// * @constant +// */ +// "@type"?: "https://openminds.ebrains.eu/core/DatasetVersion" +// metadata: components["schemas"]["siibra__openminds__core__v4__products__datasetVersion__Model"] +// /** Urls */ +// urls: components["schemas"]["Url"][] +// } +// /** BestViewPoint */ +// BestViewPoint: { +// /** +// * @Context +// * @default [object Object] +// */ +// "@context"?: components["schemas"]["VocabModel"] +// /** +// * coordinateSpace +// * @description Two or three dimensional geometric setting. +// */ +// coordinateSpace: unknown +// /** +// * Coordinates +// * @description Structured information on a quantitative value. +// */ +// coordinates: components["schemas"]["siibra__openminds__SANDS__v3__atlas__parcellationEntityVersion__Coordinates"][] +// } +// /** BoundingBoxModel */ +// BoundingBoxModel: { +// /** @Type */ +// "@type": string +// /** Space */ +// space: { [key: string]: string } +// center: components["schemas"]["siibra__openminds__SANDS__v3__miscellaneous__coordinatePoint__Model"] +// minpoint: components["schemas"]["siibra__openminds__SANDS__v3__miscellaneous__coordinatePoint__Model"] +// maxpoint: components["schemas"]["siibra__openminds__SANDS__v3__miscellaneous__coordinatePoint__Model"] +// /** Shape */ +// shape: number[] +// /** Isplanar */ +// isPlanar: boolean +// } +// /** ConnectivityMatrixDataModel */ +// ConnectivityMatrixDataModel: { +// /** @Id */ +// "@id": string +// /** @Type */ +// "@type": string +// /** Name */ +// name?: string +// /** Description */ +// description?: string +// /** Citation */ +// citation?: string +// /** Authors */ +// authors?: string[] +// /** Cohort */ +// cohort?: string +// /** Subject */ +// subject?: string +// /** Filename */ +// filename?: string +// /** Dataset Id */ +// dataset_id?: string +// /** Parcellations */ +// parcellations: { [key: string]: string }[] +// matrix?: components["schemas"]["NpArrayDataModel"] +// /** Columns */ +// columns?: string[] +// } +// /** CorticalCellDistributionModel */ +// CorticalCellDistributionModel: { +// /** @Id */ +// "@id": string +// /** +// * @Type +// * @constant +// */ +// "@type"?: "siibra/features/cells" +// metadata: components["schemas"]["siibra__openminds__core__v4__products__datasetVersion__Model"] +// /** Urls */ +// urls: components["schemas"]["Url"][] +// /** Cells */ +// cells?: components["schemas"]["CorticalCellModel"][] +// /** Section */ +// section?: string +// /** Patch */ +// patch?: string +// } +// /** CorticalCellModel */ +// CorticalCellModel: { +// /** X */ +// x: number +// /** Y */ +// y: number +// /** Area */ +// area: number +// /** Layer */ +// layer: number +// /** Instance Label */ +// "instance label": number +// } +// /** DatasetJsonModel */ +// DatasetJsonModel: { +// /** @Id */ +// "@id": string +// /** +// * @Type +// * @constant +// */ +// "@type"?: "https://openminds.ebrains.eu/core/DatasetVersion" +// metadata: components["schemas"]["siibra__openminds__core__v4__products__datasetVersion__Model"] +// /** Urls */ +// urls: components["schemas"]["Url"][] +// } +// /** FingerPrintDataModel */ +// FingerPrintDataModel: { +// /** Mean */ +// mean: number +// /** Std */ +// std: number +// /** Unit */ +// unit: string +// } +// /** HTTPValidationError */ +// HTTPValidationError: { +// /** Detail */ +// detail?: components["schemas"]["ValidationError"][] +// } +// /** HasAnnotation */ +// HasAnnotation: { +// /** +// * @Context +// * @default [object Object] +// */ +// "@context"?: components["schemas"]["VocabModel"] +// /** +// * Bestviewpoint +// * @description Structured information on a coordinate point. +// */ +// bestViewPoint?: components["schemas"]["BestViewPoint"] +// /** +// * criteria +// * @description Aspects or standards on which a judgement or decision is based. +// */ +// criteria?: unknown +// /** +// * criteriaQualityType +// * @description Distinct class that defines how the judgement or decision was made for a particular criteria. +// */ +// criteriaQualityType: unknown +// /** +// * displayColor +// * @description Preferred coloring. +// */ +// displayColor?: string +// /** +// * inspiredBy +// * @description Reference to an inspiring element. +// */ +// inspiredBy?: unknown[] +// /** +// * internalIdentifier +// * @description Term or code that identifies someone or something within a particular product. +// */ +// internalIdentifier: string +// /** +// * laterality +// * @description Differentiation between a pair of lateral homologous parts of the body. +// */ +// laterality?: unknown[] +// /** +// * visualizedIn +// * @description Reference to an image in which something is visible. +// */ +// visualizedIn?: unknown +// } +// /** HasTerminologyVersion */ +// HasTerminologyVersion: { +// /** +// * @Context +// * @default [object Object] +// */ +// "@context"?: components["schemas"]["VocabModel"] +// /** +// * definedIn +// * @description Reference to a file instance in which something is stored. +// */ +// definedIn?: unknown[] +// /** hasEntityVersion */ +// hasEntityVersion: unknown[] +// /** +// * ontologyIdentifier +// * @description Term or code used to identify something or someone registered within a particular ontology. +// */ +// ontologyIdentifier?: string[] +// } +// /** HrefModel */ +// HrefModel: { +// /** Href */ +// href: string +// } +// /** IEEGContactPointModel */ +// IEEGContactPointModel: { +// /** Inroi */ +// inRoi?: boolean +// /** Id */ +// id: string +// point: components["schemas"]["siibra__openminds__SANDS__v3__miscellaneous__coordinatePoint__Model"] +// } +// /** IEEGElectrodeModel */ +// IEEGElectrodeModel: { +// /** Inroi */ +// inRoi?: boolean +// /** Electrode Id */ +// electrode_id: string +// /** Contact Points */ +// contact_points: { +// [key: string]: components["schemas"]["IEEGContactPointModel"] +// } +// } +// /** IEEGSessionModel */ +// IEEGSessionModel: { +// /** Inroi */ +// inRoi?: boolean +// /** @Id */ +// "@id": string +// /** +// * @Type +// * @constant +// */ +// "@type"?: "siibra/features/ieegSession" +// dataset: components["schemas"]["DatasetJsonModel"] +// /** Sub Id */ +// sub_id: string +// /** Electrodes */ +// electrodes: { +// [key: string]: components["schemas"]["IEEGElectrodeModel"] +// } +// } +// /** NeurotransmitterMarkupModel */ +// NeurotransmitterMarkupModel: { +// /** Latex */ +// latex: string +// /** Markdown */ +// markdown: string +// /** Name */ +// name: string +// /** Label */ +// label: string +// } +// /** NiiMetadataModel */ +// NiiMetadataModel: { +// /** Min */ +// min: number +// /** Max */ +// max: number +// } +// /** NpArrayDataModel */ +// NpArrayDataModel: { +// /** +// * Content Type +// * @default application/octet-stream +// */ +// content_type?: string +// /** +// * Content Encoding +// * @default gzip; base64 +// */ +// content_encoding?: string +// /** X-Width */ +// "x-width": number +// /** X-Height */ +// "x-height": number +// /** X-Channel */ +// "x-channel": number +// /** Dtype */ +// dtype: string +// /** Content */ +// content: string +// } +// /** Page[Union[siibra.features.connectivity.ConnectivityMatrixDataModel, app.models.SerializationErrorModel]] */ +// "Page_Union_siibra.features.connectivity.ConnectivityMatrixDataModel__app.models.SerializationErrorModel__": { +// /** Items */ +// items: (Partial<components["schemas"]["ConnectivityMatrixDataModel"]> & +// Partial<components["schemas"]["SerializationErrorModel"]>)[] +// /** Total */ +// total: number +// /** Page */ +// page: number +// /** Size */ +// size: number +// } +// /** Page[VolumeModel] */ +// Page_VolumeModel_: { +// /** Items */ +// items: components["schemas"]["VolumeModel"][] +// /** Total */ +// total: number +// /** Page */ +// page: number +// /** Size */ +// size: number +// } +// /** ProfileDataModel */ +// ProfileDataModel: { +// density: components["schemas"]["NpArrayDataModel"] +// /** Unit */ +// unit: string +// } +// /** QuantitativeOverlapItem */ +// QuantitativeOverlapItem: { +// /** +// * @Context +// * @default [object Object] +// */ +// "@context"?: components["schemas"]["VocabModel"] +// /** +// * typeOfUncertainty +// * @description Distinct technique used to quantify the uncertainty of a measurement. +// */ +// typeOfUncertainty?: unknown +// /** +// * uncertainty +// * @description Quantitative value range defining the uncertainty of a measurement. +// */ +// uncertainty?: number[] +// /** +// * unit +// * @description Determinate quantity adopted as a standard of measurement. +// */ +// unit?: unknown +// /** +// * value +// * @description Entry for a property. +// */ +// value: number +// } +// /** QuantitativeOverlapItem1 */ +// QuantitativeOverlapItem1: { +// /** +// * @Context +// * @default [object Object] +// */ +// "@context"?: components["schemas"]["VocabModel"] +// /** +// * maxValue +// * @description Greatest quantity attained or allowed. +// */ +// maxValue: number +// /** maxValueUnit */ +// maxValueUnit?: unknown +// /** +// * minValue +// * @description Smallest quantity attained or allowed. +// */ +// minValue: number +// /** minValueUnit */ +// minValueUnit?: unknown +// } +// /** ReceptorDataModel */ +// ReceptorDataModel: { +// /** Autoradiographs */ +// autoradiographs: { +// [key: string]: components["schemas"]["AutoradiographyDataModel"] +// } +// /** Profiles */ +// profiles: { [key: string]: components["schemas"]["ProfileDataModel"] } +// /** Fingerprints */ +// fingerprints: { +// [key: string]: components["schemas"]["FingerPrintDataModel"] +// } +// /** Receptor Symbols */ +// receptor_symbols: { +// [key: string]: components["schemas"]["SymbolMarkupClass"] +// } +// } +// /** ReceptorDatasetModel */ +// ReceptorDatasetModel: { +// /** @Id */ +// "@id": string +// /** +// * @Type +// * @constant +// */ +// "@type"?: "siibra/features/receptor" +// metadata: components["schemas"]["siibra__openminds__core__v4__products__datasetVersion__Model"] +// /** Urls */ +// urls: components["schemas"]["Url"][] +// data?: components["schemas"]["ReceptorDataModel"] +// } +// /** ReceptorMarkupModel */ +// ReceptorMarkupModel: { +// /** Latex */ +// latex: string +// /** Markdown */ +// markdown: string +// /** Name */ +// name: string +// } +// /** RelationAssessmentItem */ +// RelationAssessmentItem: { +// /** +// * @Context +// * @default [object Object] +// */ +// "@context"?: components["schemas"]["VocabModel"] +// /** +// * criteria +// * @description Aspects or standards on which a judgement or decision is based. +// */ +// criteria?: unknown +// /** +// * inRelationTo +// * @description Reference to a related element. +// */ +// inRelationTo: unknown +// /** +// * qualitativeOverlap +// * @description Semantic characterization of how much two things occupy the same space. +// */ +// qualitativeOverlap: unknown +// } +// /** RelationAssessmentItem1 */ +// RelationAssessmentItem1: { +// /** +// * @Context +// * @default [object Object] +// */ +// "@context"?: components["schemas"]["VocabModel"] +// /** +// * criteria +// * @description Aspects or standards on which a judgement or decision is based. +// */ +// criteria?: unknown +// /** +// * inRelationTo +// * @description Reference to a related element. +// */ +// inRelationTo: unknown +// /** Quantitativeoverlap */ +// quantitativeOverlap: Partial< +// components["schemas"]["QuantitativeOverlapItem"] +// > & +// Partial<components["schemas"]["QuantitativeOverlapItem1"]> +// } +// /** SapiAtlasModel */ +// SapiAtlasModel: { +// /** Links */ +// links: { [key: string]: components["schemas"]["HrefModel"] } +// /** @Id */ +// "@id": string +// /** Name */ +// name: string +// /** +// * @Type +// * @constant +// */ +// "@type"?: "juelich/iav/atlas/v1.0.0" +// /** Spaces */ +// spaces: components["schemas"]["SiibraAtIdModel"][] +// /** Parcellations */ +// parcellations: components["schemas"]["SiibraAtIdModel"][] +// species: components["schemas"]["SpeciesModel"] +// } +// /** SapiParcellationModel */ +// SapiParcellationModel: { +// /** Links */ +// links: { [key: string]: components["schemas"]["HrefModel"] } +// /** @Id */ +// "@id": string +// /** +// * @Type +// * @constant +// */ +// "@type"?: "minds/core/parcellationatlas/v1.0.0" +// /** Name */ +// name: string +// /** Modality */ +// modality?: string +// /** Datasets */ +// datasets: components["schemas"]["DatasetJsonModel"][] +// /** Brainatlasversions */ +// brainAtlasVersions: components["schemas"]["siibra__openminds__SANDS__v3__atlas__brainAtlasVersion__Model"][] +// version?: components["schemas"]["SiibraParcellationVersionModel"] +// } +// /** SapiSpaceModel */ +// SapiSpaceModel: { +// /** Links */ +// links: { [key: string]: components["schemas"]["HrefModel"] } +// /** +// * @Context +// * @default [object Object] +// */ +// "@context"?: components["schemas"]["VocabModel"] +// /** +// * @Id +// * @description Metadata node identifier. +// */ +// "@id": string +// /** @Type */ +// "@type": string +// /** +// * anatomicalAxesOrientation +// * @description Relation between reference planes used in anatomy and mathematics. +// */ +// anatomicalAxesOrientation: { [key: string]: unknown } +// /** +// * Axesorigin +// * @description Structured information on a quantitative value. +// */ +// axesOrigin: components["schemas"]["AxesOrigin"][] +// /** +// * defaultImage +// * @description Two or three dimensional image that particluarly represents a specific coordinate space. +// */ +// defaultImage?: unknown[] +// /** +// * digitalIdentifier +// * @description Digital handle to identify objects or legal persons. +// */ +// digitalIdentifier?: { [key: string]: unknown } +// /** +// * fullName +// * @description Whole, non-abbreviated name of something or somebody. +// */ +// fullName: string +// /** +// * homepage +// * @description Main website of something or someone. +// */ +// homepage?: { [key: string]: unknown } +// /** +// * howToCite +// * @description Preferred format for citing a particular object or legal person. +// */ +// howToCite?: string +// /** +// * nativeUnit +// * @description Determinate quantity used in the original measurement. +// */ +// nativeUnit: { [key: string]: unknown } +// /** +// * ontologyIdentifier +// * @description Term or code used to identify something or someone registered within a particular ontology. +// */ +// ontologyIdentifier?: string[] +// /** +// * releaseDate +// * Format: date +// * @description Fixed date on which a product is due to become or was made available for the general public to see or buy +// */ +// releaseDate: string +// /** +// * shortName +// * @description Shortened or fully abbreviated name of something or somebody. +// */ +// shortName: string +// /** +// * versionIdentifier +// * @description Term or code used to identify the version of something. +// */ +// versionIdentifier: string +// } +// /** SerializationErrorModel */ +// SerializationErrorModel: { +// /** +// * Type +// * @constant +// */ +// type?: "spy/serialization-error" +// /** Message */ +// message: string +// } +// /** SiibraAtIdModel */ +// SiibraAtIdModel: { +// /** @Id */ +// "@id": string +// } +// /** SiibraParcellationVersionModel */ +// SiibraParcellationVersionModel: { +// /** Name */ +// name: string +// /** Deprecated */ +// deprecated?: boolean +// prev?: components["schemas"]["SiibraAtIdModel"] +// next?: components["schemas"]["SiibraAtIdModel"] +// } +// /** SpeciesModel */ +// SpeciesModel: { +// /** +// * @Context +// * @default [object Object] +// */ +// "@context"?: components["schemas"]["VocabModel"] +// /** +// * @Id +// * @description Metadata node identifier. +// */ +// "@id": string +// /** @Type */ +// "@type": string +// /** +// * definition +// * @description Short, but precise statement of the meaning of a word, word group, sign or a symbol. +// */ +// definition?: string +// /** +// * description +// * @description Longer statement or account giving the characteristics of someone or something. +// */ +// description?: string +// /** +// * interlexIdentifier +// * @description Persistent identifier for a term registered in the InterLex project. +// */ +// interlexIdentifier?: string +// /** +// * knowledgeSpaceLink +// * @description Persistent link to an encyclopedia entry in the Knowledge Space project. +// */ +// knowledgeSpaceLink?: string +// /** +// * name +// * @description Word or phrase that constitutes the distinctive designation of a being or thing. +// */ +// name: string +// /** +// * preferredOntologyIdentifier +// * @description Persistent identifier of a preferred ontological term. +// */ +// preferredOntologyIdentifier?: string +// /** +// * synonym +// * @description Words or expressions used in the same language that have the same or nearly the same meaning in some or all senses. +// */ +// synonym?: string[] +// /** Kgv1Id */ +// kgV1Id: string +// } +// /** SymbolMarkupClass */ +// SymbolMarkupClass: { +// receptor: components["schemas"]["ReceptorMarkupModel"] +// neurotransmitter: components["schemas"]["NeurotransmitterMarkupModel"] +// } +// /** Url */ +// Url: { +// /** Doi */ +// doi: string +// /** Cite */ +// cite?: string +// } +// /** VOIDataModel */ +// VOIDataModel: { +// /** @Id */ +// "@id": string +// /** +// * @Type +// * @constant +// */ +// "@type"?: "siibra/features/voi" +// metadata: components["schemas"]["siibra__openminds__core__v4__products__datasetVersion__Model"] +// /** Urls */ +// urls: components["schemas"]["Url"][] +// /** Volumes */ +// volumes: components["schemas"]["VolumeModel"][] +// location: components["schemas"]["BoundingBoxModel"] +// } +// /** ValidationError */ +// ValidationError: { +// /** Location */ +// loc: (Partial<string> & Partial<number>)[] +// /** Message */ +// msg: string +// /** Error Type */ +// type: string +// } +// /** VocabModel */ +// VocabModel: { +// /** @Vocab */ +// "@vocab": string +// } +// /** VolumeDataModel */ +// VolumeDataModel: { +// /** Type */ +// type: string +// /** Is Volume */ +// is_volume: boolean +// /** Is Surface */ +// is_surface: boolean +// /** Detail */ +// detail: { [key: string]: unknown } +// space: components["schemas"]["SiibraAtIdModel"] +// /** Url */ +// url?: string +// /** Url Map */ +// url_map?: { [key: string]: string } +// /** Map Type */ +// map_type?: string +// /** Volume Type */ +// volume_type?: string +// } +// /** VolumeModel */ +// VolumeModel: { +// /** @Id */ +// "@id": string +// /** @Type */ +// "@type": string +// metadata: components["schemas"]["siibra__openminds__core__v4__products__datasetVersion__Model"] +// /** Urls */ +// urls: components["schemas"]["Url"][] +// data: components["schemas"]["VolumeDataModel"] +// } +// /** Copyright */ +// siibra__openminds__SANDS__v3__atlas__brainAtlasVersion__Copyright: { +// /** +// * @Context +// * @default [object Object] +// */ +// "@context"?: components["schemas"]["VocabModel"] +// /** +// * holder +// * @description Legal person in possession of something. +// */ +// holder: unknown[] +// /** +// * year +// * @description Cycle in the Gregorian calendar specified by a number and comprised of 365 or 366 days divided into 12 months beginning with January and ending with December. +// */ +// year: string +// } +// /** Model */ +// siibra__openminds__SANDS__v3__atlas__brainAtlasVersion__Model: { +// /** +// * @Context +// * @default [object Object] +// */ +// "@context"?: components["schemas"]["VocabModel"] +// /** +// * @Id +// * @description Metadata node identifier. +// */ +// "@id": string +// /** @Type */ +// "@type": string +// /** abbreviation */ +// abbreviation?: string +// /** +// * accessibility +// * @description Level to which something is accessible to someone or something. +// */ +// accessibility: { [key: string]: unknown } +// /** atlasType */ +// atlasType?: { [key: string]: unknown } +// /** +// * author +// * @description Creator of a literary or creative work, as well as a dataset publication. +// */ +// author?: unknown[] +// /** +// * coordinateSpace +// * @description Two or three dimensional geometric setting. +// */ +// coordinateSpace: { [key: string]: unknown } +// /** +// * Copyright +// * @description Structured information on the copyright. +// */ +// copyright?: components["schemas"]["siibra__openminds__SANDS__v3__atlas__brainAtlasVersion__Copyright"] +// /** +// * custodian +// * @description The 'custodian' is a legal person who is responsible for the content and quality of the data, metadata, and/or code of a research product. +// */ +// custodian?: unknown[] +// /** +// * description +// * @description Longer statement or account giving the characteristics of someone or something. +// */ +// description?: string +// /** +// * digitalIdentifier +// * @description Digital handle to identify objects or legal persons. +// */ +// digitalIdentifier?: { [key: string]: unknown } +// /** +// * fullDocumentation +// * @description Non-abridged instructions, comments, and information for using a particular product. +// */ +// fullDocumentation: { [key: string]: unknown } +// /** +// * fullName +// * @description Whole, non-abbreviated name of something or somebody. +// */ +// fullName?: string +// /** +// * funding +// * @description Money provided by a legal person for a particular purpose. +// */ +// funding?: unknown[] +// hasTerminologyVersion: components["schemas"]["HasTerminologyVersion"] +// /** +// * homepage +// * @description Main website of something or someone. +// */ +// homepage?: { [key: string]: unknown } +// /** +// * howToCite +// * @description Preferred format for citing a particular object or legal person. +// */ +// howToCite?: string +// /** +// * isAlternativeVersionOf +// * @description Reference to an original form where the essence was preserved, but presented in an alternative form. +// */ +// isAlternativeVersionOf?: unknown[] +// /** +// * isNewVersionOf +// * @description Reference to a previous (potentially outdated) particular form of something. +// */ +// isNewVersionOf?: { [key: string]: unknown } +// /** +// * keyword +// * @description Significant word or concept that are representative of something or someone. +// */ +// keyword?: unknown[] +// /** +// * license +// * @description Grant by a party to another party as an element of an agreement between those parties that permits to do, use, or own something. +// */ +// license: { [key: string]: unknown } +// /** +// * ontologyIdentifier +// * @description Term or code used to identify something or someone registered within a particular ontology. +// */ +// ontologyIdentifier?: string[] +// /** +// * Othercontribution +// * @description Structured information on the contribution made to a research product. +// */ +// otherContribution?: components["schemas"]["siibra__openminds__SANDS__v3__atlas__brainAtlasVersion__OtherContribution"] +// /** +// * relatedPublication +// * @description Reference to something that was made available for the general public to see or buy. +// */ +// relatedPublication?: unknown[] +// /** +// * releaseDate +// * Format: date +// * @description Fixed date on which a product is due to become or was made available for the general public to see or buy +// */ +// releaseDate: string +// /** +// * repository +// * @description Place, room, or container where something is deposited or stored. +// */ +// repository?: { [key: string]: unknown } +// /** +// * shortName +// * @description Shortened or fully abbreviated name of something or somebody. +// */ +// shortName: string +// /** +// * supportChannel +// * @description Way of communication used to interact with users or customers. +// */ +// supportChannel?: string[] +// /** +// * versionIdentifier +// * @description Term or code used to identify the version of something. +// */ +// versionIdentifier: string +// /** +// * versionInnovation +// * @description Documentation on what changed in comparison to a previously published form of something. +// */ +// versionInnovation: string +// } +// /** OtherContribution */ +// siibra__openminds__SANDS__v3__atlas__brainAtlasVersion__OtherContribution: { +// /** +// * @Context +// * @default [object Object] +// */ +// "@context"?: components["schemas"]["VocabModel"] +// /** +// * contributionType +// * @description Distinct class of what was given or supplied as a part or share. +// */ +// contributionType: unknown[] +// /** +// * contributor +// * @description Legal person that gave or supplied something as a part or share. +// */ +// contributor: unknown +// } +// /** Coordinates */ +// siibra__openminds__SANDS__v3__atlas__parcellationEntityVersion__Coordinates: { +// /** +// * @Context +// * @default [object Object] +// */ +// "@context"?: components["schemas"]["VocabModel"] +// /** +// * typeOfUncertainty +// * @description Distinct technique used to quantify the uncertainty of a measurement. +// */ +// typeOfUncertainty?: unknown +// /** +// * uncertainty +// * @description Quantitative value range defining the uncertainty of a measurement. +// */ +// uncertainty?: number[] +// /** +// * unit +// * @description Determinate quantity adopted as a standard of measurement. +// */ +// unit?: unknown +// /** +// * value +// * @description Entry for a property. +// */ +// value: number +// } +// /** Model */ +// siibra__openminds__SANDS__v3__atlas__parcellationEntityVersion__Model: { +// /** +// * @Context +// * @default [object Object] +// */ +// "@context"?: components["schemas"]["VocabModel"] +// /** +// * @Id +// * @description Metadata node identifier. +// */ +// "@id": string +// /** @Type */ +// "@type": string +// hasAnnotation?: components["schemas"]["HasAnnotation"] +// /** +// * hasParent +// * @description Reference to a parent object or legal person. +// */ +// hasParent?: unknown[] +// /** lookupLabel */ +// lookupLabel?: string +// /** +// * name +// * @description Word or phrase that constitutes the distinctive designation of a being or thing. +// */ +// name?: string +// /** +// * ontologyIdentifier +// * @description Term or code used to identify something or someone registered within a particular ontology. +// */ +// ontologyIdentifier?: string[] +// /** Relationassessment */ +// relationAssessment?: Partial< +// components["schemas"]["RelationAssessmentItem"] +// > & +// Partial<components["schemas"]["RelationAssessmentItem1"]> +// /** +// * versionIdentifier +// * @description Term or code used to identify the version of something. +// */ +// versionIdentifier: string +// /** +// * versionInnovation +// * @description Documentation on what changed in comparison to a previously published form of something. +// */ +// versionInnovation?: string +// } +// /** Coordinates */ +// siibra__openminds__SANDS__v3__miscellaneous__coordinatePoint__Coordinates: { +// /** +// * @Context +// * @default [object Object] +// */ +// "@context"?: components["schemas"]["VocabModel"] +// /** +// * typeOfUncertainty +// * @description Distinct technique used to quantify the uncertainty of a measurement. +// */ +// typeOfUncertainty?: unknown +// /** +// * uncertainty +// * @description Quantitative value range defining the uncertainty of a measurement. +// */ +// uncertainty?: number[] +// /** +// * unit +// * @description Determinate quantity adopted as a standard of measurement. +// */ +// unit?: unknown +// /** +// * value +// * @description Entry for a property. +// */ +// value: number +// } +// /** Model */ +// siibra__openminds__SANDS__v3__miscellaneous__coordinatePoint__Model: { +// /** +// * @Context +// * @default [object Object] +// */ +// "@context"?: components["schemas"]["VocabModel"] +// /** +// * @Id +// * @description Metadata node identifier. +// */ +// "@id": string +// /** @Type */ +// "@type": string +// /** +// * coordinateSpace +// * @description Two or three dimensional geometric setting. +// */ +// coordinateSpace: { [key: string]: unknown } +// /** +// * Coordinates +// * @description Structured information on a quantitative value. +// */ +// coordinates: components["schemas"]["siibra__openminds__SANDS__v3__miscellaneous__coordinatePoint__Coordinates"][] +// } +// /** Copyright */ +// siibra__openminds__core__v4__products__datasetVersion__Copyright: { +// /** +// * @Context +// * @default [object Object] +// */ +// "@context"?: components["schemas"]["VocabModel"] +// /** +// * holder +// * @description Legal person in possession of something. +// */ +// holder: unknown[] +// /** +// * year +// * @description Cycle in the Gregorian calendar specified by a number and comprised of 365 or 366 days divided into 12 months beginning with January and ending with December. +// */ +// year: string +// } +// /** Model */ +// siibra__openminds__core__v4__products__datasetVersion__Model: { +// /** +// * @Context +// * @default [object Object] +// */ +// "@context"?: components["schemas"]["VocabModel"] +// /** +// * @Id +// * @description Metadata node identifier. +// */ +// "@id": string +// /** @Type */ +// "@type": string +// /** +// * accessibility +// * @description Level to which something is accessible to someone or something. +// */ +// accessibility: { [key: string]: unknown } +// /** +// * author +// * @description Creator of a literary or creative work, as well as a dataset publication. +// */ +// author?: unknown[] +// /** behavioralProtocol */ +// behavioralProtocol?: unknown[] +// /** +// * Copyright +// * @description Structured information on the copyright. +// */ +// copyright?: components["schemas"]["siibra__openminds__core__v4__products__datasetVersion__Copyright"] +// /** +// * custodian +// * @description The 'custodian' is a legal person who is responsible for the content and quality of the data, metadata, and/or code of a research product. +// */ +// custodian?: unknown[] +// /** dataType */ +// dataType: unknown[] +// /** +// * description +// * @description Longer statement or account giving the characteristics of someone or something. +// */ +// description?: string +// /** +// * digitalIdentifier +// * @description Digital handle to identify objects or legal persons. +// */ +// digitalIdentifier: { [key: string]: unknown } +// /** +// * ethicsAssessment +// * @description Judgment about the applied principles of conduct governing an individual or a group. +// */ +// ethicsAssessment: { [key: string]: unknown } +// /** experimentalApproach */ +// experimentalApproach: unknown[] +// /** +// * fullDocumentation +// * @description Non-abridged instructions, comments, and information for using a particular product. +// */ +// fullDocumentation: { [key: string]: unknown } +// /** +// * fullName +// * @description Whole, non-abbreviated name of something or somebody. +// */ +// fullName?: string +// /** +// * funding +// * @description Money provided by a legal person for a particular purpose. +// */ +// funding?: unknown[] +// /** +// * homepage +// * @description Main website of something or someone. +// */ +// homepage?: { [key: string]: unknown } +// /** +// * howToCite +// * @description Preferred format for citing a particular object or legal person. +// */ +// howToCite?: string +// /** +// * inputData +// * @description Data that is put into a process or machine. +// */ +// inputData?: unknown[] +// /** +// * isAlternativeVersionOf +// * @description Reference to an original form where the essence was preserved, but presented in an alternative form. +// */ +// isAlternativeVersionOf?: unknown[] +// /** +// * isNewVersionOf +// * @description Reference to a previous (potentially outdated) particular form of something. +// */ +// isNewVersionOf?: { [key: string]: unknown } +// /** +// * keyword +// * @description Significant word or concept that are representative of something or someone. +// */ +// keyword?: unknown[] +// /** +// * license +// * @description Grant by a party to another party as an element of an agreement between those parties that permits to do, use, or own something. +// */ +// license: { [key: string]: unknown } +// /** +// * Othercontribution +// * @description Structured information on the contribution made to a research product. +// */ +// otherContribution?: components["schemas"]["siibra__openminds__core__v4__products__datasetVersion__OtherContribution"] +// /** preparationDesign */ +// preparationDesign?: unknown[] +// /** +// * relatedPublication +// * @description Reference to something that was made available for the general public to see or buy. +// */ +// relatedPublication?: unknown[] +// /** +// * releaseDate +// * Format: date +// * @description Fixed date on which a product is due to become or was made available for the general public to see or buy +// */ +// releaseDate: string +// /** +// * repository +// * @description Place, room, or container where something is deposited or stored. +// */ +// repository?: { [key: string]: unknown } +// /** +// * shortName +// * @description Shortened or fully abbreviated name of something or somebody. +// */ +// shortName: string +// /** studiedSpecimen */ +// studiedSpecimen?: unknown[] +// /** +// * studyTarget +// * @description Structure or function that was targeted within a study. +// */ +// studyTarget?: unknown[] +// /** +// * supportChannel +// * @description Way of communication used to interact with users or customers. +// */ +// supportChannel?: string[] +// /** +// * technique +// * @description Method of accomplishing a desired aim. +// */ +// technique: unknown[] +// /** +// * versionIdentifier +// * @description Term or code used to identify the version of something. +// */ +// versionIdentifier: string +// /** +// * versionInnovation +// * @description Documentation on what changed in comparison to a previously published form of something. +// */ +// versionInnovation: string +// } +// /** OtherContribution */ +// siibra__openminds__core__v4__products__datasetVersion__OtherContribution: { +// /** +// * @Context +// * @default [object Object] +// */ +// "@context"?: components["schemas"]["VocabModel"] +// /** +// * contributionType +// * @description Distinct class of what was given or supplied as a part or share. +// */ +// contributionType: unknown[] +// /** +// * contributor +// * @description Legal person that gave or supplied something as a part or share. +// */ +// contributor: unknown +// } +// } +// } -export interface operations { - /** Returns all regions for a given parcellation id. */ - get_all_regions_from_atlas_parc_space_atlases__atlas_id__parcellations__parcellation_id__regions_get: { - parameters: { - path: { - atlas_id: string - parcellation_id: string - } - query: { - space_id?: string - find?: string - } - } - responses: { - /** Successful Response */ - 200: { - content: { - "application/json": components["schemas"]["siibra__openminds__SANDS__v3__atlas__parcellationEntityVersion__Model"][] - } - } - /** Validation Error */ - 422: { - content: { - "application/json": components["schemas"]["HTTPValidationError"] - } - } - } - } - /** Returns all regional features for a region. */ - get_all_regional_features_for_region_atlases__atlas_id__parcellations__parcellation_id__regions__region_id__features_get: { - parameters: { - path: { - atlas_id: string - parcellation_id: string - region_id: string - } - query: { - space_id?: string - type?: string - } - } - responses: { - /** Successful Response */ - 200: { - content: { - "application/json": (Partial< - components["schemas"]["ReceptorDatasetModel"] - > & - Partial<components["schemas"]["BaseDatasetJsonModel"]> & - Partial<components["schemas"]["CorticalCellDistributionModel"]>)[] - } - } - /** Validation Error */ - 422: { - content: { - "application/json": components["schemas"]["HTTPValidationError"] - } - } - } - } - /** Returns a feature for a region, as defined by the modality and feature ID */ - get_single_detailed_regional_feature_atlases__atlas_id__parcellations__parcellation_id__regions__region_id__features__feature_id__get: { - parameters: { - path: { - atlas_id: string - parcellation_id: string - region_id: string - feature_id: string - } - query: { - space_id?: string - gene?: string - } - } - responses: { - /** Successful Response */ - 200: { - content: { - "application/json": Partial< - components["schemas"]["ReceptorDatasetModel"] - > & - Partial<components["schemas"]["BaseDatasetJsonModel"]> & - Partial<components["schemas"]["CorticalCellDistributionModel"]> - } - } - /** Validation Error */ - 422: { - content: { - "application/json": components["schemas"]["HTTPValidationError"] - } - } - } - } - /** Returns information about a regional map for given region name. */ - get_regional_map_info_atlases__atlas_id__parcellations__parcellation_id__regions__region_id__regional_map_info_get: { - parameters: { - path: { - atlas_id: string - parcellation_id: string - region_id: string - } - query: { - space_id?: string - } - } - responses: { - /** Successful Response */ - 200: { - content: { - "application/json": components["schemas"]["NiiMetadataModel"] - } - } - /** Validation Error */ - 422: { - content: { - "application/json": components["schemas"]["HTTPValidationError"] - } - } - } - } - /** Returns a regional map for given region name. */ - get_regional_map_file_atlases__atlas_id__parcellations__parcellation_id__regions__region_id__regional_map_map_get: { - parameters: { - path: { - atlas_id: string - parcellation_id: string - region_id: string - } - query: { - space_id?: string - } - } - responses: { - /** Successful Response */ - 200: { - content: { - "application/json": unknown - "application/octet-stream": string - } - } - /** Validation Error */ - 422: { - content: { - "application/json": components["schemas"]["HTTPValidationError"] - } - } - } - } - get_regional_volumes_atlases__atlas_id__parcellations__parcellation_id__regions__region_id__volumes_get: { - parameters: { - path: { - atlas_id: string - parcellation_id: string - region_id: string - } - query: { - space_id?: string - type?: string - page?: number - size?: number - } - } - responses: { - /** Successful Response */ - 200: { - content: { - "application/json": components["schemas"]["Page_VolumeModel_"] - } - } - /** Validation Error */ - 422: { - content: { - "application/json": components["schemas"]["HTTPValidationError"] - } - } - } - } - get_regional_volumes_atlases__atlas_id__parcellations__parcellation_id__regions__region_id__volumes__volume_id__get: { - parameters: { - path: { - atlas_id: string - parcellation_id: string - region_id: string - volume_id: string - } - } - responses: { - /** Successful Response */ - 200: { - content: { - "application/json": components["schemas"]["VolumeModel"] - } - } - /** Validation Error */ - 422: { - content: { - "application/json": components["schemas"]["HTTPValidationError"] - } - } - } - } - get_single_region_detail_atlases__atlas_id__parcellations__parcellation_id__regions__region_id__get: { - parameters: { - path: { - atlas_id: string - parcellation_id: string - region_id: string - } - query: { - space_id?: string - } - } - responses: { - /** Successful Response */ - 200: { - content: { - "application/json": components["schemas"]["siibra__openminds__SANDS__v3__atlas__parcellationEntityVersion__Model"] - } - } - /** Validation Error */ - 422: { - content: { - "application/json": components["schemas"]["HTTPValidationError"] - } - } - } - } - /** Returns all parcellations that are defined in the siibra client for given atlas. */ - get_all_parcellations_atlases__atlas_id__parcellations_get: { - parameters: { - path: { - atlas_id: string - } - } - responses: { - /** Successful Response */ - 200: { - content: { - "application/json": components["schemas"]["SapiParcellationModel"][] - } - } - /** Validation Error */ - 422: { - content: { - "application/json": components["schemas"]["HTTPValidationError"] - } - } - } - } - /** Returns a global feature for a specific modality id. */ - get_single_detailed_global_feature_atlases__atlas_id__parcellations__parcellation_id__features__feature_id__get: { - parameters: { - path: { - atlas_id: string - parcellation_id: string - feature_id: string - } - } - responses: { - /** Successful Response */ - 200: { - content: { - "application/json": Partial< - components["schemas"]["ConnectivityMatrixDataModel"] - > & - Partial<components["schemas"]["SerializationErrorModel"]> - } - } - /** Validation Error */ - 422: { - content: { - "application/json": components["schemas"]["HTTPValidationError"] - } - } - } - } - /** Returns all global features for a parcellation. */ - get_all_global_features_for_parcellation_atlases__atlas_id__parcellations__parcellation_id__features_get: { - parameters: { - path: { - atlas_id: string - parcellation_id: string - } - query: { - type?: string - page?: number - size?: number - } - } - responses: { - /** Successful Response */ - 200: { - content: { - "application/json": components["schemas"]["Page_Union_siibra.features.connectivity.ConnectivityMatrixDataModel__app.models.SerializationErrorModel__"] - } - } - /** Validation Error */ - 422: { - content: { - "application/json": components["schemas"]["HTTPValidationError"] - } - } - } - } - /** Returns one parcellation for given id. */ - get_volumes_for_parcellation_atlases__atlas_id__parcellations__parcellation_id__volumes_get: { - parameters: { - path: { - atlas_id: string - parcellation_id: string - } - } - responses: { - /** Successful Response */ - 200: { - content: { - "application/json": components["schemas"]["VolumeModel"][] - } - } - /** Validation Error */ - 422: { - content: { - "application/json": components["schemas"]["HTTPValidationError"] - } - } - } - } - /** Returns one parcellation for given id. */ - get_single_parcellation_detail_atlases__atlas_id__parcellations__parcellation_id__get: { - parameters: { - path: { - atlas_id: string - parcellation_id: string - } - } - responses: { - /** Successful Response */ - 200: { - content: { - "application/json": components["schemas"]["SapiParcellationModel"] - } - } - /** Validation Error */ - 422: { - content: { - "application/json": components["schemas"]["HTTPValidationError"] - } - } - } - } - /** Returns all spaces that are defined in the siibra client. */ - get_all_spaces_atlases__atlas_id__spaces_get: { - parameters: { - path: { - atlas_id: string - } - } - responses: { - /** Successful Response */ - 200: { - content: { - "application/json": components["schemas"]["SapiSpaceModel"][] - } - } - /** Validation Error */ - 422: { - content: { - "application/json": components["schemas"]["HTTPValidationError"] - } - } - } - } - /** Returns a template for a given space id. */ - get_template_by_space_id_atlases__atlas_id__spaces__space_id__templates_get: { - parameters: { - path: { - atlas_id: string - space_id: string - } - } - responses: { - /** Successful Response */ - 200: { - content: { - "application/json": unknown - "application/octet-stream": string - } - } - /** Validation Error */ - 422: { - content: { - "application/json": components["schemas"]["HTTPValidationError"] - } - } - } - } - /** Returns all parcellation maps for a given space id. */ - get_parcellation_map_for_space_atlases__atlas_id__spaces__space_id__parcellation_maps_get: { - parameters: { - path: { - atlas_id: string - space_id: string - } - } - responses: { - /** Successful Response */ - 200: { - content: { - "application/json": unknown - "application/octet-stream": string - } - } - /** Validation Error */ - 422: { - content: { - "application/json": components["schemas"]["HTTPValidationError"] - } - } - } - } - /** - * Get a detailed view on a single spatial feature. - * A parcellation id and region id can be provided optional to get more details. - */ - get_single_detailed_spatial_feature_atlases__atlas_id__spaces__space_id__features__feature_id__get: { - parameters: { - path: { - feature_id: string - atlas_id: string - space_id: string - } - query: { - parcellation_id?: string - region?: string - bbox?: string - } - } - responses: { - /** Successful Response */ - 200: { - content: { - "application/json": Partial< - components["schemas"]["IEEGSessionModel"] - > & - Partial<components["schemas"]["VOIDataModel"]> - } - } - /** Validation Error */ - 422: { - content: { - "application/json": components["schemas"]["HTTPValidationError"] - } - } - } - } - /** Return all possible feature names and links to get more details */ - get_all_spatial_features_for_space_atlases__atlas_id__spaces__space_id__features_get: { - parameters: { - path: { - atlas_id: string - space_id: string - } - query: { - parcellation_id?: string - type?: string - region?: string - bbox?: string - } - } - responses: { - /** Successful Response */ - 200: { - content: { - "application/json": (Partial< - components["schemas"]["IEEGSessionModel"] - > & - Partial<components["schemas"]["VOIDataModel"]>)[] - } - } - /** Validation Error */ - 422: { - content: { - "application/json": components["schemas"]["HTTPValidationError"] - } - } - } - } - get_volumes_for_space_atlases__atlas_id__spaces__space_id__volumes_get: { - parameters: { - path: { - atlas_id: string - space_id: string - } - } - responses: { - /** Successful Response */ - 200: { - content: { - "application/json": components["schemas"]["VolumeModel"][] - } - } - /** Validation Error */ - 422: { - content: { - "application/json": components["schemas"]["HTTPValidationError"] - } - } - } - } - /** Returns one space for given id, with links to further resources */ - get_single_space_detail_atlases__atlas_id__spaces__space_id__get: { - parameters: { - path: { - atlas_id: string - space_id: string - } - } - responses: { - /** Successful Response */ - 200: { - content: { - "application/json": components["schemas"]["SapiSpaceModel"] - } - } - /** Validation Error */ - 422: { - content: { - "application/json": components["schemas"]["HTTPValidationError"] - } - } - } - } - /** Get all atlases known by siibra. */ - get_all_atlases_atlases_get: { - responses: { - /** Successful Response */ - 200: { - content: { - "application/json": components["schemas"]["SapiAtlasModel"][] - } - } - } - } - /** Get more information for a specific atlas with links to further objects. */ - get_atlas_by_id_atlases__atlas_id__get: { - parameters: { - path: { - atlas_id: string - } - } - responses: { - /** Successful Response */ - 200: { - content: { - "application/json": components["schemas"]["SapiAtlasModel"] - } - } - /** Validation Error */ - 422: { - content: { - "application/json": components["schemas"]["HTTPValidationError"] - } - } - } - } - /** Return all genes (name, acronym) in siibra */ - get_gene_names_genes_get: { - responses: { - /** Successful Response */ - 200: { - content: { - "application/json": unknown - } - } - } - } - /** Return all possible modalities */ - get_all_available_modalities_modalities_get: { - responses: { - /** Successful Response */ - 200: { - content: { - "application/json": unknown - } - } - } - } - /** - * Get all details for one feature by id. - * Since the feature id is unique, no atlas concept is required. - * - * Further optional params can extend the result. - * :param feature_id: - * :param atlas_id: - * :param space_id: - * :param parcellation_id: - * :param region_id: - * :return: FeatureModels - */ - get_feature_details_features__feature_id__get: { - parameters: { - path: { - feature_id: string - } - query: { - atlas_id?: string - space_id?: string - parcellation_id?: string - region_id?: string - } - } - responses: { - /** Successful Response */ - 200: { - content: { - "application/json": Partial< - components["schemas"]["ReceptorDatasetModel"] - > & - Partial<components["schemas"]["BaseDatasetJsonModel"]> & - Partial<components["schemas"]["CorticalCellDistributionModel"]> & - Partial<components["schemas"]["IEEGSessionModel"]> & - Partial<components["schemas"]["VOIDataModel"]> & - Partial<components["schemas"]["ConnectivityMatrixDataModel"]> & - Partial<components["schemas"]["SerializationErrorModel"]> - } - } - /** Validation Error */ - 422: { - content: { - "application/json": components["schemas"]["HTTPValidationError"] - } - } - } - } -} +// export interface operations { +// /** Returns all regions for a given parcellation id. */ +// get_all_regions_from_atlas_parc_space_atlases__atlas_id__parcellations__parcellation_id__regions_get: { +// parameters: { +// path: { +// atlas_id: string +// parcellation_id: string +// } +// query: { +// space_id?: string +// find?: string +// } +// } +// responses: { +// /** Successful Response */ +// 200: { +// content: { +// "application/json": components["schemas"]["siibra__openminds__SANDS__v3__atlas__parcellationEntityVersion__Model"][] +// } +// } +// /** Validation Error */ +// 422: { +// content: { +// "application/json": components["schemas"]["HTTPValidationError"] +// } +// } +// } +// } +// /** Returns all regional features for a region. */ +// get_all_regional_features_for_region_atlases__atlas_id__parcellations__parcellation_id__regions__region_id__features_get: { +// parameters: { +// path: { +// atlas_id: string +// parcellation_id: string +// region_id: string +// } +// query: { +// space_id?: string +// type?: string +// } +// } +// responses: { +// /** Successful Response */ +// 200: { +// content: { +// "application/json": (Partial< +// components["schemas"]["ReceptorDatasetModel"] +// > & +// Partial<components["schemas"]["BaseDatasetJsonModel"]> & +// Partial<components["schemas"]["CorticalCellDistributionModel"]>)[] +// } +// } +// /** Validation Error */ +// 422: { +// content: { +// "application/json": components["schemas"]["HTTPValidationError"] +// } +// } +// } +// } +// /** Returns a feature for a region, as defined by the modality and feature ID */ +// get_single_detailed_regional_feature_atlases__atlas_id__parcellations__parcellation_id__regions__region_id__features__feature_id__get: { +// parameters: { +// path: { +// atlas_id: string +// parcellation_id: string +// region_id: string +// feature_id: string +// } +// query: { +// space_id?: string +// gene?: string +// } +// } +// responses: { +// /** Successful Response */ +// 200: { +// content: { +// "application/json": Partial< +// components["schemas"]["ReceptorDatasetModel"] +// > & +// Partial<components["schemas"]["BaseDatasetJsonModel"]> & +// Partial<components["schemas"]["CorticalCellDistributionModel"]> +// } +// } +// /** Validation Error */ +// 422: { +// content: { +// "application/json": components["schemas"]["HTTPValidationError"] +// } +// } +// } +// } +// /** Returns information about a regional map for given region name. */ +// get_regional_map_info_atlases__atlas_id__parcellations__parcellation_id__regions__region_id__regional_map_info_get: { +// parameters: { +// path: { +// atlas_id: string +// parcellation_id: string +// region_id: string +// } +// query: { +// space_id?: string +// } +// } +// responses: { +// /** Successful Response */ +// 200: { +// content: { +// "application/json": components["schemas"]["NiiMetadataModel"] +// } +// } +// /** Validation Error */ +// 422: { +// content: { +// "application/json": components["schemas"]["HTTPValidationError"] +// } +// } +// } +// } +// /** Returns a regional map for given region name. */ +// get_regional_map_file_atlases__atlas_id__parcellations__parcellation_id__regions__region_id__regional_map_map_get: { +// parameters: { +// path: { +// atlas_id: string +// parcellation_id: string +// region_id: string +// } +// query: { +// space_id?: string +// } +// } +// responses: { +// /** Successful Response */ +// 200: { +// content: { +// "application/json": unknown +// "application/octet-stream": string +// } +// } +// /** Validation Error */ +// 422: { +// content: { +// "application/json": components["schemas"]["HTTPValidationError"] +// } +// } +// } +// } +// get_regional_volumes_atlases__atlas_id__parcellations__parcellation_id__regions__region_id__volumes_get: { +// parameters: { +// path: { +// atlas_id: string +// parcellation_id: string +// region_id: string +// } +// query: { +// space_id?: string +// type?: string +// page?: number +// size?: number +// } +// } +// responses: { +// /** Successful Response */ +// 200: { +// content: { +// "application/json": components["schemas"]["Page_VolumeModel_"] +// } +// } +// /** Validation Error */ +// 422: { +// content: { +// "application/json": components["schemas"]["HTTPValidationError"] +// } +// } +// } +// } +// get_regional_volumes_atlases__atlas_id__parcellations__parcellation_id__regions__region_id__volumes__volume_id__get: { +// parameters: { +// path: { +// atlas_id: string +// parcellation_id: string +// region_id: string +// volume_id: string +// } +// } +// responses: { +// /** Successful Response */ +// 200: { +// content: { +// "application/json": components["schemas"]["VolumeModel"] +// } +// } +// /** Validation Error */ +// 422: { +// content: { +// "application/json": components["schemas"]["HTTPValidationError"] +// } +// } +// } +// } +// get_single_region_detail_atlases__atlas_id__parcellations__parcellation_id__regions__region_id__get: { +// parameters: { +// path: { +// atlas_id: string +// parcellation_id: string +// region_id: string +// } +// query: { +// space_id?: string +// } +// } +// responses: { +// /** Successful Response */ +// 200: { +// content: { +// "application/json": components["schemas"]["siibra__openminds__SANDS__v3__atlas__parcellationEntityVersion__Model"] +// } +// } +// /** Validation Error */ +// 422: { +// content: { +// "application/json": components["schemas"]["HTTPValidationError"] +// } +// } +// } +// } +// /** Returns all parcellations that are defined in the siibra client for given atlas. */ +// get_all_parcellations_atlases__atlas_id__parcellations_get: { +// parameters: { +// path: { +// atlas_id: string +// } +// } +// responses: { +// /** Successful Response */ +// 200: { +// content: { +// "application/json": components["schemas"]["SapiParcellationModel"][] +// } +// } +// /** Validation Error */ +// 422: { +// content: { +// "application/json": components["schemas"]["HTTPValidationError"] +// } +// } +// } +// } +// /** Returns a global feature for a specific modality id. */ +// get_single_detailed_global_feature_atlases__atlas_id__parcellations__parcellation_id__features__feature_id__get: { +// parameters: { +// path: { +// atlas_id: string +// parcellation_id: string +// feature_id: string +// } +// } +// responses: { +// /** Successful Response */ +// 200: { +// content: { +// "application/json": Partial< +// components["schemas"]["ConnectivityMatrixDataModel"] +// > & +// Partial<components["schemas"]["SerializationErrorModel"]> +// } +// } +// /** Validation Error */ +// 422: { +// content: { +// "application/json": components["schemas"]["HTTPValidationError"] +// } +// } +// } +// } +// /** Returns all global features for a parcellation. */ +// get_all_global_features_for_parcellation_atlases__atlas_id__parcellations__parcellation_id__features_get: { +// parameters: { +// path: { +// atlas_id: string +// parcellation_id: string +// } +// query: { +// type?: string +// page?: number +// size?: number +// } +// } +// responses: { +// /** Successful Response */ +// 200: { +// content: { +// "application/json": components["schemas"]["Page_Union_siibra.features.connectivity.ConnectivityMatrixDataModel__app.models.SerializationErrorModel__"] +// } +// } +// /** Validation Error */ +// 422: { +// content: { +// "application/json": components["schemas"]["HTTPValidationError"] +// } +// } +// } +// } +// /** Returns one parcellation for given id. */ +// get_volumes_for_parcellation_atlases__atlas_id__parcellations__parcellation_id__volumes_get: { +// parameters: { +// path: { +// atlas_id: string +// parcellation_id: string +// } +// } +// responses: { +// /** Successful Response */ +// 200: { +// content: { +// "application/json": components["schemas"]["VolumeModel"][] +// } +// } +// /** Validation Error */ +// 422: { +// content: { +// "application/json": components["schemas"]["HTTPValidationError"] +// } +// } +// } +// } +// /** Returns one parcellation for given id. */ +// get_single_parcellation_detail_atlases__atlas_id__parcellations__parcellation_id__get: { +// parameters: { +// path: { +// atlas_id: string +// parcellation_id: string +// } +// } +// responses: { +// /** Successful Response */ +// 200: { +// content: { +// "application/json": components["schemas"]["SapiParcellationModel"] +// } +// } +// /** Validation Error */ +// 422: { +// content: { +// "application/json": components["schemas"]["HTTPValidationError"] +// } +// } +// } +// } +// /** Returns all spaces that are defined in the siibra client. */ +// get_all_spaces_atlases__atlas_id__spaces_get: { +// parameters: { +// path: { +// atlas_id: string +// } +// } +// responses: { +// /** Successful Response */ +// 200: { +// content: { +// "application/json": components["schemas"]["SapiSpaceModel"][] +// } +// } +// /** Validation Error */ +// 422: { +// content: { +// "application/json": components["schemas"]["HTTPValidationError"] +// } +// } +// } +// } +// /** Returns a template for a given space id. */ +// get_template_by_space_id_atlases__atlas_id__spaces__space_id__templates_get: { +// parameters: { +// path: { +// atlas_id: string +// space_id: string +// } +// } +// responses: { +// /** Successful Response */ +// 200: { +// content: { +// "application/json": unknown +// "application/octet-stream": string +// } +// } +// /** Validation Error */ +// 422: { +// content: { +// "application/json": components["schemas"]["HTTPValidationError"] +// } +// } +// } +// } +// /** Returns all parcellation maps for a given space id. */ +// get_parcellation_map_for_space_atlases__atlas_id__spaces__space_id__parcellation_maps_get: { +// parameters: { +// path: { +// atlas_id: string +// space_id: string +// } +// } +// responses: { +// /** Successful Response */ +// 200: { +// content: { +// "application/json": unknown +// "application/octet-stream": string +// } +// } +// /** Validation Error */ +// 422: { +// content: { +// "application/json": components["schemas"]["HTTPValidationError"] +// } +// } +// } +// } +// /** +// * Get a detailed view on a single spatial feature. +// * A parcellation id and region id can be provided optional to get more details. +// */ +// get_single_detailed_spatial_feature_atlases__atlas_id__spaces__space_id__features__feature_id__get: { +// parameters: { +// path: { +// feature_id: string +// atlas_id: string +// space_id: string +// } +// query: { +// parcellation_id?: string +// region?: string +// bbox?: string +// } +// } +// responses: { +// /** Successful Response */ +// 200: { +// content: { +// "application/json": Partial< +// components["schemas"]["IEEGSessionModel"] +// > & +// Partial<components["schemas"]["VOIDataModel"]> +// } +// } +// /** Validation Error */ +// 422: { +// content: { +// "application/json": components["schemas"]["HTTPValidationError"] +// } +// } +// } +// } +// /** Return all possible feature names and links to get more details */ +// get_all_spatial_features_for_space_atlases__atlas_id__spaces__space_id__features_get: { +// parameters: { +// path: { +// atlas_id: string +// space_id: string +// } +// query: { +// parcellation_id?: string +// type?: string +// region?: string +// bbox?: string +// } +// } +// responses: { +// /** Successful Response */ +// 200: { +// content: { +// "application/json": (Partial< +// components["schemas"]["IEEGSessionModel"] +// > & +// Partial<components["schemas"]["VOIDataModel"]>)[] +// } +// } +// /** Validation Error */ +// 422: { +// content: { +// "application/json": components["schemas"]["HTTPValidationError"] +// } +// } +// } +// } +// get_volumes_for_space_atlases__atlas_id__spaces__space_id__volumes_get: { +// parameters: { +// path: { +// atlas_id: string +// space_id: string +// } +// } +// responses: { +// /** Successful Response */ +// 200: { +// content: { +// "application/json": components["schemas"]["VolumeModel"][] +// } +// } +// /** Validation Error */ +// 422: { +// content: { +// "application/json": components["schemas"]["HTTPValidationError"] +// } +// } +// } +// } +// /** Returns one space for given id, with links to further resources */ +// get_single_space_detail_atlases__atlas_id__spaces__space_id__get: { +// parameters: { +// path: { +// atlas_id: string +// space_id: string +// } +// } +// responses: { +// /** Successful Response */ +// 200: { +// content: { +// "application/json": components["schemas"]["SapiSpaceModel"] +// } +// } +// /** Validation Error */ +// 422: { +// content: { +// "application/json": components["schemas"]["HTTPValidationError"] +// } +// } +// } +// } +// /** Get all atlases known by siibra. */ +// get_all_atlases_atlases_get: { +// responses: { +// /** Successful Response */ +// 200: { +// content: { +// "application/json": components["schemas"]["SapiAtlasModel"][] +// } +// } +// } +// } +// /** Get more information for a specific atlas with links to further objects. */ +// get_atlas_by_id_atlases__atlas_id__get: { +// parameters: { +// path: { +// atlas_id: string +// } +// } +// responses: { +// /** Successful Response */ +// 200: { +// content: { +// "application/json": components["schemas"]["SapiAtlasModel"] +// } +// } +// /** Validation Error */ +// 422: { +// content: { +// "application/json": components["schemas"]["HTTPValidationError"] +// } +// } +// } +// } +// /** Return all genes (name, acronym) in siibra */ +// get_gene_names_genes_get: { +// responses: { +// /** Successful Response */ +// 200: { +// content: { +// "application/json": unknown +// } +// } +// } +// } +// /** Return all possible modalities */ +// get_all_available_modalities_modalities_get: { +// responses: { +// /** Successful Response */ +// 200: { +// content: { +// "application/json": unknown +// } +// } +// } +// } +// /** +// * Get all details for one feature by id. +// * Since the feature id is unique, no atlas concept is required. +// * +// * Further optional params can extend the result. +// * :param feature_id: +// * :param atlas_id: +// * :param space_id: +// * :param parcellation_id: +// * :param region_id: +// * :return: FeatureModels +// */ +// get_feature_details_features__feature_id__get: { +// parameters: { +// path: { +// feature_id: string +// } +// query: { +// atlas_id?: string +// space_id?: string +// parcellation_id?: string +// region_id?: string +// } +// } +// responses: { +// /** Successful Response */ +// 200: { +// content: { +// "application/json": Partial< +// components["schemas"]["ReceptorDatasetModel"] +// > & +// Partial<components["schemas"]["BaseDatasetJsonModel"]> & +// Partial<components["schemas"]["CorticalCellDistributionModel"]> & +// Partial<components["schemas"]["IEEGSessionModel"]> & +// Partial<components["schemas"]["VOIDataModel"]> & +// Partial<components["schemas"]["ConnectivityMatrixDataModel"]> & +// Partial<components["schemas"]["SerializationErrorModel"]> +// } +// } +// /** Validation Error */ +// 422: { +// content: { +// "application/json": components["schemas"]["HTTPValidationError"] +// } +// } +// } +// } +// } -export interface external {} +// export interface external {} diff --git a/src/atlasComponents/sapi/schema_v3.ts b/src/atlasComponents/sapi/schema_v3.ts new file mode 100644 index 000000000..7147fd8c7 --- /dev/null +++ b/src/atlasComponents/sapi/schema_v3.ts @@ -0,0 +1,1803 @@ +/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ + + +export interface paths { + "/atlases": { + /** Get All Atlases */ + get: operations["get_all_atlases_atlases_get"] + } + "/atlases/{atlas_id}": { + /** Get Single Atlas */ + get: operations["get_single_atlas_atlases__atlas_id__get"] + } + "/spaces": { + /** Get All Spaces */ + get: operations["get_all_spaces_spaces_get"] + } + "/spaces/{space_id}": { + /** Get Single Space */ + get: operations["get_single_space_spaces__space_id__get"] + } + "/parcellations": { + /** Get All Parcellations */ + get: operations["get_all_parcellations_parcellations_get"] + } + "/parcellations/{parcellation_id}": { + /** Get Single Parcellation */ + get: operations["get_single_parcellation_parcellations__parcellation_id__get"] + } + "/regions": { + /** Get All Regions */ + get: operations["get_all_regions_regions_get"] + } + "/regions/{region_id}": { + /** Get All Regions */ + get: operations["get_all_regions_regions__region_id__get"] + } + "/map": { + /** Route Get Map */ + get: operations["route_get_map_map_get"] + } + "/map/labelled_map.nii.gz": { + /** Route Get Parcellation Labelled Map */ + get: operations["route_get_parcellation_labelled_map_map_labelled_map_nii_gz_get"] + } + "/map/statistical_map.nii.gz": { + /** Route Get Region Statistical Map */ + get: operations["route_get_region_statistical_map_map_statistical_map_nii_gz_get"] + } + "/map/statistical_map.info.json": { + /** Route Get Region Statistical Map */ + get: operations["route_get_region_statistical_map_map_statistical_map_info_json_get"] + } + "/feature/_types": { + /** Get All Feature Types */ + get: operations["get_all_feature_types_feature__types_get"] + } + "/feature/RegionalConnectivity": { + /** Get All Connectivity Features */ + get: operations["get_all_connectivity_features_feature_RegionalConnectivity_get"] + } + "/feature/RegionalConnectivity/{feature_id}": { + /** Get Single Connectivity Feature */ + get: operations["get_single_connectivity_feature_feature_RegionalConnectivity__feature_id__get"] + } + "/feature/CorticalProfile": { + /** Get All Connectivity Features */ + get: operations["get_all_connectivity_features_feature_CorticalProfile_get"] + } + "/feature/CorticalProfile/{feature_id}": { + /** Get Single Connectivity Feature */ + get: operations["get_single_connectivity_feature_feature_CorticalProfile__feature_id__get"] + } + "/feature/Tabular": { + /** Get All Tabular */ + get: operations["get_all_tabular_feature_Tabular_get"] + } + "/feature/Tabular/{feature_id}": { + /** Get Single Tabular */ + get: operations["get_single_tabular_feature_Tabular__feature_id__get"] + } + "/feature/VolumeOfInterest": { + /** Get All Voi */ + get: operations["get_all_voi_feature_VolumeOfInterest_get"] + } + "/feature/VolumeOfInterest/{feature_id}": { + /** Get Single Voi */ + get: operations["get_single_voi_feature_VolumeOfInterest__feature_id__get"] + } + "/feature/GeneExpressions": { + /** Get All Gene */ + get: operations["get_all_gene_feature_GeneExpressions_get"] + } + "/feature/GeneExpressions/{feature_id}": { + /** Get All Gene */ + get: operations["get_all_gene_feature_GeneExpressions__feature_id__get"] + } +} + +export type webhooks = Record<string, never>; + +export interface components { + schemas: { + /** AxesOrigin */ + AxesOrigin: { + /** + * @Context + * @default { + * "@vocab": "https://openminds.ebrains.eu/vocab/" + * } + */ + "@context"?: components["schemas"]["VocabModel"] + /** + * typeOfUncertainty + * @description Distinct technique used to quantify the uncertainty of a measurement. + */ + typeOfUncertainty?: Record<string, never> + /** + * uncertainty + * @description Quantitative value range defining the uncertainty of a measurement. + */ + uncertainty?: (number)[] + /** + * unit + * @description Determinate quantity adopted as a standard of measurement. + */ + unit?: Record<string, never> + /** + * value + * @description Entry for a property. + */ + value: number + } + /** BestViewPoint */ + BestViewPoint: { + /** + * @Context + * @default { + * "@vocab": "https://openminds.ebrains.eu/vocab/" + * } + */ + "@context"?: components["schemas"]["VocabModel"] + /** + * coordinateSpace + * @description Two or three dimensional geometric setting. + */ + coordinateSpace: Record<string, never> + /** + * Coordinates + * @description Structured information on a quantitative value. + */ + coordinates: (components["schemas"]["api__models__openminds__SANDS__v3__atlas__parcellationEntityVersion__Coordinates"])[] + } + /** BoundingBoxModel */ + BoundingBoxModel: { + /** @Type */ + "@type": string + space: components["schemas"]["SiibraAtIdModel"] + center: components["schemas"]["CoordinatePointModel"] + minpoint: components["schemas"]["CoordinatePointModel"] + maxpoint: components["schemas"]["CoordinatePointModel"] + /** Shape */ + shape: (number)[] + /** Isplanar */ + isPlanar: boolean + } + /** BrainAtlasVersionModel */ + BrainAtlasVersionModel: { + /** @Type */ + "@type": string + /** + * @Context + * @default { + * "@vocab": "https://openminds.ebrains.eu/vocab/" + * } + */ + "@context"?: components["schemas"]["VocabModel"] + /** + * @Id + * @description Metadata node identifier. + */ + "@id": string + /** abbreviation */ + abbreviation?: string + /** + * accessibility + * @description Level to which something is accessible to someone or something. + */ + accessibility: Record<string, never> + /** atlasType */ + atlasType?: Record<string, never> + /** + * author + * @description Creator of a literary or creative work, as well as a dataset publication. + */ + author?: (Record<string, never>)[] + /** + * coordinateSpace + * @description Two or three dimensional geometric setting. + */ + coordinateSpace: Record<string, never> + /** + * Copyright + * @description Structured information on the copyright. + */ + copyright?: components["schemas"]["Copyright"] + /** + * custodian + * @description The 'custodian' is a legal person who is responsible for the content and quality of the data, metadata, and/or code of a research product. + */ + custodian?: (Record<string, never>)[] + /** + * description + * @description Longer statement or account giving the characteristics of someone or something. + */ + description?: string + /** + * digitalIdentifier + * @description Digital handle to identify objects or legal persons. + */ + digitalIdentifier?: Record<string, never> + /** + * fullDocumentation + * @description Non-abridged instructions, comments, and information for using a particular product. + */ + fullDocumentation: Record<string, never> + /** + * fullName + * @description Whole, non-abbreviated name of something or somebody. + */ + fullName?: string + /** + * funding + * @description Money provided by a legal person for a particular purpose. + */ + funding?: (Record<string, never>)[] + hasTerminologyVersion: components["schemas"]["HasTerminologyVersion"] + /** + * homepage + * @description Main website of something or someone. + */ + homepage?: Record<string, never> + /** + * howToCite + * @description Preferred format for citing a particular object or legal person. + */ + howToCite?: string + /** + * isAlternativeVersionOf + * @description Reference to an original form where the essence was preserved, but presented in an alternative form. + */ + isAlternativeVersionOf?: (Record<string, never>)[] + /** + * isNewVersionOf + * @description Reference to a previous (potentially outdated) particular form of something. + */ + isNewVersionOf?: Record<string, never> + /** + * keyword + * @description Significant word or concept that are representative of something or someone. + */ + keyword?: (Record<string, never>)[] + /** + * license + * @description Grant by a party to another party as an element of an agreement between those parties that permits to do, use, or own something. + */ + license: Record<string, never> + /** + * ontologyIdentifier + * @description Term or code used to identify something or someone registered within a particular ontology. + */ + ontologyIdentifier?: (string)[] + /** + * Othercontribution + * @description Structured information on the contribution made to a research product. + */ + otherContribution?: components["schemas"]["OtherContribution"] + /** + * relatedPublication + * @description Reference to something that was made available for the general public to see or buy. + */ + relatedPublication?: (Record<string, never>)[] + /** + * releaseDate + * @description Fixed date on which a product is due to become or was made available for the general public to see or buy + */ + releaseDate: string + /** + * repository + * @description Place, room, or container where something is deposited or stored. + */ + repository?: Record<string, never> + /** + * shortName + * @description Shortened or fully abbreviated name of something or somebody. + */ + shortName: string + /** + * supportChannel + * @description Way of communication used to interact with users or customers. + */ + supportChannel?: (string)[] + /** + * versionIdentifier + * @description Term or code used to identify the version of something. + */ + versionIdentifier: string + /** + * versionInnovation + * @description Documentation on what changed in comparison to a previously published form of something. + */ + versionInnovation: string + } + /** CommonCoordinateSpaceModel */ + CommonCoordinateSpaceModel: { + /** @Type */ + "@type": string + /** + * @Context + * @default { + * "@vocab": "https://openminds.ebrains.eu/vocab/" + * } + */ + "@context"?: components["schemas"]["VocabModel"] + /** + * @Id + * @description Metadata node identifier. + */ + "@id": string + /** + * anatomicalAxesOrientation + * @description Relation between reference planes used in anatomy and mathematics. + */ + anatomicalAxesOrientation: Record<string, never> + /** + * Axesorigin + * @description Structured information on a quantitative value. + */ + axesOrigin: (components["schemas"]["AxesOrigin"])[] + /** + * defaultImage + * @description Two or three dimensional image that particluarly represents a specific coordinate space. + */ + defaultImage?: components["schemas"]["VolumeModel"][] + /** + * digitalIdentifier + * @description Digital handle to identify objects or legal persons. + */ + digitalIdentifier?: Record<string, never> + /** + * fullName + * @description Whole, non-abbreviated name of something or somebody. + */ + fullName: string + /** + * homepage + * @description Main website of something or someone. + */ + homepage?: Record<string, never> + /** + * howToCite + * @description Preferred format for citing a particular object or legal person. + */ + howToCite?: string + /** + * nativeUnit + * @description Determinate quantity used in the original measurement. + */ + nativeUnit: Record<string, never> + /** + * ontologyIdentifier + * @description Term or code used to identify something or someone registered within a particular ontology. + */ + ontologyIdentifier?: (string)[] + /** + * releaseDate + * @description Fixed date on which a product is due to become or was made available for the general public to see or buy + */ + releaseDate: string + /** + * shortName + * @description Shortened or fully abbreviated name of something or somebody. + */ + shortName: string + /** + * versionIdentifier + * @description Term or code used to identify the version of something. + */ + versionIdentifier: string + } + /** + * ConnectivityTypes + * @description An enumeration. + * @enum {unknown} + */ + ConnectivityTypes: "FunctionalConnectivity" | "StreamlineCounts" | "StreamlineLengths" + /** CoordinatePointModel */ + CoordinatePointModel: { + /** @Type */ + "@type": string + /** + * @Context + * @default { + * "@vocab": "https://openminds.ebrains.eu/vocab/" + * } + */ + "@context"?: components["schemas"]["VocabModel"] + /** + * @Id + * @description Metadata node identifier. + */ + "@id": string + /** + * coordinateSpace + * @description Two or three dimensional geometric setting. + */ + coordinateSpace: Record<string, never> + /** + * Coordinates + * @description Structured information on a quantitative value. + */ + coordinates: (components["schemas"]["api__models__openminds__SANDS__v3__miscellaneous__coordinatePoint__Coordinates"])[] + } + /** Copyright */ + Copyright: { + /** + * @Context + * @default { + * "@vocab": "https://openminds.ebrains.eu/vocab/" + * } + */ + "@context"?: components["schemas"]["VocabModel"] + /** + * holder + * @description Legal person in possession of something. + */ + holder: (Record<string, never>)[] + /** + * year + * @description Cycle in the Gregorian calendar specified by a number and comprised of 365 or 366 days divided into 12 months beginning with January and ending with December. + */ + year: string + } + /** + * CorticalProfileTypes + * @description An enumeration. + * @enum {unknown} + */ + CorticalProfileTypes: "ReceptorDensityProfile" | "CellDensityProfile" | "BigBrainIntensityProfile" + /** DataFrameModel */ + DataFrameModel: { + /** @Type */ + "@type": string + /** Index */ + index: (Record<string, never>)[] + /** Dtype */ + dtype: string + /** Columns */ + columns: (Record<string, never>)[] + /** Ndim */ + ndim: number + /** Data */ + data: ((number | string | (number)[])[])[] + } + /** EbrainsDatasetModel */ + EbrainsDatasetModel: { + /** @Type */ + "@type": string + /** @Id */ + "@id": string + /** Name */ + name: string + /** Urls */ + urls: (components["schemas"]["EbrainsDsUrl"])[] + /** Description */ + description: string + /** Contributors */ + contributors: (components["schemas"]["EbrainsDsPerson"])[] + /** Ebrains Page */ + ebrains_page: string + /** Custodians */ + custodians: (components["schemas"]["EbrainsDsPerson"])[] + } + /** EbrainsDsPerson */ + EbrainsDsPerson: { + /** @Type */ + "@type": string + /** @Id */ + "@id": string + /** Schema.Org/Shortname */ + "schema.org/shortName": string + /** Identifier */ + identifier: string + /** Shortname */ + shortName: string + /** Name */ + name: string + } + /** EbrainsDsUrl */ + EbrainsDsUrl: { + /** @Type */ + "@type": string + /** Url */ + url: string + } + /** HTTPValidationError */ + HTTPValidationError: { + /** Detail */ + detail?: (components["schemas"]["ValidationError"])[] + } + /** HasAnnotation */ + HasAnnotation: { + /** + * @Context + * @default { + * "@vocab": "https://openminds.ebrains.eu/vocab/" + * } + */ + "@context"?: components["schemas"]["VocabModel"] + /** + * Bestviewpoint + * @description Structured information on a coordinate point. + */ + bestViewPoint?: components["schemas"]["BestViewPoint"] + /** + * criteria + * @description Aspects or standards on which a judgement or decision is based. + */ + criteria?: Record<string, never> + /** + * criteriaQualityType + * @description Distinct class that defines how the judgement or decision was made for a particular criteria. + */ + criteriaQualityType: Record<string, never> + /** + * displayColor + * @description Preferred coloring. + */ + displayColor?: string + /** + * inspiredBy + * @description Reference to an inspiring element. + */ + inspiredBy?: (Record<string, never>)[] + /** + * internalIdentifier + * @description Term or code that identifies someone or something within a particular product. + */ + internalIdentifier: string + /** + * laterality + * @description Differentiation between a pair of lateral homologous parts of the body. + */ + laterality?: (Record<string, never>)[] + /** + * visualizedIn + * @description Reference to an image in which something is visible. + */ + visualizedIn?: Record<string, never> + } + /** HasTerminologyVersion */ + HasTerminologyVersion: { + /** + * @Context + * @default { + * "@vocab": "https://openminds.ebrains.eu/vocab/" + * } + */ + "@context"?: components["schemas"]["VocabModel"] + /** + * definedIn + * @description Reference to a file instance in which something is stored. + */ + definedIn?: (Record<string, never>)[] + /** hasEntityVersion */ + hasEntityVersion: (Record<string, never>)[] + /** + * ontologyIdentifier + * @description Term or code used to identify something or someone registered within a particular ontology. + */ + ontologyIdentifier?: (string)[] + } + /** LocationModel */ + LocationModel: { + /** @Type */ + "@type": string + space: components["schemas"]["SiibraAtIdModel"] + } + /** MapIndexModel */ + MapIndexModel: { + /** @Type */ + "@type": string + /** Volume */ + volume: number + /** Label */ + label?: number + /** Fragment */ + fragment?: string + } + /** MapModel */ + MapModel: { + /** @Type */ + "@type": string + /** @Id */ + "@id": string + /** Name */ + name: string + /** Shortname */ + shortname?: string + /** Modality */ + modality?: string + /** Description */ + description?: string + /** Publications */ + publications: (components["schemas"]["SiibraPublication"])[] + /** Datasets */ + datasets: (components["schemas"]["EbrainsDatasetModel"])[] + /** Species */ + species: string + /** Indices */ + indices: { + [key: string]: (components["schemas"]["MapIndexModel"])[] | undefined + } + /** Volumes */ + volumes: (components["schemas"]["VolumeModel"])[] + } + /** + * MapType + * @description An enumeration. + * @enum {string} + */ + MapType: "LABELLED" | "STATISTICAL" + /** OtherContribution */ + OtherContribution: { + /** + * @Context + * @default { + * "@vocab": "https://openminds.ebrains.eu/vocab/" + * } + */ + "@context"?: components["schemas"]["VocabModel"] + /** + * contributionType + * @description Distinct class of what was given or supplied as a part or share. + */ + contributionType: (Record<string, never>)[] + /** + * contributor + * @description Legal person that gave or supplied something as a part or share. + */ + contributor: Record<string, never> + } + /** Page[CommonCoordinateSpaceModel] */ + Page_CommonCoordinateSpaceModel_: { + /** Items */ + items: (components["schemas"]["CommonCoordinateSpaceModel"])[] + /** Total */ + total: number + /** Page */ + page: number + /** Size */ + size: number + /** Pages */ + pages?: number + } + /** Page[ParcellationEntityVersionModel] */ + Page_ParcellationEntityVersionModel_: { + /** Items */ + items: (components["schemas"]["ParcellationEntityVersionModel"])[] + /** Total */ + total: number + /** Page */ + page: number + /** Size */ + size: number + /** Pages */ + pages?: number + } + /** Page[SiibraAtlasModel] */ + Page_SiibraAtlasModel_: { + /** Items */ + items: (components["schemas"]["SiibraAtlasModel"])[] + /** Total */ + total: number + /** Page */ + page: number + /** Size */ + size: number + /** Pages */ + pages?: number + } + /** Page[SiibraCorticalProfileModel] */ + Page_SiibraCorticalProfileModel_: { + /** Items */ + items: (components["schemas"]["SiibraCorticalProfileModel"])[] + /** Total */ + total: number + /** Page */ + page: number + /** Size */ + size: number + /** Pages */ + pages?: number + } + /** Page[SiibraParcellationModel] */ + Page_SiibraParcellationModel_: { + /** Items */ + items: (components["schemas"]["SiibraParcellationModel"])[] + /** Total */ + total: number + /** Page */ + page: number + /** Size */ + size: number + /** Pages */ + pages?: number + } + /** Page[SiibraRegionalConnectivityModel] */ + Page_SiibraRegionalConnectivityModel_: { + /** Items */ + items: (components["schemas"]["SiibraRegionalConnectivityModel"])[] + /** Total */ + total: number + /** Page */ + page: number + /** Size */ + size: number + /** Pages */ + pages?: number + } + /** Page[SiibraTabularModel] */ + Page_SiibraTabularModel_: { + /** Items */ + items: (components["schemas"]["SiibraTabularModel"])[] + /** Total */ + total: number + /** Page */ + page: number + /** Size */ + size: number + /** Pages */ + pages?: number + } + /** Page[SiibraVoiModel] */ + Page_SiibraVoiModel_: { + /** Items */ + items: (components["schemas"]["SiibraVoiModel"])[] + /** Total */ + total: number + /** Page */ + page: number + /** Size */ + size: number + /** Pages */ + pages?: number + } + /** Page[Union[SiibraCorticalProfileModel, SiibraTabularModel, SiibraReceptorDensityFp]] */ + Page_Union_SiibraCorticalProfileModel__SiibraTabularModel__SiibraReceptorDensityFp__: { + /** Items */ + items: (components["schemas"]["SiibraCorticalProfileModel"] | components["schemas"]["SiibraTabularModel"] | components["schemas"]["SiibraReceptorDensityFp"])[] + /** Total */ + total: number + /** Page */ + page: number + /** Size */ + size: number + /** Pages */ + pages?: number + } + /** Page[str] */ + Page_str_: { + /** Items */ + items: (string)[] + /** Total */ + total: number + /** Page */ + page: number + /** Size */ + size: number + /** Pages */ + pages?: number + } + /** ParcellationEntityVersionModel */ + ParcellationEntityVersionModel: { + /** @Type */ + "@type": string + /** + * @Context + * @default { + * "@vocab": "https://openminds.ebrains.eu/vocab/" + * } + */ + "@context"?: components["schemas"]["VocabModel"] + /** + * @Id + * @description Metadata node identifier. + */ + "@id": string + hasAnnotation?: components["schemas"]["HasAnnotation"] + /** + * hasParent + * @description Reference to a parent object or legal person. + */ + hasParent?: (Record<string, never>)[] + /** lookupLabel */ + lookupLabel?: string + /** + * name + * @description Word or phrase that constitutes the distinctive designation of a being or thing. + */ + name?: string + /** + * ontologyIdentifier + * @description Term or code used to identify something or someone registered within a particular ontology. + */ + ontologyIdentifier?: (string)[] + /** Relationassessment */ + relationAssessment?: components["schemas"]["RelationAssessmentItem"] | components["schemas"]["RelationAssessmentItem1"] + /** + * versionIdentifier + * @description Term or code used to identify the version of something. + */ + versionIdentifier: string + /** + * versionInnovation + * @description Documentation on what changed in comparison to a previously published form of something. + */ + versionInnovation?: string + } + /** QuantitativeOverlapItem */ + QuantitativeOverlapItem: { + /** + * @Context + * @default { + * "@vocab": "https://openminds.ebrains.eu/vocab/" + * } + */ + "@context"?: components["schemas"]["VocabModel"] + /** + * typeOfUncertainty + * @description Distinct technique used to quantify the uncertainty of a measurement. + */ + typeOfUncertainty?: Record<string, never> + /** + * uncertainty + * @description Quantitative value range defining the uncertainty of a measurement. + */ + uncertainty?: (number)[] + /** + * unit + * @description Determinate quantity adopted as a standard of measurement. + */ + unit?: Record<string, never> + /** + * value + * @description Entry for a property. + */ + value: number + } + /** QuantitativeOverlapItem1 */ + QuantitativeOverlapItem1: { + /** + * @Context + * @default { + * "@vocab": "https://openminds.ebrains.eu/vocab/" + * } + */ + "@context"?: components["schemas"]["VocabModel"] + /** + * maxValue + * @description Greatest quantity attained or allowed. + */ + maxValue: number + /** maxValueUnit */ + maxValueUnit?: Record<string, never> + /** + * minValue + * @description Smallest quantity attained or allowed. + */ + minValue: number + /** minValueUnit */ + minValueUnit?: Record<string, never> + } + /** RelationAssessmentItem */ + RelationAssessmentItem: { + /** + * @Context + * @default { + * "@vocab": "https://openminds.ebrains.eu/vocab/" + * } + */ + "@context"?: components["schemas"]["VocabModel"] + /** + * criteria + * @description Aspects or standards on which a judgement or decision is based. + */ + criteria?: Record<string, never> + /** + * inRelationTo + * @description Reference to a related element. + */ + inRelationTo: Record<string, never> + /** + * qualitativeOverlap + * @description Semantic characterization of how much two things occupy the same space. + */ + qualitativeOverlap: Record<string, never> + } + /** RelationAssessmentItem1 */ + RelationAssessmentItem1: { + /** + * @Context + * @default { + * "@vocab": "https://openminds.ebrains.eu/vocab/" + * } + */ + "@context"?: components["schemas"]["VocabModel"] + /** + * criteria + * @description Aspects or standards on which a judgement or decision is based. + */ + criteria?: Record<string, never> + /** + * inRelationTo + * @description Reference to a related element. + */ + inRelationTo: Record<string, never> + /** Quantitativeoverlap */ + quantitativeOverlap: components["schemas"]["QuantitativeOverlapItem"] | components["schemas"]["QuantitativeOverlapItem1"] + } + /** SeriesModel */ + SeriesModel: { + /** @Type */ + "@type": string + /** Name */ + name?: string + /** Dtype */ + dtype: string + /** Index */ + index: (string | number | number)[] + /** Data */ + data: (number)[] + } + /** SiibraAnchorModel */ + SiibraAnchorModel: { + /** @Type */ + "@type": string + location?: components["schemas"]["LocationModel"] + /** Regions */ + regions: (components["schemas"]["SiibraRegionAssignmentQual"])[] + } + /** SiibraAtIdModel */ + SiibraAtIdModel: { + /** @Id */ + "@id": string + } + /** SiibraAtlasModel */ + SiibraAtlasModel: { + /** @Type */ + "@type": string + /** @Id */ + "@id": string + /** Name */ + name: string + /** Spaces */ + spaces: (components["schemas"]["SiibraAtIdModel"])[] + /** Parcellations */ + parcellations: (components["schemas"]["SiibraAtIdModel"])[] + /** Species */ + species: string + } + /** SiibraCorticalProfileModel */ + SiibraCorticalProfileModel: { + /** @Type */ + "@type": string + /** Id */ + id: string + /** Modality */ + modality: string + /** Description */ + description: string + /** Name */ + name: string + /** Datasets */ + datasets: (components["schemas"]["EbrainsDatasetModel"])[] + anchor?: components["schemas"]["SiibraAnchorModel"] + /** Unit */ + unit?: string + /** Boundary Positions */ + boundary_positions: { + [key: string]: number | undefined + } + /** Boundaries Mapped */ + boundaries_mapped: boolean + data?: components["schemas"]["SeriesModel"] + } + /** SiibraParcellationModel */ + SiibraParcellationModel: { + /** @Type */ + "@type": string + /** @Id */ + "@id": string + /** Name */ + name: string + /** Modality */ + modality?: string + /** Brainatlasversions */ + brainAtlasVersions: (components["schemas"]["BrainAtlasVersionModel"])[] + version?: components["schemas"]["SiibraParcellationVersionModel"] + } + /** SiibraParcellationVersionModel */ + SiibraParcellationVersionModel: { + /** @Type */ + "@type": string + /** Name */ + name: string + /** Deprecated */ + deprecated?: boolean + prev?: components["schemas"]["SiibraAtIdModel"] + next?: components["schemas"]["SiibraAtIdModel"] + } + /** SiibraPublication */ + SiibraPublication: { + /** @Type */ + "@type": string + /** Citation */ + citation: string + /** Url */ + url: string + } + /** SiibraReceptorDensityFp */ + SiibraReceptorDensityFp: { + /** @Type */ + "@type": string + /** Id */ + id: string + /** Modality */ + modality: string + /** Description */ + description: string + /** Name */ + name: string + /** Datasets */ + datasets: (components["schemas"]["EbrainsDatasetModel"])[] + anchor?: components["schemas"]["SiibraAnchorModel"] + data?: components["schemas"]["DataFrameModel"] + /** Neurotransmitters */ + neurotransmitters?: (string)[] + /** Receptors */ + receptors?: (string)[] + } + /** SiibraRegionAssignmentQual */ + SiibraRegionAssignmentQual: { + /** @Type */ + "@type": string + region: components["schemas"]["ParcellationEntityVersionModel"] + /** Qualification */ + qualification: string + } + /** SiibraRegionalConnectivityModel */ + SiibraRegionalConnectivityModel: { + /** @Type */ + "@type": string + /** Id */ + id: string + /** Modality */ + modality: string + /** Description */ + description: string + /** Name */ + name: string + /** Datasets */ + datasets: (components["schemas"]["EbrainsDatasetModel"])[] + anchor?: components["schemas"]["SiibraAnchorModel"] + /** Cohort */ + cohort: string + /** Subjects */ + subjects: (string)[] + /** Matrices */ + matrices?: { + [key: string]: components["schemas"]["DataFrameModel"] | undefined + } + } + /** SiibraTabularModel */ + SiibraTabularModel: { + /** @Type */ + "@type": string + /** Id */ + id: string + /** Modality */ + modality: string + /** Description */ + description: string + /** Name */ + name: string + /** Datasets */ + datasets: (components["schemas"]["EbrainsDatasetModel"])[] + anchor?: components["schemas"]["SiibraAnchorModel"] + data?: components["schemas"]["DataFrameModel"] + } + /** SiibraVoiModel */ + SiibraVoiModel: { + /** @Type */ + "@type": string + /** Id */ + id: string + /** Modality */ + modality: string + /** Description */ + description: string + /** Name */ + name: string + /** Datasets */ + datasets: (components["schemas"]["EbrainsDatasetModel"])[] + anchor?: components["schemas"]["SiibraAnchorModel"] + volume: components["schemas"]["VolumeModel"] + boundingbox: components["schemas"]["BoundingBoxModel"] + } + /** StatisticModelInfo */ + StatisticModelInfo: { + /** Min */ + min: number + /** Max */ + max: number + } + /** + * TabularTypes + * @description An enumeration. + * @enum {unknown} + */ + TabularTypes: "ReceptorDensityFingerprint" | "LayerwiseBigBrainIntensities" | "LayerwiseCellDensity" + /** ValidationError */ + ValidationError: { + /** Location */ + loc: (string | number)[] + /** Message */ + msg: string + /** Error Type */ + type: string + } + /** VocabModel */ + VocabModel: { + /** @Vocab */ + "@vocab": string + } + /** VolumeModel */ + VolumeModel: { + /** @Type */ + "@type": string + /** Name */ + name: string + /** Formats */ + formats: (string)[] + /** Providesmesh */ + providesMesh: boolean + /** Providesimage */ + providesImage: boolean + /** Fragments */ + fragments: { + [key: string]: (string)[] | undefined + } + /** Variant */ + variant?: string + /** Providedvolumes */ + providedVolumes: { + [key: string]: (string | ({ + [key: string]: string | undefined + })) | undefined + } + space: components["schemas"]["SiibraAtIdModel"] + } + /** Coordinates */ + api__models__openminds__SANDS__v3__atlas__parcellationEntityVersion__Coordinates: { + /** + * @Context + * @default { + * "@vocab": "https://openminds.ebrains.eu/vocab/" + * } + */ + "@context"?: components["schemas"]["VocabModel"] + /** + * typeOfUncertainty + * @description Distinct technique used to quantify the uncertainty of a measurement. + */ + typeOfUncertainty?: Record<string, never> + /** + * uncertainty + * @description Quantitative value range defining the uncertainty of a measurement. + */ + uncertainty?: (number)[] + /** + * unit + * @description Determinate quantity adopted as a standard of measurement. + */ + unit?: Record<string, never> + /** + * value + * @description Entry for a property. + */ + value: number + } + /** Coordinates */ + api__models__openminds__SANDS__v3__miscellaneous__coordinatePoint__Coordinates: { + /** + * @Context + * @default { + * "@vocab": "https://openminds.ebrains.eu/vocab/" + * } + */ + "@context"?: components["schemas"]["VocabModel"] + /** + * typeOfUncertainty + * @description Distinct technique used to quantify the uncertainty of a measurement. + */ + typeOfUncertainty?: Record<string, never> + /** + * uncertainty + * @description Quantitative value range defining the uncertainty of a measurement. + */ + uncertainty?: (number)[] + /** + * unit + * @description Determinate quantity adopted as a standard of measurement. + */ + unit?: Record<string, never> + /** + * value + * @description Entry for a property. + */ + value: number + } + } + responses: never + parameters: never + requestBodies: never + headers: never + pathItems: never +} + +export type external = Record<string, never>; + +export interface operations { + + get_all_atlases_atlases_get: { + /** Get All Atlases */ + parameters?: { + query?: { + page?: number + size?: number + } + } + responses: { + /** @description Successful Response */ + 200: { + content: { + "application/json": components["schemas"]["Page_SiibraAtlasModel_"] + } + } + /** @description Validation Error */ + 422: { + content: { + "application/json": components["schemas"]["HTTPValidationError"] + } + } + } + } + get_single_atlas_atlases__atlas_id__get: { + /** Get Single Atlas */ + parameters: { + path: { + atlas_id: string + } + } + responses: { + /** @description Successful Response */ + 200: { + content: { + "application/json": components["schemas"]["SiibraAtlasModel"] + } + } + /** @description Validation Error */ + 422: { + content: { + "application/json": components["schemas"]["HTTPValidationError"] + } + } + } + } + get_all_spaces_spaces_get: { + /** Get All Spaces */ + parameters?: { + query?: { + page?: number + size?: number + } + } + responses: { + /** @description Successful Response */ + 200: { + content: { + "application/json": components["schemas"]["Page_CommonCoordinateSpaceModel_"] + } + } + /** @description Validation Error */ + 422: { + content: { + "application/json": components["schemas"]["HTTPValidationError"] + } + } + } + } + get_single_space_spaces__space_id__get: { + /** Get Single Space */ + parameters: { + path: { + space_id: string + } + } + responses: { + /** @description Successful Response */ + 200: { + content: { + "application/json": components["schemas"]["CommonCoordinateSpaceModel"] + } + } + /** @description Validation Error */ + 422: { + content: { + "application/json": components["schemas"]["HTTPValidationError"] + } + } + } + } + get_all_parcellations_parcellations_get: { + /** Get All Parcellations */ + parameters?: { + query?: { + page?: number + size?: number + } + } + responses: { + /** @description Successful Response */ + 200: { + content: { + "application/json": components["schemas"]["Page_SiibraParcellationModel_"] + } + } + /** @description Validation Error */ + 422: { + content: { + "application/json": components["schemas"]["HTTPValidationError"] + } + } + } + } + get_single_parcellation_parcellations__parcellation_id__get: { + /** Get Single Parcellation */ + parameters: { + path: { + parcellation_id: string + } + } + responses: { + /** @description Successful Response */ + 200: { + content: { + "application/json": components["schemas"]["SiibraParcellationModel"] + } + } + /** @description Validation Error */ + 422: { + content: { + "application/json": components["schemas"]["HTTPValidationError"] + } + } + } + } + get_all_regions_regions_get: { + /** Get All Regions */ + parameters: { + query: { + parcellation_id: string + page?: number + size?: number + } + } + responses: { + /** @description Successful Response */ + 200: { + content: { + "application/json": components["schemas"]["Page_ParcellationEntityVersionModel_"] + } + } + /** @description Validation Error */ + 422: { + content: { + "application/json": components["schemas"]["HTTPValidationError"] + } + } + } + } + get_all_regions_regions__region_id__get: { + /** Get All Regions */ + parameters: { + query: { + parcellation_id: string + space_id: string + } + path: { + region_id: string + } + } + responses: { + /** @description Successful Response */ + 200: { + content: { + "application/json": components["schemas"]["ParcellationEntityVersionModel"] + } + } + /** @description Validation Error */ + 422: { + content: { + "application/json": components["schemas"]["HTTPValidationError"] + } + } + } + } + route_get_map_map_get: { + /** Route Get Map */ + parameters: { + query: { + parcellation_id: string + space_id: string + map_type: components["schemas"]["MapType"] + } + } + responses: { + /** @description Successful Response */ + 200: { + content: { + "application/json": components["schemas"]["MapModel"] + } + } + /** @description Validation Error */ + 422: { + content: { + "application/json": components["schemas"]["HTTPValidationError"] + } + } + } + } + route_get_parcellation_labelled_map_map_labelled_map_nii_gz_get: { + /** Route Get Parcellation Labelled Map */ + parameters: { + query: { + parcellation_id: string + space_id: string + } + } + responses: { + /** @description Successful Response */ + 200: never + /** @description Validation Error */ + 422: { + content: { + "application/json": components["schemas"]["HTTPValidationError"] + } + } + } + } + route_get_region_statistical_map_map_statistical_map_nii_gz_get: { + /** Route Get Region Statistical Map */ + parameters: { + query: { + parcellation_id: string + space_id: string + region_id: string + } + } + responses: { + /** @description Successful Response */ + 200: never + /** @description Validation Error */ + 422: { + content: { + "application/json": components["schemas"]["HTTPValidationError"] + } + } + } + } + route_get_region_statistical_map_map_statistical_map_info_json_get: { + /** Route Get Region Statistical Map */ + parameters: { + query: { + parcellation_id: string + space_id: string + region_id: string + } + } + responses: { + /** @description Successful Response */ + 200: { + content: { + "application/json": components["schemas"]["StatisticModelInfo"] + } + } + /** @description Validation Error */ + 422: { + content: { + "application/json": components["schemas"]["HTTPValidationError"] + } + } + } + } + get_all_feature_types_feature__types_get: { + /** Get All Feature Types */ + parameters?: { + query?: { + page?: number + size?: number + } + } + responses: { + /** @description Successful Response */ + 200: { + content: { + "application/json": components["schemas"]["Page_str_"] + } + } + /** @description Validation Error */ + 422: { + content: { + "application/json": components["schemas"]["HTTPValidationError"] + } + } + } + } + get_all_connectivity_features_feature_RegionalConnectivity_get: { + /** Get All Connectivity Features */ + parameters: { + query: { + parcellation_id: string + type?: components["schemas"]["ConnectivityTypes"] + page?: number + size?: number + } + } + responses: { + /** @description Successful Response */ + 200: { + content: { + "application/json": components["schemas"]["Page_SiibraRegionalConnectivityModel_"] + } + } + /** @description Validation Error */ + 422: { + content: { + "application/json": components["schemas"]["HTTPValidationError"] + } + } + } + } + get_single_connectivity_feature_feature_RegionalConnectivity__feature_id__get: { + /** Get Single Connectivity Feature */ + parameters: { + query: { + parcellation_id: string + subject: string + type?: components["schemas"]["ConnectivityTypes"] + } + path: { + feature_id: string + } + } + responses: { + /** @description Successful Response */ + 200: { + content: { + "application/json": components["schemas"]["SiibraRegionalConnectivityModel"] + } + } + /** @description Validation Error */ + 422: { + content: { + "application/json": components["schemas"]["HTTPValidationError"] + } + } + } + } + get_all_connectivity_features_feature_CorticalProfile_get: { + /** Get All Connectivity Features */ + parameters: { + query: { + parcellation_id: string + region_id: string + type?: components["schemas"]["CorticalProfileTypes"] + page?: number + size?: number + } + } + responses: { + /** @description Successful Response */ + 200: { + content: { + "application/json": components["schemas"]["Page_SiibraCorticalProfileModel_"] + } + } + /** @description Validation Error */ + 422: { + content: { + "application/json": components["schemas"]["HTTPValidationError"] + } + } + } + } + get_single_connectivity_feature_feature_CorticalProfile__feature_id__get: { + /** Get Single Connectivity Feature */ + parameters: { + query: { + parcellation_id: string + region_id: string + type?: components["schemas"]["CorticalProfileTypes"] + } + path: { + feature_id: string + } + } + responses: { + /** @description Successful Response */ + 200: { + content: { + "application/json": components["schemas"]["SiibraCorticalProfileModel"] + } + } + /** @description Validation Error */ + 422: { + content: { + "application/json": components["schemas"]["HTTPValidationError"] + } + } + } + } + get_all_tabular_feature_Tabular_get: { + /** Get All Tabular */ + parameters: { + query: { + parcellation_id: string + region_id: string + type?: components["schemas"]["TabularTypes"] + page?: number + size?: number + } + } + responses: { + /** @description Successful Response */ + 200: { + content: { + "application/json": components["schemas"]["Page_Union_SiibraCorticalProfileModel__SiibraTabularModel__SiibraReceptorDensityFp__"] + } + } + /** @description Validation Error */ + 422: { + content: { + "application/json": components["schemas"]["HTTPValidationError"] + } + } + } + } + get_single_tabular_feature_Tabular__feature_id__get: { + /** Get Single Tabular */ + parameters: { + query: { + parcellation_id: string + region_id: string + type?: components["schemas"]["TabularTypes"] + } + path: { + feature_id: string + } + } + responses: { + /** @description Successful Response */ + 200: { + content: { + "application/json": components["schemas"]["SiibraCorticalProfileModel"] | components["schemas"]["SiibraTabularModel"] | components["schemas"]["SiibraReceptorDensityFp"] + } + } + /** @description Validation Error */ + 422: { + content: { + "application/json": components["schemas"]["HTTPValidationError"] + } + } + } + } + get_all_voi_feature_VolumeOfInterest_get: { + /** Get All Voi */ + parameters: { + query: { + space_id: string + bbox?: string + page?: number + size?: number + } + } + responses: { + /** @description Successful Response */ + 200: { + content: { + "application/json": components["schemas"]["Page_SiibraVoiModel_"] + } + } + /** @description Validation Error */ + 422: { + content: { + "application/json": components["schemas"]["HTTPValidationError"] + } + } + } + } + get_single_voi_feature_VolumeOfInterest__feature_id__get: { + /** Get Single Voi */ + parameters: { + query: { + space_id: string + bbox?: string + } + path: { + feature_id: string + } + } + responses: { + /** @description Successful Response */ + 200: { + content: { + "application/json": components["schemas"]["SiibraVoiModel"] + } + } + /** @description Validation Error */ + 422: { + content: { + "application/json": components["schemas"]["HTTPValidationError"] + } + } + } + } + get_all_gene_feature_GeneExpressions_get: { + /** Get All Gene */ + parameters: { + query: { + parcellation_id: string + region_id: string + gene: string + page?: number + size?: number + } + } + responses: { + /** @description Successful Response */ + 200: { + content: { + "application/json": components["schemas"]["Page_SiibraTabularModel_"] + } + } + /** @description Validation Error */ + 422: { + content: { + "application/json": components["schemas"]["HTTPValidationError"] + } + } + } + } + get_all_gene_feature_GeneExpressions__feature_id__get: { + /** Get All Gene */ + parameters: { + query: { + parcellation_id: string + region_id: string + gene: string + } + path: { + feature_id: string + } + } + responses: { + /** @description Successful Response */ + 200: { + content: { + "application/json": components["schemas"]["SiibraTabularModel"] + } + } + /** @description Validation Error */ + 422: { + content: { + "application/json": components["schemas"]["HTTPValidationError"] + } + } + } + } +} diff --git a/src/atlasComponents/sapi/translate_v3.ts b/src/atlasComponents/sapi/translate_v3.ts new file mode 100644 index 000000000..b8eeff87e --- /dev/null +++ b/src/atlasComponents/sapi/translate_v3.ts @@ -0,0 +1,338 @@ +import { + SxplrAtlas, SxplrParcellation, SxplrTemplate, SxplrRegion, NgLayerSpec, NgPrecompMeshSpec, NgSegLayerSpec, VoiFeature, Point, TemplateDefaultImage, TThreeSurferMesh, TThreeMesh, LabelledMap +} from "./type_sxplr" +import { PathReturn } from "./type_v3" +import { hexToRgb } from 'common/util' +import { components } from "./schema_v3" + + +class TranslateV3 { + + #atlasMap: Map<string, PathReturn<"/atlases/{atlas_id}">> = new Map() + retrieveAtlas(atlas: SxplrAtlas): PathReturn<"/atlases/{atlas_id}"> { + return this.#atlasMap.get(atlas.id) + } + async translateAtlas(atlas:PathReturn<"/atlases/{atlas_id}">): Promise<SxplrAtlas> { + this.#atlasMap.set(atlas["@id"], atlas) + return { + id: atlas["@id"], + name: atlas.name + } + } + + #parcellationMap: Map<string, PathReturn<"/parcellations/{parcellation_id}">> = new Map() + retrieveParcellation(parcellation: SxplrParcellation): PathReturn<"/parcellations/{parcellation_id}"> { + return this.#parcellationMap.get(parcellation.id) + } + async translateParcellation(parcellation:PathReturn<"/parcellations/{parcellation_id}">): Promise<SxplrParcellation> { + return { + id: parcellation["@id"], + name: parcellation.name, + modality: parcellation.modality, + } + } + + #templateMap: Map<string, PathReturn<"/spaces/{space_id}">> = new Map() + retrieveTemplate(template:SxplrTemplate): PathReturn<"/spaces/{space_id}"> { + if (!template) debugger + return this.#templateMap.get(template.id) + } + async translateTemplate(template:PathReturn<"/spaces/{space_id}">): Promise<SxplrTemplate> { + this.#templateMap.set(template["@id"], template) + return { + id: template["@id"], + name: template.fullName + } + } + + /** + * map of both name and id to region + */ + #regionMap: Map<string, PathReturn<"/regions/{region_id}">> = new Map() + retrieveRegion(region: SxplrRegion): PathReturn<"/regions/{region_id}"> { + return this.#regionMap.get(region.name) + } + async translateRegion(region: PathReturn<"/regions/{region_id}">): Promise<SxplrRegion> { + const { ['@id']: regionId } = region + this.#regionMap.set(regionId, region) + this.#regionMap.set(region.name, region) + return { + id: region["@id"], + name: region.name, + color: hexToRgb(region.hasAnnotation?.displayColor) as [number, number, number], + parentIds: region.hasParent.map( v => v["@id"] ) + } + } + + async translateSpaceToVolumeImage(template: SxplrTemplate): Promise<NgLayerSpec[]> { + if (!template) return [] + const space = this.retrieveTemplate(template) + if (!space) return [] + const returnObj: NgLayerSpec[] = [] + const validImages = space.defaultImage.filter(di => di.formats.includes("neuroglancer/precomputed")) + + for (const defaultImage of validImages) { + + const { providedVolumes } = defaultImage + + const { ['neuroglancer/precomputed']: precomputedVol } = providedVolumes + if (!precomputedVol) { + console.error(`neuroglancer/precomputed data source has not been found!`) + continue + } + if (typeof precomputedVol === "object") { + console.error(`template default image cannot have fragment`) + continue + } + const [transform, info] = await Promise.all([ + (async () => { + + const resp = await fetch(`${precomputedVol}/transform.json`) + if (resp.status >= 400) { + console.error(`cannot retrieve transform: ${resp.status}`) + return null + } + const transform: number[][] = await resp.json() + return transform + })(), + (async () => { + const resp = await fetch(`${precomputedVol}/info`) + if (resp.status >= 400) { + console.error(`cannot retrieve transform: ${resp.status}`) + return null + } + const info = await resp.json() + const { resolution, size } = info.scales[0] + return { + voxel: info.scales[0].size as [number, number, number], + real: [0, 1, 2].map(idx => resolution[idx] * size[idx]) as [number, number, number], + } + })() + ]) + returnObj.push({ + source: `precomputed://${precomputedVol}`, + transform, + info, + }) + } + return returnObj + } + + async translateSpaceToSurfaceImage(template: SxplrTemplate): Promise<TThreeMesh[]> { + if (!template) return [] + const space = this.retrieveTemplate(template) + if (!space) return [] + const returnObj: TThreeMesh[] = [] + const validImages = space.defaultImage.filter(di => di.formats.includes("gii-mesh")) + for (const defaultImage of validImages) { + const { providedVolumes, variant } = defaultImage + if (!variant) { + console.warn(`variant is not defined!`) + continue + } + + const { ['gii-mesh']: giiMesh } = providedVolumes + if (!giiMesh) { + console.warn(`default image does not have gii-mesh in provided volumes`) + continue + } + + if (typeof giiMesh === "string") { + console.warn(`three giiMesh is of type string, must be a dict!`) + continue + } + + for (const lateriality in giiMesh) { + const url = giiMesh[lateriality] + + returnObj.push({ + id: `${template.name}-${variant}-${lateriality}`, + space: template.name, + variant, + laterality: /left/.test(lateriality) + ? 'left' + : /right/.test(lateriality) + ? 'right' + : null, + url, + }) + } + } + return returnObj + } + + async translateLabelledMapToThreeLabel(map:PathReturn<"/map">) { + const threeLabelMap: Record<string, { laterality: 'left' | 'right', url: string, regions: Record<string, number> }> = {} + const registerLayer = (url: string, laterality: 'left' | 'right', region: string, label: number) => { + if (!threeLabelMap[url]) { + threeLabelMap[url] = { + laterality, + regions: {}, + url, + } + } + + threeLabelMap[url].regions[region] = label + } + for (const regionname in map.indices) { + for (const { volume: volIdx, fragment, label } of map.indices[regionname]) { + const volume = map.volumes[volIdx || 0] + if (!volume.formats.includes("gii-label")) { + console.warn(`getting three label error! volume does not provide gii-label! skipping!`) + continue + } + const { ["gii-label"]: giiLabel } = volume.providedVolumes + + + if (!fragment || !["left hemisphere", "right hemisphere"].includes(fragment)) { + console.warn(`either fragment not defined, or fragment is not '{left|right} hemisphere'. Skipping!`) + continue + } + if (!giiLabel[fragment]) { + console.warn(`fragment '${fragment}' not provided by volume.gii-label! skipping!`) + continue + } + let laterality: 'left' | 'right' + if (fragment.includes("left")) laterality = "left" + if (fragment.includes("right")) laterality = "right" + if (!laterality) { + console.warn(`cannot determine the laterality! skipping`) + continue + } + registerLayer(giiLabel[fragment], laterality, regionname, label) + } + } + return threeLabelMap + } + + async translateLabelledMapToNgSegLayers(map:PathReturn<"/map">): Promise<Record<string,{layer:NgSegLayerSpec, region: LabelledMap[]}>> { + const nglayerSpecMap: Record<string,{layer:NgSegLayerSpec, region: LabelledMap[]}> = {} + + const registerLayer = async (url: string, label: number, region: LabelledMap) => { + let segLayerSpec: {layer:NgSegLayerSpec, region: LabelledMap[]} + if (url in nglayerSpecMap){ + segLayerSpec = nglayerSpecMap[url] + } else { + const resp = await fetch(`${url}/transform.json`) + const transform = await resp.json() + segLayerSpec = { + layer: { + labelIndicies: [], + source: `precomputed://${url}`, + transform, + }, + region: [] + } + nglayerSpecMap[url] = segLayerSpec + } + segLayerSpec.layer.labelIndicies.push(label) + segLayerSpec.region.push(region) + } + for (const regionname in map.indices) { + for (const index of map.indices[regionname]) { + const { volume:volumeIdx=0, fragment, label } = index + if (!label) { + console.error(`Attempmting to add labelledmap with label '${label}'`) + } + let error = `Attempting to access map volume with idx '${volumeIdx}'` + if (!map.volumes[volumeIdx]) { + console.error(`${error}, IndexError, Skipping`) + continue + } + const volume = map.volumes[volumeIdx] + + if (!volume.providedVolumes["neuroglancer/precomputed"]) { + console.error(`${error}, volume does not provide neuroglancer/precomputed. Skipping.`) + continue + } + + const precomputedVol = volume.providedVolumes["neuroglancer/precomputed"] + if (typeof precomputedVol === "string") { + await registerLayer(precomputedVol, label, { name: regionname, label }) + continue + } + + if (!precomputedVol[fragment]) { + console.error(`${error}, fragment provided is '${fragment}', but was not available in volume: ${Object.keys(precomputedVol)}`) + continue + } + await registerLayer(precomputedVol[fragment], label, { name: regionname, label }) + } + } + + return nglayerSpecMap + } + + async translateSpaceToAuxMesh(template: SxplrTemplate): Promise<NgPrecompMeshSpec[]>{ + if (!template) return [] + const space = this.retrieveTemplate(template) + if (!space) return [] + const returnObj: NgPrecompMeshSpec[] = [] + const validImages = space.defaultImage.filter(di => di.formats.includes("neuroglancer/precompmesh/surface")) + + for (const defaultImage of validImages) { + + const { providedVolumes } = defaultImage + + const { ['neuroglancer/precompmesh/surface']: precompMeshVol } = providedVolumes + if (!precompMeshVol) { + console.error(`neuroglancer/precompmesh/surface data source has not been found!`) + continue + } + if (typeof precompMeshVol === "object") { + console.error(`template default image cannot have fragment`) + continue + } + + const splitPrecompMeshVol = precompMeshVol.split(" ") + if (splitPrecompMeshVol.length !== 2) { + console.error(`Expecting exactly two fragments by splitting precompmeshvol, but got ${splitPrecompMeshVol.length}`) + continue + } + const resp = await fetch(`${splitPrecompMeshVol[0]}/transform.json`) + if (resp.status >= 400) { + console.error(`cannot retrieve transform: ${resp.status}`) + continue + } + const transform: number[][] = await resp.json() + returnObj.push({ + source: `precompmesh://${splitPrecompMeshVol[0]}`, + transform, + auxMeshes: [{ + labelIndicies: [Number(splitPrecompMeshVol[1])], + name: "auxmesh" + }] + }) + } + return returnObj + } + + async translatePoint(point: components["schemas"]["CoordinatePointModel"]): Promise<Point> { + const sapiSpace = this.#templateMap.get(point.coordinateSpace['@id']) + const space = await this.translateTemplate(sapiSpace) + return { + space, + loc: point.coordinates.map(v => v.value) as [number, number, number] + } + } + + async translateVoi(voi: PathReturn<"/feature/VolumeOfInterest/{feature_id}">): Promise<VoiFeature> { + const { boundingbox } = voi + const { loc: center, space } = await this.translatePoint(boundingbox.center) + const { loc: maxpoint } = await this.translatePoint(boundingbox.maxpoint) + const { loc: minpoint } = await this.translatePoint(boundingbox.minpoint) + return { + bbox: { + center, + maxpoint, + minpoint, + space + }, + name: voi.name, + desc: voi.description, + id: voi.id + } + } +} + +export const translateV3Entities = new TranslateV3() diff --git a/src/atlasComponents/sapi/type.ts b/src/atlasComponents/sapi/type.ts index 905c0dee7..524d3d9a2 100644 --- a/src/atlasComponents/sapi/type.ts +++ b/src/atlasComponents/sapi/type.ts @@ -1,121 +1,121 @@ -import { OperatorFunction } from "rxjs" -import { map } from "rxjs/operators" -import { components, operations, paths } from "./schema" - -export type IdName = { - id: string - name: string -} - -export type SapiModalityModel = { - name: string - types: string[] -} - -type Point = [number, number, number] - -export type BoundingBoxConcept = [Point, Point] - -export type SapiAtlasModel = components["schemas"]["SapiAtlasModel"] -export type SapiSpaceModel = components["schemas"]["SapiSpaceModel"] -export type SapiParcellationModel = components["schemas"]["SapiParcellationModel"] -export type SapiRegionModel = components["schemas"]["siibra__openminds__SANDS__v3__atlas__parcellationEntityVersion__Model"] -export type OpenMINDSCoordinatePoint = components['schemas']['siibra__openminds__SANDS__v3__miscellaneous__coordinatePoint__Model'] -export type SxplrCoordinatePointExtension = { - openminds: OpenMINDSCoordinatePoint - name: string - description: string - color: string - '@id': string // should match the id of opendminds specs -} - -export type SapiRegionMapInfoModel = components["schemas"]["NiiMetadataModel"] -export type SapiVOIDataResponse = components["schemas"]["VOIDataModel"] -export type SapiVolumeModel = components["schemas"]["VolumeModel"] -export type SapiDatasetModel = components["schemas"]["DatasetJsonModel"] -export type SpyNpArrayDataModel = components["schemas"]["NpArrayDataModel"] -export type SapiIeegSessionModel = components["schemas"]["IEEGSessionModel"] - -/** - * utility types - */ -type PathReturn<T extends keyof paths> = Required<paths[T]["get"]["responses"][200]["content"]["application/json"]> -export type PaginatedResponse<T> = { - items: T[] - total: number - page: number - size: number -} - -/** - * serialization error type - */ -export type SapiSerializationErrorModel = components["schemas"]["SerializationErrorModel"] - -/** - * datafeatures from operations - */ - -export type SapiRegionalFeatureModel = PathReturn<"/atlases/{atlas_id}/parcellations/{parcellation_id}/regions/{region_id}/features/{feature_id}"> -export type SapiParcellationFeatureModel = PathReturn<"/atlases/{atlas_id}/parcellations/{parcellation_id}/features/{feature_id}"> -export type SapiSpatialFeatureModel = PathReturn<"/atlases/{atlas_id}/spaces/{space_id}/features/{feature_id}"> - -export type SapiFeatureModel = SapiRegionalFeatureModel | SapiSpatialFeatureModel | SapiParcellationFeatureModel - -/** - * specific data features - */ - -export type SapiRegionalFeatureReceptorModel = components["schemas"]["ReceptorDatasetModel"] -export type SapiParcellationFeatureMatrixModel = components["schemas"]["ConnectivityMatrixDataModel"] - - -export const CLEANED_IEEG_DATASET_TYPE = 'sxplr/cleanedIeegDataset' -export type CleanedIeegDataset = Required< - Omit<SapiDatasetModel, "@type"> & { - '@type': 'sxplr/cleanedIeegDataset' - sessions: Record<string, Omit<SapiIeegSessionModel, "dataset">> - } -> - -export function cleanIeegSessionDatasets(ieegSessions: SapiIeegSessionModel[]): CleanedIeegDataset[]{ - const returnArr: CleanedIeegDataset[] = [] - for (const sess of ieegSessions) { - const { dataset, ...itemToAppend } = sess - const existing = returnArr.find(it => it["@id"] === dataset["@id"]) - if (!existing) { - returnArr.push({ - ...dataset, - '@type': CLEANED_IEEG_DATASET_TYPE, - sessions: { - [sess.sub_id]: itemToAppend - } - }) - continue - } - existing.sessions[sess.sub_id] = itemToAppend - } - return returnArr -} - -export type SxplrCleanedFeatureModel = CleanedIeegDataset - -export function guardPipe< - InputType, - GuardType extends InputType ->( - guardFn: (input: InputType) => input is GuardType -): OperatorFunction<InputType, GuardType> { - return src => src.pipe( - map(val => { - if (guardFn(val)) { - return val - } - throw new Error(`TypeGuard Error`) - }) - ) -} - -export type SapiQueryPriorityArg = { - priority: number -} +// import { OperatorFunction } from "rxjs" +// import { map } from "rxjs/operators" +// import { components, operations, paths } from "./schema" + +// export type IdName = { +// id: string +// name: string +// } + +// export type SapiModalityModel = { +// name: string +// types: string[] +// } + +// type Point = [number, number, number] + +// export type BoundingBoxConcept = [Point, Point] + +// export type SapiAtlasModel = components["schemas"]["SapiAtlasModel"] +// export type SapiSpaceModel = components["schemas"]["SapiSpaceModel"] +// export type SapiParcellationModel = components["schemas"]["SapiParcellationModel"] +// export type SapiRegionModel = components["schemas"]["siibra__openminds__SANDS__v3__atlas__parcellationEntityVersion__Model"] +// export type OpenMINDSCoordinatePoint = components['schemas']['siibra__openminds__SANDS__v3__miscellaneous__coordinatePoint__Model'] +// export type SxplrCoordinatePointExtension = { +// openminds: OpenMINDSCoordinatePoint +// name: string +// description: string +// color: string +// '@id': string // should match the id of opendminds specs +// } + +// export type SapiRegionMapInfoModel = components["schemas"]["NiiMetadataModel"] +// export type SapiVOIDataResponse = components["schemas"]["VOIDataModel"] +// export type SapiVolumeModel = components["schemas"]["VolumeModel"] +// export type SapiDatasetModel = components["schemas"]["DatasetJsonModel"] +// export type SpyNpArrayDataModel = components["schemas"]["NpArrayDataModel"] +// export type SapiIeegSessionModel = components["schemas"]["IEEGSessionModel"] + +// /** +// * utility types +// */ +// type PathReturn<T extends keyof paths> = Required<paths[T]["get"]["responses"][200]["content"]["application/json"]> +// export type PaginatedResponse<T> = { +// items: T[] +// total: number +// page: number +// size: number +// } + +// /** +// * serialization error type +// */ +// export type SapiSerializationErrorModel = components["schemas"]["SerializationErrorModel"] + +// /** +// * datafeatures from operations +// */ + +// export type SapiRegionalFeatureModel = PathReturn<"/atlases/{atlas_id}/parcellations/{parcellation_id}/regions/{region_id}/features/{feature_id}"> +// export type SapiParcellationFeatureModel = PathReturn<"/atlases/{atlas_id}/parcellations/{parcellation_id}/features/{feature_id}"> +// export type SapiSpatialFeatureModel = PathReturn<"/atlases/{atlas_id}/spaces/{space_id}/features/{feature_id}"> + +// export type SapiFeatureModel = SapiRegionalFeatureModel | SapiSpatialFeatureModel | SapiParcellationFeatureModel + +// /** +// * specific data features +// */ + +// export type SapiRegionalFeatureReceptorModel = components["schemas"]["ReceptorDatasetModel"] +// export type SapiParcellationFeatureMatrixModel = components["schemas"]["ConnectivityMatrixDataModel"] + + +// export const CLEANED_IEEG_DATASET_TYPE = 'sxplr/cleanedIeegDataset' +// export type CleanedIeegDataset = Required< +// Omit<SapiDatasetModel, "@type"> & { +// '@type': 'sxplr/cleanedIeegDataset' +// sessions: Record<string, Omit<SapiIeegSessionModel, "dataset">> +// } +// > + +// export function cleanIeegSessionDatasets(ieegSessions: SapiIeegSessionModel[]): CleanedIeegDataset[]{ +// const returnArr: CleanedIeegDataset[] = [] +// for (const sess of ieegSessions) { +// const { dataset, ...itemToAppend } = sess +// const existing = returnArr.find(it => it["@id"] === dataset["@id"]) +// if (!existing) { +// returnArr.push({ +// ...dataset, +// '@type': CLEANED_IEEG_DATASET_TYPE, +// sessions: { +// [sess.sub_id]: itemToAppend +// } +// }) +// continue +// } +// existing.sessions[sess.sub_id] = itemToAppend +// } +// return returnArr +// } + +// export type SxplrCleanedFeatureModel = CleanedIeegDataset + +// export function guardPipe< +// InputType, +// GuardType extends InputType +// >( +// guardFn: (input: InputType) => input is GuardType +// ): OperatorFunction<InputType, GuardType> { +// return src => src.pipe( +// map(val => { +// if (guardFn(val)) { +// return val +// } +// throw new Error(`TypeGuard Error`) +// }) +// ) +// } + +// export type SapiQueryPriorityArg = { +// priority: number +// } diff --git a/src/atlasComponents/sapi/type_sxplr.ts b/src/atlasComponents/sapi/type_sxplr.ts new file mode 100644 index 000000000..0e5d6f8a7 --- /dev/null +++ b/src/atlasComponents/sapi/type_sxplr.ts @@ -0,0 +1,104 @@ +/** + * Here, you will find the type interface used by siibra-explorer + * SAPI types can change in the future, but hopefully, the setup can allow + * a much smoother transition to new API + */ + + +/** + * TODO do a global search on type_v3 + * anything outside src/atlasComponent should directly import from type_sxplr, and not from type_v3, or worse type, schema_v3 + */ + +export type SxplrRegion = { + id: string + name: string + centroid?: Point + color?: [number, number, number] + parentIds:string[] +} & Partial<AdditionalInfo> + +export type SxplrParcellation = { + id: string + name: string + modality?: string +} & Partial<AdditionalInfo> + +export type SxplrTemplate = { + id: string + name: string +} & Partial<AdditionalInfo> + +export type SxplrAtlas = { + id: string + name: string +} & Partial<AdditionalInfo> + +export type AdditionalInfo = { + desc: string + link: { + text: string + href: string + }[] +} + +type Location = { + space: SxplrTemplate +} +type LocTuple = [number, number, number] + +export type Point = { + loc: LocTuple +} & Location + +export type BoundingBox = { + maxpoint: LocTuple + minpoint: LocTuple + center: LocTuple +} & Location + +import { NgLayerSpec } from "src/viewerModule/nehuba/config.service/type" + +export { NgLayerSpec } +export { + NgPrecompMeshSpec, + NgSegLayerSpec, +} from "src/viewerModule/nehuba/config.service/type" + +import { TThreeSurferMesh, TThreeMesh, TThreeMeshLabel } from "src/viewerModule/threeSurfer/types" +export { TThreeSurferMesh, TThreeMesh, TThreeMeshLabel } + +/** + * Union of processed image + */ +export type TemplateDefaultImage = NgLayerSpec | TThreeMesh + +/** + * Features + */ + +export type Feature = { + id: string + name: string +} & Partial<AdditionalInfo> + +type DataFrame = { + index: Record<string, string> +} + +export type VoiFeature = { + bbox: BoundingBox +} & Feature + +type TabularDataType = number | string | number[] + +export type TabularFeature<T extends TabularDataType> = { + index: string[] + columns: string[] + data: T[][] +} & Feature + +export type LabelledMap = { + name: string + label: number +} diff --git a/src/atlasComponents/sapi/type_v3.ts b/src/atlasComponents/sapi/type_v3.ts new file mode 100644 index 000000000..89c4e9d88 --- /dev/null +++ b/src/atlasComponents/sapi/type_v3.ts @@ -0,0 +1,47 @@ +import { components, paths, operations } from "./schema_v3" + +export type SapiAtlasModel = PathReturn<"/atlases/{atlas_id}"> +export type SapiSpaceModel = PathReturn<"/spaces/{space_id}"> +export type SapiParcellationModel = PathReturn<"/parcellations/{parcellation_id}"> +export type SapiRegionModel = PathReturn<"/regions/{region_id}"> +export type OpenMINDSCoordinatePoint = components['schemas']["CoordinatePointModel"] +export type SxplrCoordinatePointExtension = { + openminds: OpenMINDSCoordinatePoint + name: string + description: string + color: string + '@id': string // should match the id of opendminds specs +} +export type SapiSpatialFeatureModel = PathReturn<"/feature/VolumeOfInterest/{feature_id}"> +export type SapiFeatureModel = SapiSpatialFeatureModel | PathReturn<"/feature/Tabular/{feature_id}"> | PathReturn<"/feature/RegionalConnectivity/{feature_id}"> | PathReturn<"/feature/CorticalProfile/{feature_id}"> + +export type SapiRoute = keyof paths + +/** + * Support types + */ +export type RouteParam<T extends keyof paths> = paths[T]['get']['parameters'] +type Json200 = { + 200: { + content: { + "application/json": unknown + } + } +} +export type PathReturn<T extends keyof paths> = paths[T]["get"]["responses"] extends Json200 + ? paths[T]["get"]["responses"][200]["content"]["application/json"] + : unknown +export type PaginatedModel<T> = { + items: T[] + total: number + page: number + size: number +} + +/** + * siibra-explorer types + * TODO: to be exported + */ +export type SapiQueryPriorityArg = { + priority: number +} diff --git a/src/atlasComponents/sapiViews/core/atlas/splashScreen/splashScreen.component.ts b/src/atlasComponents/sapiViews/core/atlas/splashScreen/splashScreen.component.ts index 056e3660c..50a9a3f9b 100644 --- a/src/atlasComponents/sapiViews/core/atlas/splashScreen/splashScreen.component.ts +++ b/src/atlasComponents/sapiViews/core/atlas/splashScreen/splashScreen.component.ts @@ -2,7 +2,7 @@ import { ChangeDetectionStrategy, Component } from "@angular/core"; import { Store } from "@ngrx/store"; import { tap } from 'rxjs/operators' import { SAPI } from "src/atlasComponents/sapi/sapi.service"; -import { SapiAtlasModel } from "src/atlasComponents/sapi/type"; +import { SxplrAtlas } from "src/atlasComponents/sapi/type_sxplr"; import { atlasSelection } from "src/state" @Component({ @@ -28,7 +28,7 @@ export class SapiViewsCoreAtlasSplashScreen { ) { } - public selectAtlas(atlas: SapiAtlasModel){ + public selectAtlas(atlas: SxplrAtlas){ this.store.dispatch( atlasSelection.actions.selectAtlas({ atlas diff --git a/src/atlasComponents/sapiViews/core/datasets/dataset/dataset.component.ts b/src/atlasComponents/sapiViews/core/datasets/dataset/dataset.component.ts index 22813095a..4651fcefd 100644 --- a/src/atlasComponents/sapiViews/core/datasets/dataset/dataset.component.ts +++ b/src/atlasComponents/sapiViews/core/datasets/dataset/dataset.component.ts @@ -1,6 +1,7 @@ import { ChangeDetectionStrategy, Component, Input, OnChanges, SimpleChanges } from "@angular/core"; -import { SapiDatasetModel } from "src/atlasComponents/sapi"; +import { Feature } from "src/atlasComponents/sapi/type_sxplr"; import { CONST } from "common/constants" +import { translateV3Entities } from "src/atlasComponents/sapi/translate_v3" const RESTRICTED_ACCESS_ID = "https://nexus.humanbrainproject.org/v0/data/minds/core/embargostatus/v1.0.0/3054f80d-96a8-4dce-9b92-55c68a8b5efd" @@ -15,7 +16,7 @@ const RESTRICTED_ACCESS_ID = "https://nexus.humanbrainproject.org/v0/data/minds/ export class DatasetView implements OnChanges{ @Input('sxplr-sapiviews-core-datasets-dataset-input') - dataset: SapiDatasetModel + dataset: Feature public isRestricted = false public CONST = CONST @@ -23,7 +24,8 @@ export class DatasetView implements OnChanges{ ngOnChanges(changes: SimpleChanges): void { const { dataset } = changes if (dataset) { - this.isRestricted = (dataset.currentValue as SapiDatasetModel)?.metadata?.accessibility?.["@id"] === RESTRICTED_ACCESS_ID + throw new Error(`Fix this`) + // this.isRestricted = (dataset.currentValue as Feature)?.metadata?.accessibility?.["@id"] === RESTRICTED_ACCESS_ID } } } diff --git a/src/atlasComponents/sapiViews/core/datasets/dataset/dataset.template.html b/src/atlasComponents/sapiViews/core/datasets/dataset/dataset.template.html index a04996afb..654af558f 100644 --- a/src/atlasComponents/sapiViews/core/datasets/dataset/dataset.template.html +++ b/src/atlasComponents/sapiViews/core/datasets/dataset/dataset.template.html @@ -15,7 +15,7 @@ <mat-card-title> <ng-template [ngTemplateOutlet]="headerTmpl"></ng-template> <span> - {{ dataset.metadata.fullName }} + {{ dataset.name }} </span> </mat-card-title> @@ -33,15 +33,15 @@ <mat-divider class="sxplr-pl-1" [vertical]="true"></mat-divider> - <a mat-icon-button sxplr-hide-when-local *ngFor="let url of dataset.urls" [href]="url.doi | parseDoi" target="_blank"> + <!-- <a mat-icon-button sxplr-hide-when-local *ngFor="let url of dataset.link" [href]="url.doi | parseDoi" target="_blank"> <i class="fas fa-external-link-alt"></i> - </a> + </a> --> </mat-card-subtitle> </mat-card> <mat-card *ngIf="dataset" class="sxplr-z-0"> <mat-card-content> - <markdown-dom class="sxplr-muted" [markdown]="dataset?.metadata?.description"> + <markdown-dom class="sxplr-muted" [markdown]="dataset?.desc"> </markdown-dom> </mat-card-content> </mat-card> diff --git a/src/atlasComponents/sapiViews/core/parcellation/filterGroupedParcellations.pipe.ts b/src/atlasComponents/sapiViews/core/parcellation/filterGroupedParcellations.pipe.ts index 62910eab4..b1c5176ac 100644 --- a/src/atlasComponents/sapiViews/core/parcellation/filterGroupedParcellations.pipe.ts +++ b/src/atlasComponents/sapiViews/core/parcellation/filterGroupedParcellations.pipe.ts @@ -1,5 +1,5 @@ import { Pipe, PipeTransform } from "@angular/core"; -import { SapiParcellationModel } from "src/atlasComponents/sapi"; +import { SxplrParcellation } from "src/atlasComponents/sapi/type_sxplr"; import { GroupedParcellation } from "./groupedParcellation"; @Pipe({ @@ -8,11 +8,11 @@ import { GroupedParcellation } from "./groupedParcellation"; }) export class FilterGroupedParcellationPipe implements PipeTransform{ - public transform(parcs: SapiParcellationModel[], getGroupsFlag: boolean=false): (SapiParcellationModel|GroupedParcellation)[] { + public transform(parcs: SxplrParcellation[], getGroupsFlag: boolean=false): (SxplrParcellation|GroupedParcellation)[] { if (!getGroupsFlag) { return parcs.filter(p => !p.modality) } - const map: Record<string, SapiParcellationModel[]> = {} + const map: Record<string, SxplrParcellation[]> = {} for (const parc of parcs.filter(p => !!p.modality)) { if (!map[parc.modality]) { map[parc.modality] = [] diff --git a/src/atlasComponents/sapiViews/core/parcellation/filterUnsupportedParc.pipe.ts b/src/atlasComponents/sapiViews/core/parcellation/filterUnsupportedParc.pipe.ts index 222020d72..5c80f96bf 100644 --- a/src/atlasComponents/sapiViews/core/parcellation/filterUnsupportedParc.pipe.ts +++ b/src/atlasComponents/sapiViews/core/parcellation/filterUnsupportedParc.pipe.ts @@ -1,8 +1,9 @@ import { Pipe, PipeTransform } from "@angular/core"; -import { SapiParcellationModel } from "src/atlasComponents/sapi/type"; +import { SxplrParcellation } from "src/atlasComponents/sapi/type_sxplr"; import { GroupedParcellation } from "./groupedParcellation"; +import { translateV3Entities } from "src/atlasComponents/sapi/translate_v3" -type Filterables = SapiParcellationModel | GroupedParcellation +type Filterables = SxplrParcellation | GroupedParcellation const unsupportedIds = [ "https://doi.org/10.1016/j.jneumeth.2020.108983/mni152", @@ -23,11 +24,12 @@ export class FilterUnsupportedParcPipe implements PipeTransform{ if (p instanceof GroupedParcellation) { return hideGroup.indexOf(p.name) < 0 } - if (unsupportedIds.includes(p["@id"])) { + if (unsupportedIds.includes(p.id)) { return false } - if (p.version) { - return !p.version.deprecated + const apiP = translateV3Entities.retrieveParcellation(p) + if (apiP.version) { + return !apiP.version.deprecated } return true }) diff --git a/src/atlasComponents/sapiViews/core/parcellation/groupedParcellation.ts b/src/atlasComponents/sapiViews/core/parcellation/groupedParcellation.ts index c66d6e981..1f0eb3789 100644 --- a/src/atlasComponents/sapiViews/core/parcellation/groupedParcellation.ts +++ b/src/atlasComponents/sapiViews/core/parcellation/groupedParcellation.ts @@ -1,9 +1,9 @@ -import { SapiParcellationModel } from "src/atlasComponents/sapi" +import { SxplrParcellation } from "src/atlasComponents/sapi/type_sxplr" export class GroupedParcellation{ name: string - parcellations: SapiParcellationModel[] - constructor(name: string, parcellations: SapiParcellationModel[]){ + parcellations: SxplrParcellation[] + constructor(name: string, parcellations: SxplrParcellation[]){ this.name = name this.parcellations = parcellations } diff --git a/src/atlasComponents/sapiViews/core/parcellation/parcellationDoi.pipe.ts b/src/atlasComponents/sapiViews/core/parcellation/parcellationDoi.pipe.ts index 8652365e1..8eba5f152 100644 --- a/src/atlasComponents/sapiViews/core/parcellation/parcellationDoi.pipe.ts +++ b/src/atlasComponents/sapiViews/core/parcellation/parcellationDoi.pipe.ts @@ -1,5 +1,6 @@ import { Pipe, PipeTransform } from "@angular/core"; -import { SapiParcellationModel } from "src/atlasComponents/sapi/type"; +import { SxplrParcellation } from "src/atlasComponents/sapi/type_sxplr"; +import { translateV3Entities } from "src/atlasComponents/sapi/translate_v3" @Pipe({ name: 'parcellationDoiPipe', @@ -7,7 +8,8 @@ import { SapiParcellationModel } from "src/atlasComponents/sapi/type"; }) export class ParcellationDoiPipe implements PipeTransform { - public transform(parc: SapiParcellationModel): string[] { + public transform(_parc: SxplrParcellation): string[] { + const parc = translateV3Entities.retrieveParcellation(_parc) const urls = (parc?.brainAtlasVersions || []).filter( v => v.digitalIdentifier && v.digitalIdentifier['@type'] === 'https://openminds.ebrains.eu/core/DOI' ).map( diff --git a/src/atlasComponents/sapiViews/core/parcellation/parcellationGroupSelected.pipe.ts b/src/atlasComponents/sapiViews/core/parcellation/parcellationGroupSelected.pipe.ts index cd31e4391..e73322143 100644 --- a/src/atlasComponents/sapiViews/core/parcellation/parcellationGroupSelected.pipe.ts +++ b/src/atlasComponents/sapiViews/core/parcellation/parcellationGroupSelected.pipe.ts @@ -1,10 +1,9 @@ import { Pipe, PipeTransform } from "@angular/core"; -import { SapiParcellationModel } from "src/atlasComponents/sapi/type"; +import { SxplrParcellation } from "src/atlasComponents/sapi/type_sxplr"; import { GroupedParcellation } from "./groupedParcellation"; function isGroupedParc(parc: GroupedParcellation|unknown): parc is GroupedParcellation { - if (!parc['parcellations']) return false - return (parc['parcellations'] as SapiParcellationModel[]).every(p => p["@type"] === "minds/core/parcellationatlas/v1.0.0") + return !!parc['parcellations'] } @Pipe({ @@ -13,7 +12,7 @@ function isGroupedParc(parc: GroupedParcellation|unknown): parc is GroupedParcel }) export class ParcellationGroupSelectedPipe implements PipeTransform { - public transform(parc: GroupedParcellation|unknown, selectedParcellation: SapiParcellationModel): boolean { + public transform(parc: GroupedParcellation|unknown, selectedParcellation: SxplrParcellation): boolean { if (!isGroupedParc(parc)) return false return parc.parcellations.some(p => p["@id"] === selectedParcellation["@id"]) } diff --git a/src/atlasComponents/sapiViews/core/region/module.ts b/src/atlasComponents/sapiViews/core/region/module.ts index 60fd2425c..50759b93a 100644 --- a/src/atlasComponents/sapiViews/core/region/module.ts +++ b/src/atlasComponents/sapiViews/core/region/module.ts @@ -4,7 +4,7 @@ import { MarkdownModule } from "src/components/markdown"; import { SpinnerModule } from "src/components/spinner"; import { AngularMaterialModule } from "src/sharedModules"; import { StrictLocalModule } from "src/strictLocal"; -import { SapiViewsFeaturesModule } from "../../features"; +// import { SapiViewsFeaturesModule } from "../../features"; import { SapiViewsUtilModule } from "../../util/module"; import { SapiViewsCoreRegionRegionChip } from "./region/chip/region.chip.component"; import { SapiViewsCoreRegionRegionListItem } from "./region/listItem/region.listItem.component"; @@ -17,7 +17,7 @@ import { SapiViewsCoreRegionRegionRich } from "./region/rich/region.rich.compone CommonModule, AngularMaterialModule, SapiViewsUtilModule, - SapiViewsFeaturesModule, + // SapiViewsFeaturesModule, SpinnerModule, MarkdownModule, StrictLocalModule, diff --git a/src/atlasComponents/sapiViews/core/region/region/region.base.directive.ts b/src/atlasComponents/sapiViews/core/region/region/region.base.directive.ts index 96f374b26..ef0537006 100644 --- a/src/atlasComponents/sapiViews/core/region/region/region.base.directive.ts +++ b/src/atlasComponents/sapiViews/core/region/region/region.base.directive.ts @@ -1,9 +1,11 @@ import { Directive, EventEmitter, Input, OnDestroy, Output } from "@angular/core"; -import { SapiAtlasModel, SapiParcellationModel, SapiRegionModel, SapiSpaceModel } from "src/atlasComponents/sapi"; +import { SxplrAtlas, SxplrParcellation, SxplrRegion, SxplrTemplate } from "src/atlasComponents/sapi/type_sxplr"; +import { translateV3Entities } from "src/atlasComponents/sapi/translate_v3" import { rgbToHsl } from 'common/util' import { SAPI } from "src/atlasComponents/sapi/sapi.service"; import { BehaviorSubject, Subject } from "rxjs"; import { SAPIRegion } from "src/atlasComponents/sapi/core"; +import { switchMap } from "rxjs/operators"; @Directive({ selector: `[sxplr-sapiviews-core-region]`, @@ -17,19 +19,19 @@ export class SapiViewsCoreRegionRegionBase { public fetchInProgress$ = new BehaviorSubject<boolean>(false) @Input('sxplr-sapiviews-core-region-atlas') - atlas: SapiAtlasModel + atlas: SxplrAtlas @Input('sxplr-sapiviews-core-region-template') - template: SapiSpaceModel + template: SxplrTemplate @Input('sxplr-sapiviews-core-region-parcellation') - parcellation: SapiParcellationModel + parcellation: SxplrParcellation @Output('sxplr-sapiviews-core-region-navigate-to') onNavigateTo = new EventEmitter<number[]>() - protected region$ = new Subject<SapiRegionModel>() - private _region: SapiRegionModel + protected region$ = new Subject<SxplrRegion>() + private _region: SxplrRegion @Input('sxplr-sapiviews-core-region-region') - set region(val: SapiRegionModel) { + set region(val: SxplrRegion) { this.region$.next(val) @@ -76,7 +78,7 @@ export class SapiViewsCoreRegionRegionBase { /** * color */ - const rgb = SAPIRegion.GetDisplayColor(this.region) + const rgb = SAPIRegion.GetDisplayColor(this.region) || [200, 200, 200] this.regionRgbString = `rgb(${rgb.join(',')})` const [_h, _s, l] = rgbToHsl(...rgb) this.regionDarkmode = l < 0.4 @@ -84,14 +86,12 @@ export class SapiViewsCoreRegionRegionBase { /** * position */ - this.regionPosition = this.region.hasAnnotation?.bestViewPoint?.coordinates.map(v => v.value) + this.regionPosition = this.region.centroid?.loc /** * dois */ - this.dois = (this.region.hasAnnotation?.inspiredBy || []) - .map(insp => insp["@id"] as string) - .filter(id => /^https?:\/\/doi\.org/.test(id)) + this.dois = (this.region.link || []).map(link => link.href) } } @@ -99,8 +99,18 @@ export class SapiViewsCoreRegionRegionBase { this.onNavigateTo.emit(position.map(v => v*1e6)) } - protected async fetchDetail(region: SapiRegionModel) { - return this.sapi.getRegion(this.atlas["@id"],this.parcellation["@id"], region.name).getDetail(this.template["@id"]).toPromise() + protected async fetchDetail(region: SxplrRegion): Promise<SxplrRegion> { + return this.sapi.v3Get("/regions/{region_id}", { + path: { + region_id: region.name + }, + query: { + parcellation_id: this.parcellation.id, + space_id: this.template.id + } + }).pipe( + switchMap(r => translateV3Entities.translateRegion(r)) + ).toPromise() } constructor(protected sapi: SAPI){ diff --git a/src/atlasComponents/sapiViews/core/region/region/region.features.directive.ts b/src/atlasComponents/sapiViews/core/region/region/region.features.directive.ts index 47a4b6912..de2084a76 100644 --- a/src/atlasComponents/sapiViews/core/region/region/region.features.directive.ts +++ b/src/atlasComponents/sapiViews/core/region/region/region.features.directive.ts @@ -1,8 +1,8 @@ import { Directive, OnChanges, SimpleChanges } from "@angular/core"; -import { BehaviorSubject, Observable } from "rxjs"; -import { switchMap, filter, startWith, shareReplay, finalize } from "rxjs/operators"; -import { SAPI, SapiAtlasModel, SapiParcellationModel, SapiRegionalFeatureModel, SapiRegionModel, SapiSpaceModel } from "src/atlasComponents/sapi"; -import { SxplrCleanedFeatureModel } from "src/atlasComponents/sapi/type"; +import { BehaviorSubject, merge } from "rxjs"; +import { switchMap, filter, startWith, shareReplay, scan } from "rxjs/operators"; +import { SAPI, SAPIRegion } from "src/atlasComponents/sapi"; +import { SxplrAtlas, SxplrParcellation, SxplrTemplate, SxplrRegion } from "src/atlasComponents/sapi/type_sxplr" import { SapiViewsCoreRegionRegionBase } from "./region.base.directive"; @Directive({ @@ -13,10 +13,10 @@ import { SapiViewsCoreRegionRegionBase } from "./region.base.directive"; export class SapiViewsCoreRegionRegionalFeatureDirective extends SapiViewsCoreRegionRegionBase implements OnChanges{ private ATPR$ = new BehaviorSubject<{ - atlas: SapiAtlasModel - template: SapiSpaceModel - parcellation: SapiParcellationModel - region: SapiRegionModel + atlas: SxplrAtlas + template: SxplrTemplate + parcellation: SxplrParcellation + region: SxplrRegion }>(null) ngOnChanges(sc: SimpleChanges): void { @@ -28,7 +28,7 @@ export class SapiViewsCoreRegionRegionalFeatureDirective extends SapiViewsCoreRe super(sapi) } - private features$: Observable<(SapiRegionalFeatureModel|SxplrCleanedFeatureModel)[]> = this.ATPR$.pipe( + private features$ = this.ATPR$.pipe( filter(arg => { if (!arg) return false const { atlas, parcellation, region, template } = arg @@ -36,13 +36,31 @@ export class SapiViewsCoreRegionRegionalFeatureDirective extends SapiViewsCoreRe }), switchMap(({ atlas, parcellation, region, template }) => { this.busy$.next(true) - return this.sapi.getRegionFeatures(atlas["@id"], parcellation["@id"], template["@id"], region.name).pipe( - finalize(() => this.busy$.next(false)) + const parcId = parcellation["@id"] + const regionId = region.name + const atlasId = atlas["@id"] + const reg = this.sapi.getRegion(atlasId, parcId, regionId) + return SAPIRegion.Features$.pipe( + switchMap(features => merge( + ...features.map( + feature => reg.getFeatures( + feature, + { + query: { + parcellation_id: parcId, + region_id: regionId, + }, + priority: 1 + } + ) + ) + )), + scan((acc, curr) => [...acc, ...curr.items], []) ) }), ) - public listOfFeatures$: Observable<(SapiRegionalFeatureModel|SxplrCleanedFeatureModel)[]> = this.features$.pipe( + public listOfFeatures$ = this.features$.pipe( startWith([]), shareReplay(1), ) diff --git a/src/atlasComponents/sapiViews/core/region/region/rich/region.rich.component.ts b/src/atlasComponents/sapiViews/core/region/region/rich/region.rich.component.ts index 0d506febd..02ed169e0 100644 --- a/src/atlasComponents/sapiViews/core/region/region/rich/region.rich.component.ts +++ b/src/atlasComponents/sapiViews/core/region/region/rich/region.rich.component.ts @@ -3,7 +3,7 @@ import { Component, EventEmitter, Inject, Output } from "@angular/core"; import { DARKTHEME } from "src/util/injectionTokens"; import { SapiViewsCoreRegionRegionBase } from "../region.base.directive"; import { ARIA_LABELS, CONST } from 'common/constants' -import { SapiRegionalFeatureModel } from "src/atlasComponents/sapi"; +import { Feature } from "src/atlasComponents/sapi/type_sxplr"; import { SAPI } from "src/atlasComponents/sapi/sapi.service"; import { environment } from "src/environments/environment"; @@ -24,7 +24,7 @@ export class SapiViewsCoreRegionRegionRich extends SapiViewsCoreRegionRegionBase public CONST = CONST @Output('sxplr-sapiviews-core-region-region-rich-feature-clicked') - featureClicked = new EventEmitter<SapiRegionalFeatureModel>() + featureClicked = new EventEmitter<Feature>() public expandedPanel: string @@ -35,7 +35,7 @@ export class SapiViewsCoreRegionRegionRich extends SapiViewsCoreRegionRegionBase super(sapi) } - handleRegionalFeatureClicked(feat: SapiRegionalFeatureModel) { + handleRegionalFeatureClicked(feat: Feature) { this.featureClicked.emit(feat) } diff --git a/src/atlasComponents/sapiViews/core/region/region/rich/region.rich.template.html b/src/atlasComponents/sapiViews/core/region/region/rich/region.rich.template.html index 18f77fc1b..461fcf176 100644 --- a/src/atlasComponents/sapiViews/core/region/region/rich/region.rich.template.html +++ b/src/atlasComponents/sapiViews/core/region/region/rich/region.rich.template.html @@ -68,17 +68,17 @@ <spinner-cmp *ngIf="rfDir.busy$ | async"></spinner-cmp> - <sxplr-sapiviews-features-entry-list-item + <!-- <sxplr-sapiviews-features-entry-list-item *ngFor="let feat of rfDir.listOfFeatures$ | async | orderFilterFeatures" [sxplr-sapiviews-features-entry-list-item-feature]="feat" (click)="handleRegionalFeatureClicked(feat)"> - </sxplr-sapiviews-features-entry-list-item> + </sxplr-sapiviews-features-entry-list-item> --> </div> </ng-template> <ng-template #regionDesc> - <markdown-dom class="sxplr-muted" [markdown]="region?.versionInnovation || 'No description provided.'"> + <markdown-dom class="sxplr-muted" [markdown]="region?.desc || 'No description provided.'"> </markdown-dom> </ng-template> @@ -91,7 +91,7 @@ content: regionDesc, desc: '', iconTooltip: 'Description', - iavNgIf: !!region?.versionInnovation + iavNgIf: !!region?.desc }"> </ng-container> @@ -112,7 +112,7 @@ <!-- connectivity --> <ng-template #sxplrSapiviewsFeaturesConnectivityBrowser> - <sxplr-sapiviews-features-connectivity-browser + <!-- <sxplr-sapiviews-features-connectivity-browser class="pe-all flex-shrink-1" [region]="region" [sxplr-sapiviews-features-connectivity-browser-atlas]="atlas" @@ -120,23 +120,23 @@ [accordionExpanded]="expandedPanel === CONST.CONNECTIVITY" [types]="hasConnectivityDirective.availableModalities" > - </sxplr-sapiviews-features-connectivity-browser> + </sxplr-sapiviews-features-connectivity-browser> --> </ng-template> - <ng-container *ngTemplateOutlet="ngMatAccordionTmpl; context: { + <!-- <ng-container *ngTemplateOutlet="ngMatAccordionTmpl; context: { title: CONST.CONNECTIVITY, iconClass: 'fab fa-connectdevelop', content: sxplrSapiviewsFeaturesConnectivityBrowser, iavNgIf: hasConnectivityDirective.hasConnectivity }"> - </ng-container> + </ng-container> --> - <div sxplr-sapiviews-features-connectivity-check + <!-- <div sxplr-sapiviews-features-connectivity-check [sxplr-sapiviews-features-connectivity-check-atlas]="atlas" [sxplr-sapiviews-features-connectivity-check-parcellation]="parcellation" [region]="region" #hasConnectivityDirective="hasConnectivityDirective"> - </div> + </div> --> </ng-template> </mat-accordion> diff --git a/src/atlasComponents/sapiViews/core/rich/ATPSelector/pureDumb/pureATPSelector.components.ts b/src/atlasComponents/sapiViews/core/rich/ATPSelector/pureDumb/pureATPSelector.components.ts index 13c9abbb1..4cddf5bde 100644 --- a/src/atlasComponents/sapiViews/core/rich/ATPSelector/pureDumb/pureATPSelector.components.ts +++ b/src/atlasComponents/sapiViews/core/rich/ATPSelector/pureDumb/pureATPSelector.components.ts @@ -1,5 +1,5 @@ import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from "@angular/core"; -import { SapiAtlasModel, SapiParcellationModel, SapiSpaceModel } from "src/atlasComponents/sapi/type"; +import { SxplrAtlas, SxplrParcellation, SxplrTemplate } from "src/atlasComponents/sapi/type_sxplr"; import { FilterGroupedParcellationPipe, GroupedParcellation } from "src/atlasComponents/sapiViews/core/parcellation"; export const darkThemePalette = [ @@ -15,9 +15,9 @@ export const lightThemePalette = [ ] export type ATP = { - atlas: SapiAtlasModel - template: SapiSpaceModel - parcellation: SapiParcellationModel + atlas: SxplrAtlas + template: SxplrTemplate + parcellation: SxplrParcellation } function isATPGuard(atp: Record<string, unknown>): atp is Partial<ATP> { @@ -51,15 +51,15 @@ export class PureATPSelector implements OnChanges{ public selectedIds: string[] = [] @Input(`sxplr-pure-atp-selector-atlases`) - public allAtlases: SapiAtlasModel[] = [] + public allAtlases: SxplrAtlas[] = [] @Input(`sxplr-pure-atp-selector-templates`) - public availableTemplates: SapiSpaceModel[] = [] + public availableTemplates: SxplrTemplate[] = [] @Input(`sxplr-pure-atp-selector-parcellations`) - public parcellations: SapiParcellationModel[] = [] + public parcellations: SxplrParcellation[] = [] - public parcAndGroup: (GroupedParcellation|SapiParcellationModel)[] = [] + public parcAndGroup: (GroupedParcellation|SxplrParcellation)[] = [] @Input('sxplr-pure-atp-selector-is-busy') public isBusy: boolean = false @@ -67,7 +67,7 @@ export class PureATPSelector implements OnChanges{ @Output('sxplr-pure-atp-selector-on-select') selectLeafEmitter = new EventEmitter<Partial<ATP>>() - getChildren(parc: GroupedParcellation|SapiParcellationModel){ + getChildren(parc: GroupedParcellation|SxplrParcellation){ return (parc as GroupedParcellation).parcellations || [] } @@ -83,7 +83,7 @@ export class PureATPSelector implements OnChanges{ this.selectedIds = [] } else { const { atlas, parcellation, template } = changes.selectedATP.currentValue as ATP - this.selectedIds = [atlas?.["@id"], parcellation?.["@id"], template?.["@id"]].filter(v => !!v) + this.selectedIds = [atlas?.id, parcellation?.id, template?.id].filter(v => !!v) } } diff --git a/src/atlasComponents/sapiViews/core/rich/ATPSelector/pureDumb/pureATPSelector.template.html b/src/atlasComponents/sapiViews/core/rich/ATPSelector/pureDumb/pureATPSelector.template.html index 5814b72ab..044965ed5 100644 --- a/src/atlasComponents/sapiViews/core/rich/ATPSelector/pureDumb/pureATPSelector.template.html +++ b/src/atlasComponents/sapiViews/core/rich/ATPSelector/pureDumb/pureATPSelector.template.html @@ -24,8 +24,8 @@ sxplr-dialog [sxplr-dialog-size]="null" [sxplr-dialog-data]="{ - title: ATP.parcellation.name || ATP.parcellation.fullName, - descMd: (ATP.parcellation.brainAtlasVersions || [])[0]?.versionInnovation, + title: ATP.parcellation.name, + descMd: ATP.parcellation.desc, actions: ATP.parcellation | parcellationDoiPipe }"> <i class="fas fa-info"></i> @@ -52,7 +52,7 @@ [disabled]="isBusy"> <ng-template sxplrSmartChipContent> <span class="chip-text"> - {{ ATP.template.fullName }} + {{ ATP.template.name }} </span> </ng-template> <ng-template sxplrSmartChipMenu let-space> diff --git a/src/atlasComponents/sapiViews/core/rich/ATPSelector/wrapper/wrapper.component.ts b/src/atlasComponents/sapiViews/core/rich/ATPSelector/wrapper/wrapper.component.ts index e5a3ef9ee..ea738098f 100644 --- a/src/atlasComponents/sapiViews/core/rich/ATPSelector/wrapper/wrapper.component.ts +++ b/src/atlasComponents/sapiViews/core/rich/ATPSelector/wrapper/wrapper.component.ts @@ -1,10 +1,9 @@ import { Component, Inject, OnDestroy } from "@angular/core"; import { MatDialog } from "@angular/material/dialog"; -import { Store } from "@ngrx/store"; +import { select, Store } from "@ngrx/store"; import { Observable, of, Subject, Subscription } from "rxjs"; import { filter, map, switchMap, tap, withLatestFrom } from "rxjs/operators"; import { SAPI } from "src/atlasComponents/sapi/sapi.service"; -import { ParcellationSupportedInSpacePipe } from "src/atlasComponents/sapiViews/util/parcellationSupportedInSpace.pipe"; import { atlasSelection } from "src/state"; import { fromRootStore } from "src/state/atlasSelection"; import { DialogFallbackCmp } from "src/ui/dialogInfo"; @@ -30,7 +29,6 @@ export class WrapperATPSelector implements OnDestroy{ lightThemePalette = lightThemePalette #subscription: Subscription[] = [] - #parcSupportedInSpacePipe = new ParcellationSupportedInSpacePipe(this.sapi) #askUser(title: string, descMd: string): Observable<boolean> { const agree = "OK" @@ -51,10 +49,12 @@ export class WrapperATPSelector implements OnDestroy{ allAtlases$ = this.sapi.atlases$ availableTemplates$ = this.store$.pipe( - fromRootStore.allAvailSpaces(this.sapi), + select(atlasSelection.selectors.selectedAtlas), + switchMap(atlas => this.sapi.getAllSpaces(atlas)) ) parcs$ = this.store$.pipe( - fromRootStore.allAvailParcs(this.sapi), + select(atlasSelection.selectors.selectedAtlas), + switchMap(atlas => this.sapi.getAllParcellations(atlas)) ) isBusy$ = new Subject<boolean>() @@ -79,21 +79,28 @@ export class WrapperATPSelector implements OnDestroy{ return of({ atlas }) } if (template) { - return this.#parcSupportedInSpacePipe.transform(selectedATP.parcellation, template).pipe( - switchMap(supported => supported - ? of({ template }) - : this.#askUser(`Incompatible parcellation`, `Attempting to load template **${template.fullName}**, which does not support parcellation **${selectedATP.parcellation.name}**. Proceed anyway and load the default parcellation?`).pipe( + return this.sapi.getSupportedTemplates(selectedATP.atlas, selectedATP.parcellation).pipe( + switchMap(tmpls => { + const supported = tmpls.some(tmpl => tmpl.id === template.id) + if (supported) return of({ template }) + return this.#askUser( + `Incompatible parcellation`, `Attempting to load template **${template.name}**, which does not support parcellation **${selectedATP.parcellation.name}**. Proceed anyway and load the default parcellation?` + ).pipe( switchMap(flag => of(flag ? { template } : null)) - )) + ) + }) ) } if (parcellation) { - return this.#parcSupportedInSpacePipe.transform(parcellation, selectedATP.template).pipe( - switchMap(supported=> supported - ? of({ parcellation }) - : this.#askUser(`Incompatible template`, `Attempting to load parcellation **${parcellation.name}**, which is not supported in template **${selectedATP.template.fullName}**. Proceed anyway and load the default template?`).pipe( - switchMap(flag => of(flag ? { parcellation } : null)) - )) + return this.sapi.getSupportedParcellations(selectedATP.atlas, selectedATP.template).pipe( + switchMap(parcs => { + const supported = parcs.some(parc => parc.id === parcellation.id) + return supported + ? of ({ parcellation }) + : this.#askUser(`Incompatible template`, `Attempting to load parcellation **${parcellation.name}**, which is not supported in template **${selectedATP.template.name}**. Proceed anyway and load the default template?`).pipe( + switchMap(flag => of(flag ? { parcellation } : null)) + ) + }) ) } return of(null) @@ -125,8 +132,8 @@ export class WrapperATPSelector implements OnDestroy{ ) } - private selectLeaf$ = new Subject<ATP>() - selectLeaf(atp: ATP) { + private selectLeaf$ = new Subject<Partial<ATP>>() + selectLeaf(atp: Partial<ATP>) { this.selectLeaf$.next(atp) } diff --git a/src/atlasComponents/sapiViews/core/rich/regionsHierarchy/regionsHierarchy.component.ts b/src/atlasComponents/sapiViews/core/rich/regionsHierarchy/regionsHierarchy.component.ts index b82c2ba05..22b0f837c 100644 --- a/src/atlasComponents/sapiViews/core/rich/regionsHierarchy/regionsHierarchy.component.ts +++ b/src/atlasComponents/sapiViews/core/rich/regionsHierarchy/regionsHierarchy.component.ts @@ -2,7 +2,8 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, In import { UntypedFormControl } from "@angular/forms"; import { Subscription } from "rxjs"; import { debounceTime, distinctUntilChanged, filter, startWith } from "rxjs/operators"; -import { SapiRegionModel } from "src/atlasComponents/sapi/type"; +import { SxplrRegion } from "src/atlasComponents/sapi/type_sxplr"; +import { translateV3Entities } from "src/atlasComponents/sapi/translate_v3" import { SxplrFlatHierarchyTreeView } from "src/components/flatHierarchy/treeView/treeView.component"; import { FilterByRegexPipe } from "./filterByRegex.pipe"; import { RegionTreeFilterPipe } from "./regionTreeFilter.pipe"; @@ -21,11 +22,17 @@ const filterByRegexPipe = new FilterByRegexPipe() export class SapiViewsCoreRichRegionsHierarchy { - static IsParent(region: SapiRegionModel, parentRegion: SapiRegionModel) { - return region.hasParent?.some(parent => parent['@id'] === parentRegion["@id"]) + static IsParent(region: SxplrRegion, parentRegion: SxplrRegion): boolean { + const _region = translateV3Entities.retrieveRegion(region) + const _parentRegion = translateV3Entities.retrieveRegion(parentRegion) + const { ["@id"]: parentRegionId } = _parentRegion + return _region.hasParent?.some(parent => { + const { ["@id"]: pId } = parent + return pId === parentRegionId + }) } - static FilterRegions(regions: SapiRegionModel[], searchTerm: string): SapiRegionModel[]{ + static FilterRegions(regions: SxplrRegion[], searchTerm: string): SxplrRegion[]{ if (searchTerm === '' || !searchTerm) { return regions } @@ -37,19 +44,19 @@ export class SapiViewsCoreRichRegionsHierarchy { } @Input('sxplr-sapiviews-core-rich-regionshierarchy-accent-regions') - accentedRegions: SapiRegionModel[] = [] + accentedRegions: SxplrRegion[] = [] @Input('sxplr-sapiviews-core-rich-regionshierarchy-placeholder') placeholderText: string = 'Search all regions' - passedRegions: SapiRegionModel[] = [] + passedRegions: SxplrRegion[] = [] - private _regions: SapiRegionModel[] = [] + private _regions: SxplrRegion[] = [] get regions(){ return this._regions } @Input('sxplr-sapiviews-core-rich-regionshierarchy-regions') - set regions(val: SapiRegionModel[]){ + set regions(val: SxplrRegion[]){ this._regions = val this.passedRegions = SapiViewsCoreRichRegionsHierarchy.FilterRegions( this._regions, @@ -58,10 +65,10 @@ export class SapiViewsCoreRichRegionsHierarchy { } @Output('sxplr-sapiviews-core-rich-regionshierarchy-region-select') - nodeClicked = new EventEmitter<SapiRegionModel>() + nodeClicked = new EventEmitter<SxplrRegion>() @ViewChild(SxplrFlatHierarchyTreeView) - treeView: SxplrFlatHierarchyTreeView<SapiRegionModel> + treeView: SxplrFlatHierarchyTreeView<SxplrRegion> isParent = SapiViewsCoreRichRegionsHierarchy.IsParent diff --git a/src/atlasComponents/sapiViews/core/rich/regionsHierarchy/regionsHierarchy.template.html b/src/atlasComponents/sapiViews/core/rich/regionsHierarchy/regionsHierarchy.template.html index f3a4e82d4..7dc6a9cc5 100644 --- a/src/atlasComponents/sapiViews/core/rich/regionsHierarchy/regionsHierarchy.template.html +++ b/src/atlasComponents/sapiViews/core/rich/regionsHierarchy/regionsHierarchy.template.html @@ -28,6 +28,6 @@ [sxplr-flat-hierarchy-is-parent]="isParent" [sxplr-flat-hierarchy-render-node-tmpl]="tmplRef" [sxplr-flat-hierarchy-tree-view-expand-on-init]="true" - sxplr-flat-hierarchy-tree-view-lineheight="24" + [sxplr-flat-hierarchy-tree-view-lineheight]="24" (sxplr-flat-hierarchy-tree-view-node-clicked)="nodeClicked.emit($event)"> </sxplr-flat-hierarchy-tree-view> \ No newline at end of file diff --git a/src/atlasComponents/sapiViews/core/rich/regionsListSearch/regionListSearch.component.ts b/src/atlasComponents/sapiViews/core/rich/regionsListSearch/regionListSearch.component.ts index d169eb904..e455ccc4a 100644 --- a/src/atlasComponents/sapiViews/core/rich/regionsListSearch/regionListSearch.component.ts +++ b/src/atlasComponents/sapiViews/core/rich/regionsListSearch/regionListSearch.component.ts @@ -1,5 +1,5 @@ import { ChangeDetectionStrategy, Component, ContentChild, EventEmitter, Input, Output, TemplateRef } from "@angular/core"; -import { SapiRegionModel } from "src/atlasComponents/sapi/type"; +import { SxplrRegion } from "src/atlasComponents/sapi/type_sxplr"; import { ARIA_LABELS } from "common/constants" import { UntypedFormControl } from "@angular/forms"; import { debounceTime, distinctUntilChanged, map, startWith } from "rxjs/operators"; @@ -13,12 +13,11 @@ import { SapiViewsCoreRichRegionListTemplateDirective } from "./regionListSearch * @param region input region * @returns {boolean} whether or not to include the region in the list search */ -const filterRegionForListSearch = (region: SapiRegionModel): boolean => { - const visualizedIn = region.hasAnnotation?.visualizedIn - return !!visualizedIn +const filterRegionForListSearch = (region: SxplrRegion): boolean => { + return !!region.color } -const filterRegionViaSearch = (searchTerm: string) => (region:SapiRegionModel) => { +const filterRegionViaSearch = (searchTerm: string) => (region:SxplrRegion) => { return region.name.toLocaleLowerCase().includes(searchTerm.toLocaleLowerCase()) } @@ -37,12 +36,12 @@ export class SapiViewsCoreRichRegionListSearch { showNOptions = 4 - private _regions: SapiRegionModel[] = [] + private _regions: SxplrRegion[] = [] get regions(){ return this._regions } @Input('sxplr-sapiviews-core-rich-regionlistsearch-regions') - set regions(val: SapiRegionModel[]) { + set regions(val: SxplrRegion[]) { this._regions = val.filter(filterRegionForListSearch) } @@ -56,7 +55,7 @@ export class SapiViewsCoreRichRegionListSearch { currentSearch: string = '' @Output('sxplr-sapiviews-core-rich-regionlistsearch-region-select') - onOptionSelected = new EventEmitter<SapiRegionModel>() + onOptionSelected = new EventEmitter<SxplrRegion>() public searchFormControl = new UntypedFormControl() @@ -64,7 +63,7 @@ export class SapiViewsCoreRichRegionListSearch { startWith(''), distinctUntilChanged(), debounceTime(160), - map((searchTerm: string | SapiRegionModel) => { + map((searchTerm: string | SxplrRegion) => { if (typeof searchTerm === "string") { return this.regions.filter(filterRegionViaSearch(searchTerm)) } @@ -76,12 +75,12 @@ export class SapiViewsCoreRichRegionListSearch { map(list => list.slice(0, this.showNOptions)) ) - displayFn(region: SapiRegionModel){ + displayFn(region: SxplrRegion){ return region?.name || '' } optionSelected(opt: MatAutocompleteSelectedEvent) { - const selectedRegion = opt.option.value as SapiRegionModel + const selectedRegion = opt.option.value as SxplrRegion this.onOptionSelected.emit(selectedRegion) } } diff --git a/src/atlasComponents/sapiViews/core/rich/regionsListSearch/regionListSearchTmpl.directive.ts b/src/atlasComponents/sapiViews/core/rich/regionsListSearch/regionListSearchTmpl.directive.ts index ecc282ee4..b3efbe51b 100644 --- a/src/atlasComponents/sapiViews/core/rich/regionsListSearch/regionListSearchTmpl.directive.ts +++ b/src/atlasComponents/sapiViews/core/rich/regionsListSearch/regionListSearchTmpl.directive.ts @@ -1,10 +1,10 @@ import { Directive, TemplateRef } from "@angular/core"; -import { SapiRegionModel } from "src/atlasComponents/sapi/type"; +import { SxplrRegion } from "src/atlasComponents/sapi/type_sxplr"; @Directive({ selector: 'ng-template[region-template],ng-template[regionTemplate]' }) export class SapiViewsCoreRichRegionListTemplateDirective{ - constructor(public tmplRef: TemplateRef<SapiRegionModel>){} + constructor(public tmplRef: TemplateRef<SxplrRegion>){} } diff --git a/src/atlasComponents/sapiViews/core/space/boundingBox.directive.ts b/src/atlasComponents/sapiViews/core/space/boundingBox.directive.ts index 3d592f397..0fa95bbba 100644 --- a/src/atlasComponents/sapiViews/core/space/boundingBox.directive.ts +++ b/src/atlasComponents/sapiViews/core/space/boundingBox.directive.ts @@ -1,7 +1,7 @@ import { Directive, Input, OnChanges, SimpleChanges } from "@angular/core"; import { BehaviorSubject, Observable } from "rxjs"; import { distinctUntilChanged } from "rxjs/operators"; -import { BoundingBoxConcept, SapiAtlasModel, SapiSpaceModel } from "src/atlasComponents/sapi/type"; +import { BoundingBox, SxplrTemplate, SxplrAtlas } from "src/atlasComponents/sapi/type_sxplr" function validateBbox(input: any): boolean { if (!Array.isArray(input)) return false @@ -16,19 +16,27 @@ function validateBbox(input: any): boolean { export class SapiViewsCoreSpaceBoundingBox implements OnChanges{ @Input('sxplr-sapiviews-core-space-boundingbox-atlas') - atlas: SapiAtlasModel + atlas: SxplrAtlas @Input('sxplr-sapiviews-core-space-boundingbox-space') - space: SapiSpaceModel + space: SxplrTemplate - private _bbox: BoundingBoxConcept + private _bbox: BoundingBox @Input('sxplr-sapiviews-core-space-boundingbox-spec') - set bbox(val: string | BoundingBoxConcept ) { + set bbox(val: string | BoundingBox ) { if (typeof val === "string") { try { - const [min, max] = JSON.parse(val) - this._bbox = [min, max] + const [min, max]: [ + [number, number, number], + [number, number, number], + ] = JSON.parse(val) + this._bbox = { + minpoint: min, + maxpoint: max, + center: min.map((v, idx) => (v + max[idx]) / 2) as [number, number, number], + space: this.space + } } catch (e) { console.warn(`Parse bbox input error`) } @@ -40,14 +48,14 @@ export class SapiViewsCoreSpaceBoundingBox implements OnChanges{ } this._bbox = val } - get bbox(): BoundingBoxConcept { + get bbox(): BoundingBox { return this._bbox } private _bbox$: BehaviorSubject<{ - atlas: SapiAtlasModel - space: SapiSpaceModel - bbox: BoundingBoxConcept + atlas: SxplrAtlas + space: SxplrTemplate + bbox: BoundingBox }> = new BehaviorSubject({ atlas: null, space: null, @@ -55,9 +63,9 @@ export class SapiViewsCoreSpaceBoundingBox implements OnChanges{ }) public bbox$: Observable<{ - atlas: SapiAtlasModel - space: SapiSpaceModel - bbox: BoundingBoxConcept + atlas: SxplrAtlas + space: SxplrTemplate + bbox: BoundingBox }> = this._bbox$.asObservable().pipe( distinctUntilChanged( (prev, curr) => prev.atlas?.["@id"] === curr.atlas?.['@id'] diff --git a/src/atlasComponents/sapiViews/module.ts b/src/atlasComponents/sapiViews/module.ts index ff029f036..dd53fa975 100644 --- a/src/atlasComponents/sapiViews/module.ts +++ b/src/atlasComponents/sapiViews/module.ts @@ -1,14 +1,13 @@ import { NgModule } from "@angular/core"; import { SapiViewsCoreModule } from "./core"; -import { SapiViewsFeaturesModule } from "./features"; @NgModule({ imports: [ - SapiViewsFeaturesModule, + // SapiViewsFeaturesModule, SapiViewsCoreModule, ], exports: [ - SapiViewsFeaturesModule, + // SapiViewsFeaturesModule, SapiViewsCoreModule, ] }) diff --git a/src/atlasComponents/sapiViews/util/module.ts b/src/atlasComponents/sapiViews/util/module.ts index 2ab8ff874..8d092a8c8 100644 --- a/src/atlasComponents/sapiViews/util/module.ts +++ b/src/atlasComponents/sapiViews/util/module.ts @@ -3,7 +3,6 @@ import { AddUnitAndJoin } from "./addUnitAndJoin.pipe"; import { EqualityPipe } from "./equality.pipe"; import { IncludesPipe } from "./includes.pipe"; import { NumbersPipe } from "./numbers.pipe"; -import { ParcellationSupportedInSpacePipe } from "./parcellationSupportedInSpace.pipe"; import { ParseDoiPipe } from "./parseDoi.pipe"; @NgModule({ @@ -13,7 +12,6 @@ import { ParseDoiPipe } from "./parseDoi.pipe"; NumbersPipe, AddUnitAndJoin, IncludesPipe, - ParcellationSupportedInSpacePipe, ], exports: [ EqualityPipe, @@ -21,7 +19,6 @@ import { ParseDoiPipe } from "./parseDoi.pipe"; NumbersPipe, AddUnitAndJoin, IncludesPipe, - ParcellationSupportedInSpacePipe, ] }) diff --git a/src/atlasComponents/sapiViews/util/parcellationSupportedInSpace.pipe.ts b/src/atlasComponents/sapiViews/util/parcellationSupportedInSpace.pipe.ts deleted file mode 100644 index 8d69ecf0c..000000000 --- a/src/atlasComponents/sapiViews/util/parcellationSupportedInSpace.pipe.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Pipe, PipeTransform } from "@angular/core"; -import { NEVER, Observable, of } from "rxjs"; -import { map } from "rxjs/operators"; -import { SAPIParcellation } from "src/atlasComponents/sapi/core"; -import { SAPI } from "src/atlasComponents/sapi/sapi.service"; -import { SapiParcellationModel, SapiSpaceModel } from "src/atlasComponents/sapi/type"; - -export const knownExceptions = { - supported: { - /** - * jba29 - */ - 'minds/core/parcellationatlas/v1.0.0/94c1125b-b87e-45e4-901c-00daee7f2579-290': [ - /** - * big brain - */ - 'minds/core/referencespace/v1.0.0/a1655b99-82f1-420f-a3c2-fe80fd4c8588' - ] - } -} - -@Pipe({ - name: 'parcellationSuppportedInSpace', - pure: false, -}) - -export class ParcellationSupportedInSpacePipe implements PipeTransform{ - - constructor(private sapi: SAPI){} - - public transform(parc: SapiParcellationModel|string, tmpl: SapiSpaceModel|string): Observable<boolean> { - if (!parc) return NEVER - const parcId = typeof parc === "string" - ? parc - : parc["@id"] - const tmplId = typeof tmpl === "string" - ? tmpl - : tmpl["@id"] - for (const key in knownExceptions.supported) { - if (key === parcId && knownExceptions.supported[key].indexOf(tmplId) >= 0) { - return of(true) - } - } - return this.sapi.registry.get<SAPIParcellation>(parcId).getVolumes().pipe( - map(volumes => volumes.some(v => v.data.space["@id"] === tmplId)) - ) - } -} \ No newline at end of file diff --git a/src/atlasComponents/userAnnotations/annotationMode/annotationMode.component.ts b/src/atlasComponents/userAnnotations/annotationMode/annotationMode.component.ts index 5eacf72e9..accf24d9e 100644 --- a/src/atlasComponents/userAnnotations/annotationMode/annotationMode.component.ts +++ b/src/atlasComponents/userAnnotations/annotationMode/annotationMode.component.ts @@ -18,13 +18,7 @@ export class AnnotationMode implements OnDestroy{ public ARIA_LABELS = ARIA_LABELS - public moduleAnnotationTypes: { - instance: { - name: string - iconClass: string - } - onClick: () => void - }[] = [] + public moduleAnnotationTypes = this.modularToolSvc.moduleAnnotationTypes private onDestroyCb: (() => void)[] = [] @@ -34,7 +28,6 @@ export class AnnotationMode implements OnDestroy{ @Optional() @Inject(CLICK_INTERCEPTOR_INJECTOR) clickInterceptor: ClickInterceptor, @Optional() @Inject(CONTEXT_MENU_ITEM_INJECTOR) ctxMenuInterceptor: TContextMenu<TContextMenuReg<TContextArg<'nehuba' | 'threeSurfer'>>> ) { - this.moduleAnnotationTypes = this.modularToolSvc.moduleAnnotationTypes const stopClickProp = () => false if (clickInterceptor) { const { register, deregister } = clickInterceptor diff --git a/src/atlasComponents/userAnnotations/filterAnnotationBySpace.pipe.ts b/src/atlasComponents/userAnnotations/filterAnnotationBySpace.pipe.ts index d339398c0..23f1de2aa 100644 --- a/src/atlasComponents/userAnnotations/filterAnnotationBySpace.pipe.ts +++ b/src/atlasComponents/userAnnotations/filterAnnotationBySpace.pipe.ts @@ -1,5 +1,6 @@ import { Pipe, PipeTransform } from "@angular/core"; import { IAnnotationGeometry } from "./tools/type"; +import { SxplrTemplate } from "src/atlasComponents/sapi/type_sxplr" type TOpts = { reverse?: boolean @@ -11,10 +12,10 @@ type TOpts = { }) export class FilterAnnotationsBySpace implements PipeTransform{ - public transform(annotations: IAnnotationGeometry[], space: { '@id': string }, opts?: TOpts): IAnnotationGeometry[]{ + public transform(annotations: IAnnotationGeometry[], space: SxplrTemplate, opts?: TOpts): IAnnotationGeometry[]{ const { reverse = false } = opts || {} return reverse - ? annotations.filter(ann => ann.space?.["@id"] !== space?.["@id"]) - : annotations.filter(ann => ann.space?.["@id"] === space?.["@id"]) + ? annotations.filter(ann => ann.space?.id !== space?.id) + : annotations.filter(ann => ann.space?.id === space?.id) } } diff --git a/src/atlasComponents/userAnnotations/singleAnnotationUnit/singleAnnotationUnit.template.html b/src/atlasComponents/userAnnotations/singleAnnotationUnit/singleAnnotationUnit.template.html index 51f1c0047..0f35d07e6 100644 --- a/src/atlasComponents/userAnnotations/singleAnnotationUnit/singleAnnotationUnit.template.html +++ b/src/atlasComponents/userAnnotations/singleAnnotationUnit/singleAnnotationUnit.template.html @@ -5,7 +5,7 @@ </mat-label> <mat-select formControlName="spaceId"> <mat-option *ngFor="let tmpl of tmpls$ | async" [value]="tmpl['@id']"> - {{ tmpl.fullName }} + {{ tmpl.name }} </mat-option> </mat-select> </mat-form-field> diff --git a/src/atlasComponents/userAnnotations/tools/line.ts b/src/atlasComponents/userAnnotations/tools/line.ts index 3d01d57dc..c156a9e09 100644 --- a/src/atlasComponents/userAnnotations/tools/line.ts +++ b/src/atlasComponents/userAnnotations/tools/line.ts @@ -127,6 +127,7 @@ export class Line extends IAnnotationGeometry{ coordinatesFrom, coordinatesTo } = json + const { ['@id']: spaceId } = coordinateSpace if (type !== 'tmp/line') throw new Error(`cannot parse line from sands`) const fromPt = coordinatesFrom.map(c => { if (c.unit["@id"] !== 'id.link/mm') throw new Error(`Cannot parse unit`) @@ -145,17 +146,17 @@ export class Line extends IAnnotationGeometry{ x: fromPt[0], y: fromPt[1], z: fromPt[2], - space: coordinateSpace + space: { id: spaceId } }), new Point({ '@type': "siibra-ex/annotation/point", x: toPoint[0], y: toPoint[1], z: toPoint[2], - space: coordinateSpace + space: { id: spaceId } }) ], - space: coordinateSpace + space: { id: spaceId } }) return line } diff --git a/src/atlasComponents/userAnnotations/tools/line/line.template.html b/src/atlasComponents/userAnnotations/tools/line/line.template.html index 3f72bd1d7..2cff6f5fe 100644 --- a/src/atlasComponents/userAnnotations/tools/line/line.template.html +++ b/src/atlasComponents/userAnnotations/tools/line/line.template.html @@ -7,7 +7,7 @@ <mat-chip-list> <mat-chip *ngFor="let point of (updateAnnotation?.points || []) ; let i = index" (click)="gotoRoi(point)" - [matTooltip]="point"> + [matTooltip]="point.toString()"> {{ i }} </mat-chip> </mat-chip-list> diff --git a/src/atlasComponents/userAnnotations/tools/point.ts b/src/atlasComponents/userAnnotations/tools/point.ts index f69baf0e4..a2e108041 100644 --- a/src/atlasComponents/userAnnotations/tools/point.ts +++ b/src/atlasComponents/userAnnotations/tools/point.ts @@ -56,6 +56,7 @@ export class Point extends IAnnotationGeometry { coordinateSpace, coordinates } = sands + const { ['@id']: spaceId } = coordinateSpace if (type === 'https://openminds.ebrains.eu/sands/CoordinatePoint') { const parsedCoordinate = coordinates.map(coord => { const { value, unit } = coord @@ -64,7 +65,7 @@ export class Point extends IAnnotationGeometry { }) const point = new Point({ id, - space: coordinateSpace, + space: { id: spaceId }, "@type": 'siibra-ex/annotation/point', x: parsedCoordinate[0], y: parsedCoordinate[1], diff --git a/src/atlasComponents/userAnnotations/tools/point/point.template.html b/src/atlasComponents/userAnnotations/tools/point/point.template.html index 805ab0876..90f1b5807 100644 --- a/src/atlasComponents/userAnnotations/tools/point/point.template.html +++ b/src/atlasComponents/userAnnotations/tools/point/point.template.html @@ -5,7 +5,7 @@ </span> <mat-chip-list> - <mat-chip [matTooltip]="updateAnnotation" + <mat-chip [matTooltip]="updateAnnotation.toString()" (click)="gotoRoi()"> 0 </mat-chip> diff --git a/src/atlasComponents/userAnnotations/tools/poly.ts b/src/atlasComponents/userAnnotations/tools/poly.ts index 47dd27c7d..37a0fdbd3 100644 --- a/src/atlasComponents/userAnnotations/tools/poly.ts +++ b/src/atlasComponents/userAnnotations/tools/poly.ts @@ -166,6 +166,7 @@ export class Polygon extends IAnnotationGeometry{ coordinateSpace, coordinates } = sands + const { ["@id"]: spaceId } = coordinateSpace if (type === 'tmp/poly') { const points: Point[] = [] const edges: [number, number][] = [] @@ -175,7 +176,9 @@ export class Polygon extends IAnnotationGeometry{ return c.value * 1e6 }) const p = new Point({ - space: coordinateSpace, + space: { + id: spaceId + }, x: parsedValue[0], y: parsedValue[1], z: parsedValue[2], @@ -190,7 +193,7 @@ export class Polygon extends IAnnotationGeometry{ const poly = new Polygon({ id, "@type": 'siibra-ex/annotation/polyline', - space: coordinateSpace, + space: { id: spaceId }, points, edges }) diff --git a/src/atlasComponents/userAnnotations/tools/poly/poly.template.html b/src/atlasComponents/userAnnotations/tools/poly/poly.template.html index 6827915b8..71158649f 100644 --- a/src/atlasComponents/userAnnotations/tools/poly/poly.template.html +++ b/src/atlasComponents/userAnnotations/tools/poly/poly.template.html @@ -7,7 +7,7 @@ <mat-chip-list> <mat-chip *ngFor="let point of (updateAnnotation?.points || []); let i = index" (click)="gotoRoi(point)" - [matTooltip]="point"> + [matTooltip]="point.toString()"> {{ i }} </mat-chip> </mat-chip-list> diff --git a/src/atlasComponents/userAnnotations/tools/service.ts b/src/atlasComponents/userAnnotations/tools/service.ts index e998c9c53..17d58ebe0 100644 --- a/src/atlasComponents/userAnnotations/tools/service.ts +++ b/src/atlasComponents/userAnnotations/tools/service.ts @@ -16,7 +16,7 @@ import { retry } from 'common/util' import { MatSnackBar } from "@angular/material/snack-bar"; import { actions } from "src/state/atlasSelection"; import { atlasSelection } from "src/state"; -import { SapiSpaceModel } from "src/atlasComponents/sapi"; +import { SxplrTemplate } from "src/atlasComponents/sapi/type_sxplr"; import { AnnotationLayer } from "src/atlasComponents/annotations"; const LOCAL_STORAGE_KEY = 'userAnnotationKey' @@ -91,7 +91,7 @@ export class ModularUserAnnotationToolService implements OnDestroy{ private activeToolName: string private forcedAnnotationRefresh$ = new BehaviorSubject(null) - private selectedTmpl: SapiSpaceModel + private selectedTmpl: SxplrTemplate private selectedTmpl$ = this.store.pipe( select(atlasSelection.selectors.selectedTemplate), ) @@ -501,7 +501,7 @@ export class ModularUserAnnotationToolService implements OnDestroy{ this.annotnEvSubj.next({ type: 'metadataEv', detail: { - space: tmpl && { ['@id']: tmpl['@id'] } + space: tmpl } }) this.forcedAnnotationRefresh$.next(null) diff --git a/src/atlasComponents/userAnnotations/tools/type.ts b/src/atlasComponents/userAnnotations/tools/type.ts index 763a58fcb..eb6f15882 100644 --- a/src/atlasComponents/userAnnotations/tools/type.ts +++ b/src/atlasComponents/userAnnotations/tools/type.ts @@ -41,7 +41,9 @@ export abstract class AbsToolClass<T extends IAnnotationGeometry> { init(){ this.subs.push( this.metadataEv$.subscribe(ev => { - this.space = ev.detail.space + this.space = ev.detail.space && ({ + id: ev.detail.space.id + }) }) ) } @@ -225,7 +227,7 @@ export type TCallbackFunction = <T extends keyof TCallback>(arg: TCallback[T]['c export type TBaseAnnotationGeomtrySpec = { id?: string space?: { - ['@id']: string + id: string } name?: string desc?: string @@ -377,7 +379,7 @@ export type TNgMouseEvent = { } export type TMetaEvent = { - space: { ['@id']: string } + space: { id: string } } export interface IAnnotationEvents { diff --git a/src/atlasViewer/atlasViewer.component.ts b/src/atlasViewer/atlasViewer.component.ts index 15dbb4942..5f510e7fd 100644 --- a/src/atlasViewer/atlasViewer.component.ts +++ b/src/atlasViewer/atlasViewer.component.ts @@ -26,6 +26,7 @@ import { environment } from 'src/environments/environment' import { DOCUMENT } from "@angular/common"; import { userPreference } from "src/state" import { DARKTHEME } from "src/util/injectionTokens"; +import { EnumQuickTourSeverity } from "src/ui/quickTour/constrants"; /** * TODO @@ -207,7 +208,8 @@ export class AtlasViewer implements OnDestroy, OnInit, AfterViewInit { If you have any comments or need further support, please contact us at [${this.supportEmailAddress}](mailto:${this.supportEmailAddress})`, description: `That's it! We hope you enjoy your stay. If you have any comments or need further support, please contact us at ${this.supportEmailAddress}`, - position: 'center' + position: 'center' as const, + priority: EnumQuickTourSeverity.LOW } @HostBinding('attr.version') diff --git a/src/atlasViewer/atlasViewer.template.html b/src/atlasViewer/atlasViewer.template.html index ed2e2c6da..864976bc6 100644 --- a/src/atlasViewer/atlasViewer.template.html +++ b/src/atlasViewer/atlasViewer.template.html @@ -30,7 +30,7 @@ [quick-tour-description-md]="quickTourFinale.descriptionMd" [quick-tour-order]="quickTourFinale.order" [quick-tour-overwrite-arrow]="emptyArrowTmpl" - quick-tour-severity="low"> + [quick-tour-severity]="quickTourFinale.priority"> <!-- prevent default is required so that user do not zoom in on UI or scroll on mobile UI --> <iav-cmp-viewer-container class="w-100 h-100 d-block" diff --git a/src/components/dynamicMaterialBtn/dynamicMaterialBtn.component.ts b/src/components/dynamicMaterialBtn/dynamicMaterialBtn.component.ts index d0a19e9ba..57c20da0e 100644 --- a/src/components/dynamicMaterialBtn/dynamicMaterialBtn.component.ts +++ b/src/components/dynamicMaterialBtn/dynamicMaterialBtn.component.ts @@ -1,7 +1,7 @@ import { Component, Input } from "@angular/core"; -type TypeMatBtnStyle = 'mat-button' | 'mat-raised-button' | 'mat-stroked-button' | 'mat-flat-button' | 'mat-icon-button' | 'mat-fab' | 'mat-mini-fab' -type TypeMatBtnColor = 'basic' | 'primary' | 'accent' | 'warn' +export type TypeMatBtnStyle = 'mat-button' | 'mat-raised-button' | 'mat-stroked-button' | 'mat-flat-button' | 'mat-icon-button' | 'mat-fab' | 'mat-mini-fab' +export type TypeMatBtnColor = 'basic' | 'primary' | 'accent' | 'warn' @Component({ selector: 'iav-dynamic-mat-button', diff --git a/src/environments/environment.common.ts b/src/environments/environment.common.ts index 129a0fe9e..a8511509d 100644 --- a/src/environments/environment.common.ts +++ b/src/environments/environment.common.ts @@ -4,7 +4,7 @@ export const environment = { VERSION: 'unknown version', PRODUCTION: true, BACKEND_URL: null, - SIIBRA_API_ENDPOINTS: 'https://siibra-api-stable.apps.hbp.eu/v2_0,https://siibra-api-stable.apps.jsc.hbp.eu/v2_0,https://siibra-api-stable-ns.apps.hbp.eu/v2_0', + SIIBRA_API_ENDPOINTS: 'https://siibra-api-latest.apps-dev.hbp.eu/v3_0', //'https://siibra-api-stable.apps.hbp.eu/v2_0,https://siibra-api-stable.apps.jsc.hbp.eu/v2_0,https://siibra-api-stable-ns.apps.hbp.eu/v2_0', SPATIAL_TRANSFORM_BACKEND: 'https://hbp-spatial-backend.apps.hbp.eu', MATOMO_URL: null, MATOMO_ID: null, diff --git a/src/getFileInput/fileInputModal/fileInputModal.component.ts b/src/getFileInput/fileInputModal/fileInputModal.component.ts index b402c2722..40bfa6d8f 100644 --- a/src/getFileInput/fileInputModal/fileInputModal.component.ts +++ b/src/getFileInput/fileInputModal/fileInputModal.component.ts @@ -68,7 +68,7 @@ export class FileInputModal implements IFileInputConfig{ get fileInput(){ return this._fileInput } - handleFileInputChange(ev: InputEvent){ + handleFileInputChange(ev: Event){ const target = ev.target as HTMLInputElement this.fileInput = target.files[0] } diff --git a/src/messagingGlue.ts b/src/messagingGlue.ts index 724841a7d..45a7fb37e 100644 --- a/src/messagingGlue.ts +++ b/src/messagingGlue.ts @@ -3,6 +3,7 @@ import { Store } from "@ngrx/store"; import { IMessagingActionTmpl, IWindowMessaging } from "./messaging/types"; import { atlasAppearance, atlasSelection, generalActions } from "src/state" import { SAPI } from "./atlasComponents/sapi"; +import { translateV3Entities } from "./atlasComponents/sapi/translate_v3" @Injectable() export class MessagingGlue implements IWindowMessaging, OnDestroy { @@ -22,7 +23,8 @@ export class MessagingGlue implements IWindowMessaging, OnDestroy { const sub = sapi.atlases$.subscribe(atlases => { for (const atlas of atlases) { - const { ['@id']: atlasId, spaces } = atlas + const sapiAtlas = translateV3Entities.retrieveAtlas(atlas) + const { ['@id']: atlasId, spaces } = sapiAtlas for (const tmpl of spaces) { const { ['@id']: tmplId } = tmpl this.tmplSpIdToAtlasId.set(tmplId, atlasId) diff --git a/src/mouseoverModule/util.ts b/src/mouseoverModule/util.ts index 0811db26a..771b7ae4a 100644 --- a/src/mouseoverModule/util.ts +++ b/src/mouseoverModule/util.ts @@ -1,8 +1,8 @@ -import { SapiRegionModel } from "src/atlasComponents/sapi" +import { SxplrRegion } from "src/atlasComponents/sapi/type_sxplr" import { IAnnotationGeometry } from "src/atlasComponents/userAnnotations/tools/type" export type TOnHoverObj = { - regions: SapiRegionModel[] + regions: SxplrRegion[] annotation: IAnnotationGeometry landmark: { landmarkName: number diff --git a/src/plugin/generateTypes.js b/src/plugin/generateTypes.js index 52f69d8f9..5b92c7e0c 100644 --- a/src/plugin/generateTypes.js +++ b/src/plugin/generateTypes.js @@ -1,3 +1,8 @@ +/** + * This node script generates API doc for plugins. + * Check npm run api-schema for usage. + */ + const ts = require('typescript') const fs = require('fs') const path = require('path') diff --git a/src/routerModule/routeStateTransform.service.spec.ts b/src/routerModule/routeStateTransform.service.spec.ts index 590619e9e..5be8c163f 100644 --- a/src/routerModule/routeStateTransform.service.spec.ts +++ b/src/routerModule/routeStateTransform.service.spec.ts @@ -153,21 +153,21 @@ describe("> routeStateTransform.service.ts", () => { } }) - it('> calls correct functions', () => { + it('> calls correct functions', async () => { getRegionLabelIndexSpy.and.returnValue(11) getParcNgId.and.returnValue('foo-bar') const state = {} const svc = TestBed.inject(RouteStateTransformSvc) - const s = svc.cvtStateToRoute(state as any) + const s = await svc.cvtStateToRoute(state as any) for (const key in atlasSelectionSpy) { expect(atlasSelectionSpy[key]).toHaveBeenCalledTimes(1) } }) - it('> regular ngId', () => { + it('> regular ngId', async () => { const ngId = 'foobar' const labelIndex = 124 @@ -176,12 +176,12 @@ describe("> routeStateTransform.service.ts", () => { const state = {} const svc = TestBed.inject(RouteStateTransformSvc) - const s = svc.cvtStateToRoute(state as any) + const s = await svc.cvtStateToRoute(state as any) expect(s).toContain(`r:${ngId}::${encodeNumber(labelIndex, { float: false })}`) }) - it('> ngId containing ()', () => { + it('> ngId containing ()', async () => { const ngId = 'foobar(1)' const labelIndex = 124 @@ -190,7 +190,7 @@ describe("> routeStateTransform.service.ts", () => { const state = {} const svc = TestBed.inject(RouteStateTransformSvc) - const s = svc.cvtStateToRoute(state as any) + const s = await svc.cvtStateToRoute(state as any) expect(s).toContain(`r:foobar%25281%2529::${encodeNumber(labelIndex, { float: false })}`) }) }) diff --git a/src/routerModule/routeStateTransform.service.ts b/src/routerModule/routeStateTransform.service.ts index d464b6eea..93b6dd82f 100644 --- a/src/routerModule/routeStateTransform.service.ts +++ b/src/routerModule/routeStateTransform.service.ts @@ -1,9 +1,10 @@ import { Injectable } from "@angular/core"; import { UrlSegment, UrlTree } from "@angular/router"; import { map } from "rxjs/operators"; -import { SAPI, SapiRegionModel } from "src/atlasComponents/sapi"; +import { SAPI } from "src/atlasComponents/sapi"; +import { SxplrRegion } from "src/atlasComponents/sapi/type_sxplr" import { atlasSelection, defaultState, MainState, plugins, userInteraction } from "src/state"; -import { getParcNgId, getRegionLabelIndex } from "src/viewerModule/nehuba/config.service"; +import { getParcNgId, } from "src/viewerModule/nehuba/config.service"; import { decodeToNumber, encodeNumber, encodeURIFull, separator } from "./cipher"; import { TUrlAtlas, TUrlPathObj, TUrlStandaloneVolume } from "./type"; import { decodePath, encodeId, decodeId, endcodePath } from "./util"; @@ -43,7 +44,7 @@ export class RouteStateTransformSvc { this.sapi.getParcRegions(selectedAtlasId, selectedParcellationId, selectedTemplateId, { priority: 10 }).toPromise(), ]) - const ngIdToRegionMap: Map<string, Map<number, SapiRegionModel[]>> = new Map() + const ngIdToRegionMap: Map<string, Map<number, SxplrRegion[]>> = new Map() for (const region of allParcellationRegions) { const ngId = getParcNgId(selectedAtlas, selectedTemplate, selectedParcellation, region) @@ -52,7 +53,7 @@ export class RouteStateTransformSvc { } const map = ngIdToRegionMap.get(ngId) - const idx = getRegionLabelIndex(selectedAtlas, selectedTemplate, selectedParcellation, region) + const idx = await this.sapi.getRegionLabelIndices(selectedTemplate, selectedParcellation, region) if (!map.has(idx)) { map.set(idx, []) } @@ -201,7 +202,7 @@ export class RouteStateTransformSvc { return returnState } - cvtStateToRoute(_state: MainState) { + async cvtStateToRoute(_state: MainState) { /** * need to create new references here @@ -238,7 +239,7 @@ export class RouteStateTransformSvc { let selectedRegionsString: string if (selectedRegions.length === 1) { const region = selectedRegions[0] - const labelIndex = getRegionLabelIndex(selectedAtlas, selectedTemplate, selectedParcellation, region) + const labelIndex = await this.sapi.getRegionLabelIndices(selectedTemplate, selectedParcellation, region) const ngId = getParcNgId(selectedAtlas, selectedTemplate, selectedParcellation, region) selectedRegionsString = `${ngId}::${encodeNumber(labelIndex, { float: false })}` diff --git a/src/routerModule/router.service.ts b/src/routerModule/router.service.ts index 3a060971d..7a2047489 100644 --- a/src/routerModule/router.service.ts +++ b/src/routerModule/router.service.ts @@ -3,9 +3,9 @@ import { APP_BASE_HREF } from "@angular/common"; import { Inject } from "@angular/core"; import { NavigationEnd, Router } from '@angular/router' import { Store } from "@ngrx/store"; -import { debounceTime, distinctUntilChanged, filter, map, mapTo, shareReplay, startWith, switchMap, switchMapTo, take, withLatestFrom } from "rxjs/operators"; +import { catchError, debounceTime, distinctUntilChanged, filter, map, mapTo, shareReplay, startWith, switchMap, switchMapTo, take, withLatestFrom } from "rxjs/operators"; import { encodeCustomState, decodeCustomState, verifyCustomState } from "./util"; -import { BehaviorSubject, combineLatest, concat, merge, Observable, timer } from 'rxjs' +import { BehaviorSubject, combineLatest, concat, from, merge, Observable, of, timer } from 'rxjs' import { scan } from 'rxjs/operators' import { RouteStateTransformSvc } from "./routeStateTransform.service"; import { SAPI } from "src/atlasComponents/sapi"; @@ -145,22 +145,21 @@ export class RouterService { }) ), withLatestFrom( - store$, + store$.pipe( + switchMap(state => + from(routeToStateTransformSvc.cvtStateToRoute(state)).pipe( + catchError(() => of(``)) + ) + ) + ), this.customRoute$.pipe( startWith({}) ) ) ).subscribe(arg => { - const [{ stateFromRoute, url }, currentState, customRoutes] = arg + const [{ stateFromRoute, url }, _routeFromState, customRoutes] = arg const fullPath = url - - let routeFromState: string - try { - routeFromState = routeToStateTransformSvc.cvtStateToRoute(currentState) - } catch (_e) { - routeFromState = `` - } - + let routeFromState = _routeFromState for (const key in customRoutes) { const customStatePath = encodeCustomState(key, customRoutes[key]) if (!customStatePath) continue @@ -203,14 +202,14 @@ export class RouterService { combineLatest([ store$.pipe( debounceTime(160), - map(state => { - try { - return routeToStateTransformSvc.cvtStateToRoute(state) - } catch (e) { - this.logError(e) - return `` - } - }) + switchMap(state => + from(routeToStateTransformSvc.cvtStateToRoute(state)).pipe( + catchError(err => { + this.logError(err) + return of(``) + }) + ) + ), ), this.customRoute$, ]).pipe( diff --git a/src/state/annotations/store.ts b/src/state/annotations/store.ts index 21198ff81..26a52261b 100644 --- a/src/state/annotations/store.ts +++ b/src/state/annotations/store.ts @@ -1,5 +1,5 @@ import { createReducer, on } from "@ngrx/store" -import { OpenMINDSCoordinatePoint } from "src/atlasComponents/sapi" +import { OpenMINDSCoordinatePoint } from "src/atlasComponents/sapi/type_v3" import * as actions from "./actions" type Line = { diff --git a/src/state/atlasAppearance/const.ts b/src/state/atlasAppearance/const.ts index c6c24f31b..32a78b0f0 100644 --- a/src/state/atlasAppearance/const.ts +++ b/src/state/atlasAppearance/const.ts @@ -1,4 +1,4 @@ -import { SapiRegionModel } from "src/atlasComponents/sapi" +import { SxplrRegion } from "src/atlasComponents/sapi/type_sxplr" export const nameSpace = `[state.atlasAppearance]` type CustomLayerBase = { @@ -7,7 +7,7 @@ type CustomLayerBase = { export type ColorMapCustomLayer = { clType: 'customlayer/colormap' | 'baselayer/colormap' - colormap: WeakMap<SapiRegionModel, number[]> + colormap: WeakMap<SxplrRegion, number[]> } & CustomLayerBase export type ThreeSurferCustomLayer = { diff --git a/src/state/atlasSelection/actions.ts b/src/state/atlasSelection/actions.ts index 7cf6d778a..36e61174c 100644 --- a/src/state/atlasSelection/actions.ts +++ b/src/state/atlasSelection/actions.ts @@ -1,25 +1,25 @@ import { createAction, props } from "@ngrx/store"; -import { SapiAtlasModel, SapiParcellationModel, SapiRegionModel, SapiSpaceModel } from "src/atlasComponents/sapi"; +import { SxplrAtlas, SxplrParcellation, SxplrRegion, SxplrTemplate } from "src/atlasComponents/sapi/type_sxplr"; import { BreadCrumb, nameSpace, ViewerMode, AtlasSelectionState } from "./const" export const selectAtlas = createAction( `${nameSpace} selectAtlas`, props<{ - atlas: SapiAtlasModel + atlas: SxplrAtlas }>() ) export const selectTemplate = createAction( `${nameSpace} selectTemplate`, props<{ - template: SapiSpaceModel + template: SxplrTemplate }>() ) export const selectParcellation = createAction( `${nameSpace} selectParcellation`, props<{ - parcellation: SapiParcellationModel + parcellation: SxplrParcellation }>() ) @@ -44,21 +44,21 @@ export const setAtlasSelectionState = createAction( export const setSelectedParcellationAllRegions = createAction( `${nameSpace} setSelectedParcellationAllRegions`, props<{ - regions: SapiRegionModel[] + regions: SxplrRegion[] }>() ) export const selectRegion = createAction( `${nameSpace} selectRegion`, props<{ - region: SapiRegionModel + region: SxplrRegion }>() ) export const setSelectedRegions = createAction( `${nameSpace} setSelectedRegions`, props<{ - regions: SapiRegionModel[] + regions: SxplrRegion[] }>() ) @@ -146,7 +146,7 @@ export const navigateTo = createAction( export const navigateToRegion = createAction( `${nameSpace} navigateToRegion`, props<{ - region: SapiRegionModel + region: SxplrRegion }>() ) @@ -157,7 +157,7 @@ export const clearViewerMode = createAction( export const toggleRegionSelect = createAction( `${nameSpace} toggleRegionSelect`, props<{ - region: SapiRegionModel + region: SxplrRegion }>() ) @@ -171,7 +171,7 @@ export const toggleRegionSelectById = createAction( export const viewSelRegionInNewSpace = createAction( `${nameSpace} viewSelRegionInNewSpace`, props<{ - region: SapiRegionModel - template: SapiSpaceModel + region: SxplrRegion + template: SxplrTemplate }>() ) diff --git a/src/state/atlasSelection/const.ts b/src/state/atlasSelection/const.ts index 1499e2472..b5ad6084a 100644 --- a/src/state/atlasSelection/const.ts +++ b/src/state/atlasSelection/const.ts @@ -1,4 +1,4 @@ -import { SapiAtlasModel, SapiParcellationModel, SapiRegionModel, SapiSpaceModel } from "src/atlasComponents/sapi" +import { SxplrAtlas, SxplrTemplate, SxplrParcellation, SxplrRegion } from "src/atlasComponents/sapi/type_sxplr" export const nameSpace = `[state.atlasSelection]` export type ViewerMode = 'annotating' | 'key frame' @@ -8,12 +8,12 @@ export type BreadCrumb = { } export type AtlasSelectionState = { - selectedAtlas: SapiAtlasModel - selectedTemplate: SapiSpaceModel - selectedParcellation: SapiParcellationModel - selectedParcellationAllRegions: SapiRegionModel[] + selectedAtlas: SxplrAtlas + selectedTemplate: SxplrTemplate + selectedParcellation: SxplrParcellation + selectedParcellationAllRegions: SxplrRegion[] - selectedRegions: SapiRegionModel[] + selectedRegions: SxplrRegion[] standAloneVolumes: string[] /** diff --git a/src/state/atlasSelection/effects.ts b/src/state/atlasSelection/effects.ts index a84da1c3d..b61069617 100644 --- a/src/state/atlasSelection/effects.ts +++ b/src/state/atlasSelection/effects.ts @@ -1,26 +1,28 @@ import { Injectable } from "@angular/core"; import { Actions, createEffect, ofType } from "@ngrx/effects"; -import { concat, forkJoin, merge, Observable, of } from "rxjs"; +import { forkJoin, merge, Observable, of } from "rxjs"; import { catchError, filter, map, mapTo, switchMap, switchMapTo, take, withLatestFrom } from "rxjs/operators"; -import { SAPI, SapiAtlasModel, SapiParcellationModel, SAPIRegion, SapiRegionModel, SapiSpaceModel } from "src/atlasComponents/sapi"; +import { SAPI, SAPIRegion } from "src/atlasComponents/sapi"; import * as mainActions from "../actions" import { select, Store } from "@ngrx/store"; import { selectors, actions } from '.' import { AtlasSelectionState } from "./const" import { atlasAppearance, atlasSelection } from ".."; -import { ParcellationSupportedInSpacePipe } from "src/atlasComponents/sapiViews/util/parcellationSupportedInSpace.pipe"; + import { InterSpaceCoordXformSvc } from "src/atlasComponents/sapi/core/space/interSpaceCoordXform.service"; +import { translateV3Entities } from "src/atlasComponents/sapi/translate_v3" +import { SxplrAtlas, SxplrParcellation, SxplrRegion, SxplrTemplate } from "src/atlasComponents/sapi/type_sxplr"; type OnTmplParcHookArg = { previous: { - atlas: SapiAtlasModel - template: SapiSpaceModel - parcellation: SapiParcellationModel + atlas: SxplrAtlas + template: SxplrTemplate + parcellation: SxplrParcellation } current: { - atlas: SapiAtlasModel - template: SapiSpaceModel - parcellation: SapiParcellationModel + atlas: SxplrAtlas + template: SxplrTemplate + parcellation: SxplrParcellation } } @@ -36,7 +38,7 @@ export class Effect { const { atlas, parcellation, template } = current return ( !!atlas && !!parcellation && !!template - ? this.sapiSvc.getParcRegions(atlas["@id"], parcellation["@id"], template["@id"]) + ? this.sapiSvc.getParcRegions(atlas.id, parcellation.id, template.id) : of([]) ).pipe( map(regions => { @@ -47,13 +49,13 @@ export class Effect { ) }, ({ current, previous }) => { - const prevSpcName = InterSpaceCoordXformSvc.TmplIdToValidSpaceName(previous?.template?.["@id"]) - const currSpcName = InterSpaceCoordXformSvc.TmplIdToValidSpaceName(current?.template?.["@id"]) + const prevSpcName = InterSpaceCoordXformSvc.TmplIdToValidSpaceName(previous?.template?.id) + const currSpcName = InterSpaceCoordXformSvc.TmplIdToValidSpaceName(current?.template?.id) /** * if trans-species, return default state for navigation */ - if (previous?.atlas?.["@id"] !== current?.atlas?.["@id"]) { + if (previous?.atlas?.id !== current?.atlas?.id) { return of({ navigation: null }) @@ -89,14 +91,13 @@ export class Effect { } ] - parcSupportedInSpacePipe = new ParcellationSupportedInSpacePipe(this.sapiSvc) - onTemplateParcSelection = createEffect(() => merge<{ template: SapiSpaceModel, parcellation: SapiParcellationModel }>( + onTemplateParcSelection = createEffect(() => merge( this.action.pipe( ofType(actions.selectTemplate), map(({ template }) => { return { template, - parcellation: null + parcellation: null as SxplrParcellation } }) ), @@ -104,7 +105,7 @@ export class Effect { ofType(actions.selectParcellation), map(({ parcellation }) => { return { - template: null, + template: null as SxplrTemplate, parcellation } }) @@ -115,14 +116,9 @@ export class Effect { const currTmpl = selectors.selectedTemplate(store) const currParc = selectors.selectedParcellation(store) const currAtlas = selectors.selectedAtlas(store) - return this.parcSupportedInSpacePipe.transform( - parcellation || currParc, - template || currTmpl - ).pipe( - switchMap(flag => { - /** - * if desired parc is supported in tmpl, emit them - */ + return this.sapiSvc.getSupportedTemplates(currAtlas, parcellation || currParc).pipe( + switchMap(tmpls => { + const flag = tmpls.some(tmpl => tmpl.id === (template || currTmpl).id) if (flag) { return of({ atlas: currAtlas, @@ -134,38 +130,28 @@ export class Effect { * if template is defined, find the first parcellation that is supported */ if (!!template) { - return concat( - ...currAtlas.parcellations.map( - p => this.parcSupportedInSpacePipe.transform(p["@id"], template).pipe( - filter(flag => flag), - switchMap(() => this.sapiSvc.getParcDetail(currAtlas["@id"], p['@id'])), - ) - ) - ).pipe( - take(1), - map(parcellation => { + return this.sapiSvc.getSupportedParcellations(currAtlas, template).pipe( + map(parcs => { + if (parcs.length === 0) { + throw new Error(`Cannot find any supported parcellations for template ${template.name}`) + } return { atlas: currAtlas, template, - parcellation + parcellation: parcs[0] } }) ) } if (!!parcellation) { - return concat( - ...currAtlas.spaces.map( - sp => this.parcSupportedInSpacePipe.transform(parcellation["@id"], sp["@id"]).pipe( - filter(flag => flag), - switchMap(() => this.sapiSvc.getSpaceDetail(currAtlas["@id"], sp['@id'])), - ) - ) - ).pipe( - take(1), - map(template => { + return this.sapiSvc.getSupportedTemplates(currAtlas, parcellation).pipe( + map(templates => { + if (templates.length === 0) { + throw new Error(`Cannot find any supported templates for parcellation ${parcellation.name}`) + } return { atlas: currAtlas, - template, + template: templates[0], parcellation } }) @@ -178,6 +164,7 @@ export class Effect { this.onTemplateParcSelectionPostHook.map(fn => fn({ previous: { atlas: currAtlas, template: currTmpl, parcellation: currParc }, current: { atlas, template, parcellation } })) ).pipe( map(partialStates => { + console.log('selected teplate', template, parcellation) let returnState: Partial<AtlasSelectionState> = { selectedAtlas: atlas, selectedTemplate: template, @@ -200,28 +187,21 @@ export class Effect { onAtlasSelectionSelectTmplParc = createEffect(() => this.action.pipe( ofType(actions.selectAtlas), filter(action => !!action.atlas), - switchMap(({ atlas }) => { - const selectedParc = atlas.parcellations.find(p => /290/.test(p["@id"])) || atlas.parcellations[0] - return this.sapiSvc.getParcDetail(atlas["@id"], selectedParc["@id"], { priority: 10 }).pipe( - map(parcellation => { + switchMap(({ atlas }) => + this.sapiSvc.getAllParcellations(atlas).pipe( + map(parcellations => { + const selectedParc = parcellations.find(p => p.id.includes("290")) || parcellations[0] return { - parcellation, + parcellation: selectedParc, atlas } }) ) - }), + ), switchMap(({ atlas, parcellation }) => { - const spacdIds = parcellation.brainAtlasVersions.map(bas => bas.coordinateSpace) as { "@id": string }[] - return forkJoin( - spacdIds.filter( - spaceId => atlas.spaces.map(spc => spc["@id"]).indexOf(spaceId["@id"]) >= 0 - ).map(spaceId => - this.sapiSvc.getSpaceDetail(atlas["@id"], spaceId["@id"]) - ) - ).pipe( + return this.sapiSvc.getSupportedTemplates(atlas, parcellation).pipe( switchMap(spaces => { - const selectedSpace = spaces.find(s => /152/.test(s.fullName)) || spaces[0] + const selectedSpace = spaces.find(s => s.name.includes("152")) || spaces[0] return forkJoin( this.onTemplateParcSelectionPostHook.map(fn => fn({ previous: null, current: { atlas, parcellation, template: selectedSpace } })) ).pipe( @@ -255,7 +235,7 @@ export class Effect { ) ), switchMap(([regions, layers]) => { - const map = new Map<SapiRegionModel, number[]>() + const map = new Map<SxplrRegion, number[]>() for (const region of regions) { map.set(region, SAPIRegion.GetDisplayColor(region)) } @@ -336,8 +316,8 @@ export class Effect { select(selectors.selectedParcellation) ) ), - switchMap(([{ region }, selectedTemplate, selectedAtlas, selectedParcellation]) => { - if (!selectedAtlas || !selectedTemplate || !selectedParcellation || !region) { + switchMap(([{ region: _region }, selectedTemplate, selectedAtlas, selectedParcellation]) => { + if (!selectedAtlas || !selectedTemplate || !selectedParcellation || !_region) { return of( mainActions.generalActionError({ message: `atlas, template, parcellation or region not set` @@ -345,6 +325,8 @@ export class Effect { ) } + const region = translateV3Entities.retrieveRegion(_region) + if (region.hasAnnotation?.bestViewPoint && region.hasAnnotation.bestViewPoint.coordinateSpace['@id'] === selectedTemplate["@id"]) { return of( actions.navigateTo({ diff --git a/src/state/atlasSelection/store.ts b/src/state/atlasSelection/store.ts index ebea8a78d..1138c4937 100644 --- a/src/state/atlasSelection/store.ts +++ b/src/state/atlasSelection/store.ts @@ -1,14 +1,7 @@ import { createReducer, on } from "@ngrx/store"; -import { SapiAtlasModel, SapiParcellationModel, SapiRegionModel, SapiSpaceModel } from "src/atlasComponents/sapi"; import * as actions from "./actions" import { AtlasSelectionState } from "./const" -function getRegionLabelIndex(atlas: SapiAtlasModel, tmpl: SapiSpaceModel, parc: SapiParcellationModel, region: SapiRegionModel) { - const lblIdx = Number(region?.hasAnnotation?.internalIdentifier) - if (isNaN(lblIdx)) return null - return lblIdx -} - export const defaultState: AtlasSelectionState = { selectedAtlas: null, selectedParcellation: null, @@ -50,13 +43,6 @@ const reducer = createReducer( * * ignore */ - const { selectedAtlas, selectedParcellation, selectedTemplate } = state - if ( - !region.hasAnnotation?.visualizedIn - && !getRegionLabelIndex(selectedAtlas, selectedTemplate, selectedParcellation, region) - ) { - return { ...state } - } const selected = state.selectedRegions.includes(region) return { ...state, @@ -117,14 +103,12 @@ const reducer = createReducer( on( actions.selectAtlas, (state, { atlas }) => { - if (atlas?.["@id"] === state?.selectedAtlas?.["@id"]) { - return state + if (atlas?.id === state?.selectedAtlas?.id) { + return { ...state } } return { ...state, selectedAtlas: atlas, - selectedTemplate: null, - selectedParcellation: null, } } ), diff --git a/src/state/atlasSelection/util.ts b/src/state/atlasSelection/util.ts index 2ee06893c..0f21d0095 100644 --- a/src/state/atlasSelection/util.ts +++ b/src/state/atlasSelection/util.ts @@ -1,45 +1,12 @@ import { createSelector, select } from "@ngrx/store"; import { forkJoin, of, pipe } from "rxjs"; import { distinctUntilChanged, map, switchMap } from "rxjs/operators"; -import { SAPI, SapiAtlasModel, SapiParcellationModel, SapiSpaceModel } from "src/atlasComponents/sapi"; +import { SAPI } from "src/atlasComponents/sapi"; +import { translateV3Entities } from "src/atlasComponents/sapi/translate_v3" +import { SxplrAtlas, SxplrParcellation, SxplrTemplate } from "src/atlasComponents/sapi/type_sxplr"; import { jsonEqual } from "src/util/json"; import * as selectors from "./selectors" -const allAvailSpaces = (sapi: SAPI) => { - return pipe( - select(selectors.selectedAtlas), - switchMap(atlas => atlas - ? forkJoin( - atlas.spaces.map(spcWId => sapi.getSpaceDetail(atlas["@id"], spcWId["@id"])) - ) - : of([]) - ) - ) -} - -const allAvailParcs = (sapi: SAPI) => pipe( - select(selectors.selectedAtlas), - switchMap(atlas => atlas - ? forkJoin( - atlas.parcellations.map(parcWId => sapi.getParcDetail(atlas["@id"], parcWId["@id"])) - ) - : of([]) - ) -) -const allAvailSpacesParcs = (sapi: SAPI) => pipe( - select(selectors.selectedAtlas), - switchMap(atlas => atlas - ? forkJoin({ - spaces: atlas.spaces.map(spcWId => sapi.getSpaceDetail(atlas["@id"], spcWId["@id"])), - parcellation: atlas.parcellations.map(parcWId => sapi.getParcDetail(atlas["@id"], parcWId["@id"])), - }) - : of({ - spaces: [], - parcellation: [] - }) - ) -) - const nonDistinctATP = createSelector( selectors.selectedAtlas, selectors.selectedTemplate, @@ -50,14 +17,11 @@ const nonDistinctATP = createSelector( const distinctATP = () => pipe( select(nonDistinctATP), distinctUntilChanged( - jsonEqual((o, n) => o?.["@id"] === n?.["@id"]) + jsonEqual((o, n) => o?.id === n?.id) ), - map(val => val as { atlas: SapiAtlasModel, parcellation: SapiParcellationModel, template: SapiSpaceModel }) + map(val => val as { atlas: SxplrAtlas, parcellation: SxplrParcellation, template: SxplrTemplate }) ) export const fromRootStore = { - allAvailSpaces, - allAvailParcs, - allAvailSpacesParcs, distinctATP, } diff --git a/src/state/index.ts b/src/state/index.ts index 4d63d64e5..40e84c234 100644 --- a/src/state/index.ts +++ b/src/state/index.ts @@ -26,7 +26,6 @@ function debug(reducer: ActionReducer<MainState>): ActionReducer<MainState> { return function(state, action) { console.log('state', state); console.log('action', action); - return reducer(state, action); }; } diff --git a/src/state/userInteraction/actions.ts b/src/state/userInteraction/actions.ts index 3df6c1b97..42de09fe8 100644 --- a/src/state/userInteraction/actions.ts +++ b/src/state/userInteraction/actions.ts @@ -1,6 +1,6 @@ import { createAction, props } from "@ngrx/store" import { nameSpace } from "./const" -import { SapiRegionModel, SapiFeatureModel, OpenMINDSCoordinatePoint } from "src/atlasComponents/sapi" +import { SxplrRegion, Feature, Point } from "src/atlasComponents/sapi/type_sxplr" export const mouseOverAnnotations = createAction( `${nameSpace} mouseOverAnnotations`, @@ -14,21 +14,21 @@ export const mouseOverAnnotations = createAction( export const mouseoverRegions = createAction( `${nameSpace} mouseoverRegions`, props<{ - regions: SapiRegionModel[] + regions: SxplrRegion[] }>() ) export const mouseoverPosition = createAction( `${nameSpace} mouseoverPosition`, props<{ - position: OpenMINDSCoordinatePoint + position: Point }>() ) export const showFeature = createAction( `${nameSpace} showFeature`, props<{ - feature: SapiFeatureModel + feature: Feature }>() ) diff --git a/src/state/userInteraction/store.ts b/src/state/userInteraction/store.ts index ab7570028..7426ba02e 100644 --- a/src/state/userInteraction/store.ts +++ b/src/state/userInteraction/store.ts @@ -1,11 +1,11 @@ import { createReducer, on } from "@ngrx/store"; -import { SapiRegionModel, SapiFeatureModel, OpenMINDSCoordinatePoint } from "src/atlasComponents/sapi"; +import { SxplrRegion, Feature, Point } from "src/atlasComponents/sapi/type_sxplr"; import * as actions from "./actions" export type UserInteraction = { - mouseoverRegions: SapiRegionModel[] - selectedFeature: SapiFeatureModel - mouseoverPosition: OpenMINDSCoordinatePoint + mouseoverRegions: SxplrRegion[] + selectedFeature: Feature + mouseoverPosition: Point } export const defaultState: UserInteraction = { diff --git a/src/strictLocal/strictLocal.directive.ts b/src/strictLocal/strictLocal.directive.ts index b5f0c83ad..a3141e701 100644 --- a/src/strictLocal/strictLocal.directive.ts +++ b/src/strictLocal/strictLocal.directive.ts @@ -1,4 +1,4 @@ -import { ComponentFactoryResolver, Directive, HostBinding, ViewContainerRef } from "@angular/core"; +import { Directive, HostBinding, ViewContainerRef } from "@angular/core"; import { environment } from "src/environments/environment" import { StrictLocalInfo } from "./strictLocalCmp/strictLocalCmp.component"; @@ -12,11 +12,9 @@ export class HideWhenLocal { hideWhenLocal = environment.STRICT_LOCAL ? 'none!important' : null constructor( private vc: ViewContainerRef, - private cfr: ComponentFactoryResolver, ){ if (environment.STRICT_LOCAL) { - const cf = this.cfr.resolveComponentFactory(StrictLocalInfo) - this.vc.createComponent(cf) + this.vc.createComponent(StrictLocalInfo) } } } diff --git a/src/ui/dialogInfo/dialog.directive.ts b/src/ui/dialogInfo/dialog.directive.ts index eccb689f2..3b24370b9 100644 --- a/src/ui/dialogInfo/dialog.directive.ts +++ b/src/ui/dialogInfo/dialog.directive.ts @@ -31,7 +31,7 @@ const sizeDict: Record<DialogSize, Partial<MatDialogConfig>> = { export class DialogDirective{ @Input('sxplr-dialog') - templateRef: TemplateRef<unknown> + templateRef: TemplateRef<unknown>|string @Input('sxplr-dialog-size') size: DialogSize = 'm' @@ -43,7 +43,11 @@ export class DialogDirective{ @HostListener('click') onClick(){ - this.matDialog.open(this.templateRef || DialogFallbackCmp, { + const tmpl = this.templateRef instanceof TemplateRef + ? this.templateRef + : DialogFallbackCmp + + this.matDialog.open(tmpl, { data: this.data, ...(sizeDict[this.size] || {}) }) diff --git a/src/ui/quickTour/constrants.ts b/src/ui/quickTour/constrants.ts index 375ecc3f9..0cac96e3b 100644 --- a/src/ui/quickTour/constrants.ts +++ b/src/ui/quickTour/constrants.ts @@ -3,8 +3,8 @@ import { InjectionToken, TemplateRef } from "@angular/core" type TPosition = 'top' | 'top-right' | 'right' | 'bottom-right' | 'bottom' | 'bottom-left' | 'left' | 'top-left' | 'center' type TCustomPosition = { - left: number - top: number + left: string + top: string } export interface IQuickTourData { @@ -31,6 +31,12 @@ export enum EnumQuickTourSeverity { HIGH = 'hight', } +export const QuickTourSeverity = { + "low": EnumQuickTourSeverity.LOW, + "medium": EnumQuickTourSeverity.MEDIUM, + "high": EnumQuickTourSeverity.HIGH, +} as const + export const PERMISSION_DIALOG_ACTIONS = { START: `start`, CANCEL: `cancel`, diff --git a/src/ui/quickTour/quickTour.service.ts b/src/ui/quickTour/quickTour.service.ts index 3aed96edf..e593328e8 100644 --- a/src/ui/quickTour/quickTour.service.ts +++ b/src/ui/quickTour/quickTour.service.ts @@ -4,11 +4,18 @@ import { Overlay, OverlayRef } from "@angular/cdk/overlay"; import { ComponentPortal } from "@angular/cdk/portal"; import { QuickTourThis } from "./quickTourThis.directive"; import { DoublyLinkedList, IDoublyLinkedItem } from 'src/util' -import { EnumQuickTourSeverity, PERMISSION_DIALOG_ACTIONS, QUICK_TOUR_CMP_INJTKN } from "./constrants"; +import { EnumQuickTourSeverity, PERMISSION_DIALOG_ACTIONS, QuickTourSeverity, QUICK_TOUR_CMP_INJTKN } from "./constrants"; import { LOCAL_STORAGE_CONST } from "src/util/constants"; import { MatDialog, MatDialogRef } from "@angular/material/dialog"; import { StartTourDialogDialog } from "src/ui/quickTour/startTourDialog/startTourDialog.component"; +const autoPlayPriority: Set<EnumQuickTourSeverity | keyof typeof QuickTourSeverity> = new Set([ + EnumQuickTourSeverity.HIGH, + EnumQuickTourSeverity.MEDIUM, + "medium", + "high" +]) + @Injectable() export class QuickTourService { @@ -51,7 +58,7 @@ export class QuickTourService { ) - if (dir.quickTourSeverity === EnumQuickTourSeverity.MEDIUM || dir.quickTourSeverity === EnumQuickTourSeverity.HIGH) { + if (autoPlayPriority.has(dir.quickTourSeverity)) { this.autoStart() } } diff --git a/src/ui/quickTour/quickTourThis.directive.ts b/src/ui/quickTour/quickTourThis.directive.ts index 190816645..9dc6a2bd3 100644 --- a/src/ui/quickTour/quickTourThis.directive.ts +++ b/src/ui/quickTour/quickTourThis.directive.ts @@ -1,7 +1,6 @@ import { Directive, ElementRef, Input, OnChanges, OnDestroy, OnInit, TemplateRef } from "@angular/core"; import { QuickTourService } from "src/ui/quickTour/quickTour.service"; -import { EnumQuickTourSeverity, IQuickTourOverwritePosition, TQuickTourPosition } from "src/ui/quickTour/constrants"; -import {LOCAL_STORAGE_CONST} from "src/util/constants"; +import { EnumQuickTourSeverity, IQuickTourOverwritePosition, TQuickTourPosition, QuickTourSeverity } from "src/ui/quickTour/constrants"; @Directive({ selector: '[quick-tour]', @@ -15,7 +14,7 @@ export class QuickTourThis implements OnInit, OnChanges, OnDestroy { @Input('quick-tour-position') position: TQuickTourPosition @Input('quick-tour-overwrite-position') overwritePosition: IQuickTourOverwritePosition @Input('quick-tour-overwrite-arrow') overWriteArrow: TemplateRef<any> | string - @Input('quick-tour-severity') quickTourSeverity: EnumQuickTourSeverity = EnumQuickTourSeverity.MEDIUM + @Input('quick-tour-severity') quickTourSeverity: EnumQuickTourSeverity | keyof typeof QuickTourSeverity = EnumQuickTourSeverity.MEDIUM private attachedTmpl: ElementRef diff --git a/src/ui/topMenu/topMenuCmp/topMenu.components.ts b/src/ui/topMenu/topMenuCmp/topMenu.components.ts index 0d464d59a..c2ed29672 100644 --- a/src/ui/topMenu/topMenuCmp/topMenu.components.ts +++ b/src/ui/topMenu/topMenuCmp/topMenu.components.ts @@ -13,6 +13,7 @@ import { MatBottomSheet } from "@angular/material/bottom-sheet"; import { CONST, QUICKTOUR_DESC, ARIA_LABELS } from 'common/constants' import { IQuickTourData } from "src/ui/quickTour/constrants"; import { environment } from 'src/environments/environment' +import { TypeMatBtnColor, TypeMatBtnStyle } from "src/components/dynamicMaterialBtn/dynamicMaterialBtn.component"; @Component({ selector: 'top-menu-cmp', @@ -30,8 +31,8 @@ export class TopMenuCmp { public ARIA_LABELS = ARIA_LABELS public PINNED_DATASETS_BADGE_DESC = CONST.PINNED_DATASETS_BADGE_DESC - public matBtnStyle = 'mat-icon-button' - public matBtnColor = 'primary' + public matBtnStyle: TypeMatBtnStyle = 'mat-icon-button' + public matBtnColor: TypeMatBtnColor = 'primary' private _ismobile = false @Input() @@ -103,9 +104,9 @@ export class TopMenuCmp { } private keyListenerConfigBase = { - type: 'keydown', + type: 'keydown' as const, stop: true, - target: 'document', + target: 'document' as const, } public keyListenerConfig = [{ diff --git a/src/util/priority.ts b/src/util/priority.ts index 79ef1b043..b12abb243 100644 --- a/src/util/priority.ts +++ b/src/util/priority.ts @@ -31,7 +31,7 @@ export const DISABLE_PRIORITY_HEADER = 'x-sxplr-disable-priority' }) export class PriorityHttpInterceptor implements HttpInterceptor{ - private retry = 5 + private retry = 0 private disablePriority = false private priorityQueue: Queue[] = [] @@ -73,8 +73,7 @@ export class PriorityHttpInterceptor implements HttpInterceptor{ this.counter -- }), catchError((err, obs) => { - if (retry >= 0) { - retry -- + if (--retry >= 0) { return obs } return of(new Error(err)) diff --git a/src/viewerModule/nehuba/base.service/base.service.ts b/src/viewerModule/nehuba/base.service/base.service.ts new file mode 100644 index 000000000..0e7020fb0 --- /dev/null +++ b/src/viewerModule/nehuba/base.service/base.service.ts @@ -0,0 +1,99 @@ +import { Injectable } from "@angular/core"; +import { select, Store } from "@ngrx/store"; +import { from, Observable, pipe, UnaryFunction } from "rxjs"; +import { map, shareReplay, switchMap } from "rxjs/operators"; +import { SAPI } from "src/atlasComponents/sapi"; +import { NgSegLayerSpec, SxplrRegion } from "src/atlasComponents/sapi/type_sxplr"; +import { atlasSelection } from "src/state"; +import { getParcNgId } from "../config.service"; + +type NgMapReturnType = { + region: SxplrRegion + layer: NgSegLayerSpec +} + +@Injectable({ + providedIn: 'root' +}) +export class BaseService { + + constructor(private sapi: SAPI, private store$: Store){} + + public selectedATP$ = this.store$.pipe( + atlasSelection.fromRootStore.distinctATP(), + ) + + public selectedATPR$ = this.selectedATP$.pipe( + switchMap(({ atlas, template, parcellation }) => + this.store$.pipe( + select(atlasSelection.selectors.selectedParcAllRegions), + map(regions => ({ + atlas, template, parcellation, regions + })), + ) + ) + ) + + #translatedNgMap = this.selectedATPR$.pipe( + switchMap(({ atlas, parcellation, regions, template }) => + from(this.sapi.getTranslatedLabelledNgMap(parcellation, template)).pipe( + map(record => { + + const regionmap = new Map<string, SxplrRegion>() + for (const r of regions) { + regionmap.set(r.name, r) + } + const returnVal: Record<string, Record<number, NgMapReturnType>> = {} + for (const [url, { layer, region }] of Object.entries(record)) { + + + for (const { name, label } of region) { + const actualRegion = regionmap.get(name) + if (!actualRegion) { + console.warn(`region with name ${name} cannot be found, skipping`) + continue + } + const ngId = getParcNgId(atlas, template, parcellation, actualRegion) + if (!returnVal[ngId]) { + returnVal[ngId] = {} + } + returnVal[ngId][label] = { + region: actualRegion, + layer + } + } + } + return returnVal + }) + ) + ) + ) + + + public completeNgIdNgSegLayerSpec$: Observable<Record<string, NgSegLayerSpec>> = this.#translatedNgMap.pipe( + map(val => { + const returnObj: Record<string, NgSegLayerSpec> = {} + for (const [ ngId, obj ] of Object.entries(val)) { + for (const [_label, layer] of Object.entries(obj)) { + returnObj[ngId] = layer.layer + } + } + return returnObj + }) + ) + + public completeNgIdLabelRegionMap$: Observable<Record<string, Record<number, SxplrRegion>>> = this.#translatedNgMap.pipe( + map(val => { + const returnObj: Record<string, Record<number, SxplrRegion>> = {} + for (const [ ngId, obj ] of Object.entries(val)) { + for (const [label, layer] of Object.entries(obj)) { + if (!returnObj[ngId]) { + returnObj[ngId] = {} + } + returnObj[ngId][label] = layer.region + } + } + return returnObj + }) + ) +} diff --git a/src/viewerModule/nehuba/config.service/index.ts b/src/viewerModule/nehuba/config.service/index.ts index 1d0fd0905..c4587bc97 100644 --- a/src/viewerModule/nehuba/config.service/index.ts +++ b/src/viewerModule/nehuba/config.service/index.ts @@ -7,10 +7,7 @@ export { NgSegLayerSpec, } from "./type" export { - getParcNgLayers, - getTmplAuxNgLayer, - getTmplNgLayer, - getNgLayersFromVolumesATP, + getParcNgId, getRegionLabelIndex, getNehubaConfig, diff --git a/src/viewerModule/nehuba/config.service/type.ts b/src/viewerModule/nehuba/config.service/type.ts index c8154dd44..ea17a3b69 100644 --- a/src/viewerModule/nehuba/config.service/type.ts +++ b/src/viewerModule/nehuba/config.service/type.ts @@ -96,13 +96,23 @@ interface _NehubaConfig { export type NehubaConfig = RecursivePartial<_NehubaConfig> +/** + * source MUST contain format, e.g. precomputed:// + */ export type NgLayerSpec = { source: string transform: number[][] + info?: { + voxel: [number, number, number] + real: [number, number, number] + } opacity?: number visible?: boolean } +/** + * source MUST contain format, e.g. precomputed:// + */ export type NgPrecompMeshSpec = { auxMeshes: { name: string @@ -110,6 +120,9 @@ export type NgPrecompMeshSpec = { }[] } & NgLayerSpec +/** + * source MUST contain format, e.g. precomputed:// + */ export type NgSegLayerSpec = { labelIndicies: number[] } & NgLayerSpec diff --git a/src/viewerModule/nehuba/config.service/util.ts b/src/viewerModule/nehuba/config.service/util.ts index 8f2b0de2d..62cfa5b05 100644 --- a/src/viewerModule/nehuba/config.service/util.ts +++ b/src/viewerModule/nehuba/config.service/util.ts @@ -1,17 +1,12 @@ -import { SapiParcellationModel, SapiSpaceModel, SapiAtlasModel, SapiRegionModel } from 'src/atlasComponents/sapi' -import { SapiVolumeModel, IDS } from 'src/atlasComponents/sapi' +import { SxplrAtlas, SxplrTemplate, SxplrParcellation, SxplrRegion } from "src/atlasComponents/sapi/type_sxplr" +import { IDS } from 'src/atlasComponents/sapi/constants' import { atlasSelection } from 'src/state' import { MultiDimMap } from 'src/util/fn' -import { ParcVolumeSpec } from "../store/util" import { NehubaConfig, NgConfig, RecursivePartial, - NgLayerSpec, - NgPrecompMeshSpec, - NgSegLayerSpec, } from "./type" - // fsaverage uses threesurfer, which, whilst do not use ngId, uses 'left' and 'right' as keys const fsAverageKeyVal = { [IDS.PARCELLATION.JBA29]: { @@ -160,33 +155,7 @@ const BACKCOMAP_KEY_DICT = { } -export function getTmplNgLayer(atlas: SapiAtlasModel, tmpl: SapiSpaceModel, spaceVolumes: SapiVolumeModel[]): Record<string, NgLayerSpec>{ - if (!atlas || !tmpl) return {} - const ngId = `_${MultiDimMap.GetKey(atlas["@id"], tmpl["@id"], "tmplImage")}` - const tmplImage = spaceVolumes.find(v => "neuroglancer/precomputed" in v.data.detail) - if (!tmplImage) return {} - return { - [ngId]: { - source: `precomputed://${tmplImage.data.url.replace(/^precomputed:\/\//, '')}`, - ...tmplImage.data.detail["neuroglancer/precomputed"] as NgLayerSpec - } - } -} - -export function getTmplAuxNgLayer(atlas: SapiAtlasModel, tmpl: SapiSpaceModel, spaceVolumes: SapiVolumeModel[]): Record<string, NgPrecompMeshSpec>{ - if (!atlas || !tmpl) return {} - const ngId = `_${MultiDimMap.GetKey(atlas["@id"], tmpl["@id"], "auxLayer")}` - const tmplImage = spaceVolumes.find(v => "neuroglancer/precompmesh" in v.data.detail) - if (!tmplImage) return {} - return { - [ngId]: { - source: `precompmesh://${tmplImage.data.url.replace(/^precompmesh:\/\//, '')}`, - ...tmplImage.data.detail["neuroglancer/precompmesh"] as NgPrecompMeshSpec - } - } -} - -export function getParcNgId(atlas: SapiAtlasModel, tmpl: SapiSpaceModel, parc: SapiParcellationModel, region: SapiRegionModel): string { +export function getParcNgId(atlas: SxplrAtlas, tmpl: SxplrTemplate, parc: SxplrParcellation, region: SxplrRegion): string { let laterality: string = "whole brain" if (region.name.indexOf("left") >= 0) laterality = "left hemisphere" @@ -195,77 +164,44 @@ export function getParcNgId(atlas: SapiAtlasModel, tmpl: SapiSpaceModel, parc: S /** * for JBA29 in big brain, there exist several volumes. (e.g. v1, v2, v5, interpolated, etc) */ - if (tmpl['@id'] === IDS.TEMPLATES.BIG_BRAIN && parc['@id'] === IDS.PARCELLATION.JBA29) { - laterality = region.hasAnnotation.visualizedIn?.['@id'] + if (tmpl.id === IDS.TEMPLATES.BIG_BRAIN && parc.id === IDS.PARCELLATION.JBA29) { + // laterality = region.hasAnnotation.visualizedIn?.['@id'] + throw new Error(`FIXME figure out what region.hasAnnotation id is`) } if (!laterality) { return null } - let ngId = BACKCOMAP_KEY_DICT[atlas["@id"]]?.[tmpl["@id"]]?.[parc["@id"]]?.[laterality] + let ngId = BACKCOMAP_KEY_DICT[atlas.id]?.[tmpl.id]?.[parc.id]?.[laterality] if (!ngId) { - ngId = `_${MultiDimMap.GetKey(atlas["@id"], tmpl["@id"], parc["@id"], laterality)}` + ngId = `_${MultiDimMap.GetKey(atlas.id, tmpl.id, parc.id, laterality)}` } return ngId } const labelIdxRegex = /siibra_python_ng_precomputed_labelindex:\/\/(.*?)#([0-9]+)$/ -export function getRegionLabelIndex(_atlas: SapiAtlasModel, _tmpl: SapiSpaceModel, _parc: SapiParcellationModel, region: SapiRegionModel): number { - const overwriteLabelIndex = region.hasAnnotation.inspiredBy.map(({ "@id": id }) => labelIdxRegex.exec(id)).filter(v => !!v) - if (overwriteLabelIndex.length > 0) { - const match = overwriteLabelIndex[0] - const volumeId = match[1] - const labelIndex = match[2] - const _labelIndex = Number(labelIndex) - if (!isNaN(_labelIndex)) return _labelIndex - } - const lblIdx = Number(region?.hasAnnotation?.internalIdentifier) - if (isNaN(lblIdx)) return null - return lblIdx -} - -export function getParcNgLayers(atlas: SapiAtlasModel, tmpl: SapiSpaceModel, parc: SapiParcellationModel, parcVolumes: { volume: SapiVolumeModel, volumeMetadata: ParcVolumeSpec }[]): Record<string, NgSegLayerSpec>{ - const returnVal: Record<string, NgSegLayerSpec> = {} - for (const parcVol of parcVolumes) { - if ("spy/volume/neuroglancer/precomputed" !== parcVol.volume['@type']) continue - const { volume, volumeMetadata } = parcVol - const { regions } = volumeMetadata - if (regions.length === 0) { - console.warn(`parc volume with no associated region`) - continue - } - const ngId = getParcNgId(atlas, tmpl, parc, regions[0].region) - - returnVal[ngId] = { - source: `precomputed://${volume.data.url.replace(/^precomputed:\/\//, '')}`, - transform: (volume.data.detail["neuroglancer/precomputed"] as any).transform, - labelIndicies: regions.map(v => v.labelIndex) - } - } - return returnVal -} - -type CongregatedVolume = { - tmplVolumes: SapiVolumeModel[] - tmplAuxMeshVolumes: SapiVolumeModel[] - parcVolumes: { volume: SapiVolumeModel, volumeMetadata: ParcVolumeSpec}[] -} - -export const getNgLayersFromVolumesATP = (volumes: CongregatedVolume, ATP: { atlas: SapiAtlasModel, template: SapiSpaceModel, parcellation: SapiParcellationModel }): { - tmplNgLayers: Record<string, NgLayerSpec> - tmplAuxNgLayers: Record<string, NgPrecompMeshSpec> - parcNgLayers: Record<string, NgSegLayerSpec> -} => { - - const { tmplVolumes, tmplAuxMeshVolumes, parcVolumes } = volumes - const { atlas, template, parcellation } = ATP - return { - tmplNgLayers: getTmplNgLayer(atlas, template, tmplVolumes), - tmplAuxNgLayers: getTmplAuxNgLayer(atlas, template, tmplAuxMeshVolumes), - parcNgLayers: getParcNgLayers(atlas, template, parcellation, parcVolumes) - } +/** + * @deprecated + * @param _atlas + * @param tmpl + * @param parc + * @param region + */ +export function getRegionLabelIndex(_atlas: SxplrAtlas, tmpl: SxplrTemplate, parc: SxplrParcellation, region: SxplrRegion): number { + throw new Error(`TODO fix me`) + // const overwriteLabelIndex = region.hasAnnotation.inspiredBy.map(({ "@id": id }) => labelIdxRegex.exec(id)).filter(v => !!v) + // if (overwriteLabelIndex.length > 0) { + // const match = overwriteLabelIndex[0] + // const volumeId = match[1] + // const labelIndex = match[2] + // const _labelIndex = Number(labelIndex) + // if (!isNaN(_labelIndex)) return _labelIndex + // } + // const lblIdx = Number(region?.hasAnnotation?.internalIdentifier) + // if (isNaN(lblIdx)) return null + // return lblIdx } export const defaultNehubaConfig: NehubaConfig = { @@ -362,7 +298,7 @@ export const spaceMiscInfoMap = new Map([ }], ]) -export function getNehubaConfig(space: SapiSpaceModel): NehubaConfig { +export function getNehubaConfig(space: SxplrTemplate): NehubaConfig { const darkTheme = space["@id"] !== "minds/core/referencespace/v1.0.0/a1655b99-82f1-420f-a3c2-fe80fd4c8588" const { scale } = spaceMiscInfoMap.get(space["@id"]) || { scale: 1 } diff --git a/src/viewerModule/nehuba/layerCtrl.service/layerCtrl.effects.ts b/src/viewerModule/nehuba/layerCtrl.service/layerCtrl.effects.ts index c052d1109..973b7d4d3 100644 --- a/src/viewerModule/nehuba/layerCtrl.service/layerCtrl.effects.ts +++ b/src/viewerModule/nehuba/layerCtrl.service/layerCtrl.effects.ts @@ -1,20 +1,38 @@ import { Injectable } from "@angular/core"; import { createEffect } from "@ngrx/effects"; import { select, Store } from "@ngrx/store"; -import { forkJoin, of } from "rxjs"; +import { forkJoin, from, of } from "rxjs"; import { mapTo, switchMap, withLatestFrom, filter, catchError, map, debounceTime, shareReplay, distinctUntilChanged, startWith, pairwise, tap } from "rxjs/operators"; -import { SAPI, SapiAtlasModel, SapiFeatureModel, SapiParcellationModel, SapiSpaceModel, SapiRegionModel } from "src/atlasComponents/sapi"; -import { SapiVOIDataResponse, SapiVolumeModel } from "src/atlasComponents/sapi/type"; +import { NgSegLayerSpec, SxplrAtlas, SxplrParcellation, SxplrTemplate } from "src/atlasComponents/sapi/type_sxplr"; +import { SAPI } from "src/atlasComponents/sapi" +import { + SapiFeatureModel, + SapiSpatialFeatureModel, +} from "src/atlasComponents/sapi/type_v3"; +import { translateV3Entities } from "src/atlasComponents/sapi/translate_v3" import { atlasAppearance, atlasSelection, userInteraction } from "src/state"; import { arrayEqual } from "src/util/array"; import { EnumColorMapName } from "src/util/colorMaps"; import { getShader } from "src/util/constants"; -import { getNgLayersFromVolumesATP, getRegionLabelIndex } from "../config.service"; -import { ParcVolumeSpec } from "../store/util"; import { PMAP_LAYER_NAME } from "../constants"; +import { QuickHash } from "src/util/fn"; +import { BaseService } from "../base.service/base.service"; +import { getParcNgId } from "../config.service"; @Injectable() export class LayerCtrlEffects { + static TransformVolumeModel(volumeModel: SapiSpatialFeatureModel['volume']): atlasAppearance.NgLayerCustomLayer[] { + /** + * TODO implement + */ + throw new Error(`IMPLEMENT ME`) + for (const volumeFormat in volumeModel.providedVolumes) { + + } + + return [] + } + onRegionSelectClearPmapLayer = createEffect(() => this.store.pipe( select(atlasSelection.selectors.selectedRegions), distinctUntilChanged( @@ -67,44 +85,26 @@ export class LayerCtrlEffects { onATP$ = this.store.pipe( atlasSelection.fromRootStore.distinctATP(), - map(val => val as { atlas: SapiAtlasModel, parcellation: SapiParcellationModel, template: SapiSpaceModel }), + map(val => val as { atlas: SxplrAtlas, parcellation: SxplrParcellation, template: SxplrTemplate }), ) onShownFeature = createEffect(() => this.store.pipe( select(userInteraction.selectors.selectedFeature), startWith(null as SapiFeatureModel), - pairwise(), + pairwise<SapiFeatureModel>(), map(([ prev, curr ]) => { const removeLayers: atlasAppearance.NgLayerCustomLayer[] = [] const addLayers: atlasAppearance.NgLayerCustomLayer[] = [] - if (prev?.["@type"] === "siibra/features/voi") { + if (prev?.["@type"].includes("feature/volume_of_interest")) { + const prevVoi = prev as SapiSpatialFeatureModel removeLayers.push( - ...(prev as SapiVOIDataResponse).volumes.map(v => { - return { - id: v.metadata.fullName, - clType: "customlayer/nglayer", - source: v.data.url, - transform: v.data.detail['neuroglancer/precomputed']['transform'], - opacity: 1.0, - visible: true, - shader: v.data.detail['neuroglancer/precomputed']['shader'] || getShader() - } as atlasAppearance.NgLayerCustomLayer - }) + ...LayerCtrlEffects.TransformVolumeModel(prevVoi.volume) ) } - if (curr?.["@type"] === "siibra/features/voi") { + if (curr?.["@type"].includes("feature/volume_of_interest")) { + const currVoi = curr as SapiSpatialFeatureModel addLayers.push( - ...(curr as SapiVOIDataResponse).volumes.map(v => { - return { - id: v.metadata.fullName, - clType: "customlayer/nglayer", - source: `precomputed://${v.data.url}`, - transform: v.data.detail['neuroglancer/precomputed']['transform'], - opacity: v.data.detail['neuroglancer/precomputed']['opacity'] || 1.0, - visible: true, - shader: v.data.detail['neuroglancer/precomputed']['shader'] || getShader() - } as atlasAppearance.NgLayerCustomLayer - }) + ...LayerCtrlEffects.TransformVolumeModel(currVoi.volume) ) } return { removeLayers, addLayers } @@ -143,155 +143,47 @@ export class LayerCtrlEffects { ) )) - private getNgLayers(atlas: SapiAtlasModel, parcellation: SapiParcellationModel, template: SapiSpaceModel){ - - if (!!parcellation && !template) { - throw new Error(`parcellation defined, but template not defined!`) - } - - /** - * some labelled maps (such as julich brain in big brain) do not have the volumes defined on the parcellation level. - * While we have the URLs of these volumes (the method we use is also kind of hacky), and in theory, we could construct a volume object directly - * It is probably better to fetch the correct volume object to begin with - */ - const parcVolumes$ = !parcellation - ? of([] as {volume: SapiVolumeModel, volumeMetadata: ParcVolumeSpec}[]) - : forkJoin([ - this.sapi.getParcellation(atlas["@id"], parcellation["@id"]).getRegions(template["@id"]).pipe( - map(regions => { - - const volumeIdToRegionMap = new Map<string, { - labelIndex: number - region: SapiRegionModel - }[]>() - - for (const r of regions) { - const volumeId = r?.hasAnnotation?.visualizedIn?.["@id"] - if (!volumeId) continue - - const labelIndex = getRegionLabelIndex(atlas, template, parcellation, r) - if (!labelIndex) continue - - if (!volumeIdToRegionMap.has(volumeId)) { - volumeIdToRegionMap.set(volumeId, []) - } - volumeIdToRegionMap.get(volumeId).push({ - labelIndex, - region: r - }) + onATPDebounceNgLayers$ = this.onATP$.pipe( + debounceTime(16), + switchMap(({ atlas, template, parcellation }) => + forkJoin({ + tmplNgLayers: this.sapi.getVoxelTemplateImage(template).pipe( + map(templateImages => { + const returnObj = {} + for (const img of templateImages) { + returnObj[QuickHash.GetHash(img.source)] = img } - return volumeIdToRegionMap + return returnObj }) ), - this.sapi.getParcellation(atlas["@id"], parcellation["@id"]).getVolumes() - ]).pipe( - switchMap(([ volumeIdToRegionMap, volumes ]) => { - const missingVolumeIds = Array.from(volumeIdToRegionMap.keys()).filter(id => volumes.map(v => v["@id"]).indexOf(id) < 0) - - const volumesFromParc: {volume: SapiVolumeModel, volumeMetadata: ParcVolumeSpec}[] = volumes.map( - volume => { - const found = volumeIdToRegionMap.get(volume["@id"]) - if (!found) return null - - try { - - const volumeMetadata: ParcVolumeSpec = { - regions: found, - parcellation, - volumeSrc: volume.data.url - } - return { - volume, - volumeMetadata, - } - } catch (e) { - console.error(e) - return null - } + tmplAuxNgLayers: this.sapi.getVoxelAuxMesh(template).pipe( + map(auxMeshes => { + const returnObj = {} + for (const img of auxMeshes) { + returnObj[QuickHash.GetHash(`${img.source}_auxMesh`)] = img } - ).filter(v => v?.volumeMetadata?.regions) - - if (missingVolumeIds.length === 0) return of([...volumesFromParc]) - return forkJoin( - missingVolumeIds.map(missingId => { - if (!volumeIdToRegionMap.has(missingId)) { - console.warn(`volumeIdToRegionMap does not have volume with id ${missingId}`) - return of(null as SapiVolumeModel) - } - const { region } = volumeIdToRegionMap.get(missingId)[0] - return this.sapi.getRegion(atlas["@id"], parcellation["@id"], region.name).getVolumeInstance(missingId).pipe( - catchError((err, obs) => of(null as SapiVolumeModel)) - ) - }) - ).pipe( - map((missingVolumes: SapiVolumeModel[]) => { - - const volumesFromRegion: { volume: SapiVolumeModel, volumeMetadata: ParcVolumeSpec }[] = missingVolumes.map( - volume => { - if (!volume || !volumeIdToRegionMap.has(volume['@id'])) { - return null - } - - try { - - const found = volumeIdToRegionMap.get(volume['@id']) - const volumeMetadata: ParcVolumeSpec = { - regions: found, - parcellation, - volumeSrc: volume.data.url - } - return { - volume, - volumeMetadata - } - } catch (e) { - console.error(`volume from region error`, e) - return null - } - } - ).filter( - v => !!v - ) - - return [ - ...volumesFromParc, - ...volumesFromRegion - ] - }) - ) - }) - ) - - const spaceVols$ = !!template - ? this.sapi.getSpace(atlas["@id"], template["@id"]).getVolumes().pipe( - shareReplay(1), - ) - : of([] as SapiVolumeModel[]) - - return forkJoin({ - tmplVolumes: spaceVols$.pipe( - map( - volumes => volumes.filter(vol => "neuroglancer/precomputed" in vol.data.detail) - ), - ), - tmplAuxMeshVolumes: spaceVols$.pipe( - map( - volumes => volumes.filter(vol => "neuroglancer/precompmesh" in vol.data.detail) + return returnObj + }) ), - ), - parcVolumes: parcVolumes$.pipe( - ) - }) - } - - onATPDebounceNgLayers$ = this.onATP$.pipe( - debounceTime(16), - switchMap(({ atlas, parcellation, template }) => { - return this.getNgLayers(atlas, parcellation, template).pipe( - map(volumes => getNgLayersFromVolumesATP(volumes, { atlas, parcellation, template })) - ) - }), - shareReplay(1) + parcNgLayers: from(this.sapi.getTranslatedLabelledNgMap(parcellation, template)).pipe( + map(val => { + const returnVal: Record<string, NgSegLayerSpec> = {} + for (const [ url, { layer, region } ] of Object.entries(val)) { + const { name } = region[0] + const ngId = getParcNgId(atlas, template, parcellation, { + id: '', + name, + parentIds: [] + }) + returnVal[ngId] = layer + continue + } + return returnVal + }) + ) + }) + ), + shareReplay(1), ) onATPDebounceAddBaseLayers$ = createEffect(() => this.onATPDebounceNgLayers$.pipe( @@ -322,5 +214,9 @@ export class LayerCtrlEffects { }) )) - constructor(private store: Store<any>,private sapi: SAPI){} + constructor( + private store: Store<any>, + private sapi: SAPI, + private baseService: BaseService, + ){} } \ No newline at end of file diff --git a/src/viewerModule/nehuba/layerCtrl.service/layerCtrl.service.ts b/src/viewerModule/nehuba/layerCtrl.service/layerCtrl.service.ts index da9855ecb..0281479fb 100644 --- a/src/viewerModule/nehuba/layerCtrl.service/layerCtrl.service.ts +++ b/src/viewerModule/nehuba/layerCtrl.service/layerCtrl.service.ts @@ -1,21 +1,20 @@ import { Injectable, OnDestroy } from "@angular/core"; import { select, Store } from "@ngrx/store"; -import { combineLatest, merge, Observable, Subject, Subscription } from "rxjs"; +import { combineLatest, from, merge, Observable, Subject, Subscription } from "rxjs"; import { debounceTime, distinctUntilChanged, filter, map, pairwise, shareReplay, startWith, switchMap, withLatestFrom } from "rxjs/operators"; import { IColorMap, INgLayerCtrl, TNgLayerCtrl } from "./layerCtrl.util"; -import { SAPIRegion } from "src/atlasComponents/sapi/core"; import { getParcNgId } from "../config.service" -import { getRegionLabelIndex } from "../config.service/util"; import { annotation, atlasAppearance, atlasSelection } from "src/state"; import { serializeSegment } from "../util"; import { LayerCtrlEffects } from "./layerCtrl.effects"; import { arrayEqual } from "src/util/array"; import { ColorMapCustomLayer } from "src/state/atlasAppearance"; -import { SapiRegionModel } from "src/atlasComponents/sapi"; +import { SxplrRegion } from "src/atlasComponents/sapi/type_sxplr"; import { AnnotationLayer } from "src/atlasComponents/annotations"; import { PMAP_LAYER_NAME } from "../constants" -import { EnumColorMapName, mapKeyColorMap } from "src/util/colorMaps"; import { getShader } from "src/util/constants"; +import { SAPI } from "src/atlasComponents/sapi"; +import { BaseService } from "../base.service/base.service"; export const BACKUP_COLOR = { red: 255, @@ -36,34 +35,24 @@ export class NehubaLayerControlService implements OnDestroy{ private defaultNgLayers$ = this.layerEffects.onATPDebounceNgLayers$ - private selectedATP$ = this.store$.pipe( - atlasSelection.fromRootStore.distinctATP(), - shareReplay(1), - ) + private selectedATP$ = this.baseService.selectedATP$ - public selectedATPR$ = this.selectedATP$.pipe( - switchMap(({ atlas, template, parcellation }) => - this.store$.pipe( - select(atlasSelection.selectors.selectedParcAllRegions), - map(regions => ({ - atlas, template, parcellation, regions - })), - shareReplay(1) - ) - ) - ) + public selectedATPR$ = this.baseService.selectedATPR$ private customLayers$ = this.store$.pipe( select(atlasAppearance.selectors.customLayers), distinctUntilChanged(arrayEqual((o, n) => o.id === n.id)), shareReplay(1) ) + + public completeNgIdLabelRegionMap$ = this.baseService.completeNgIdLabelRegionMap$ + private activeColorMap$ = combineLatest([ combineLatest([ - this.selectedATPR$, + this.completeNgIdLabelRegionMap$, this.customLayers$, ]).pipe( - map(([{ atlas, parcellation, regions, template }, layers]) => { + map(([record, layers]) => { const returnVal: IColorMap = {} const cmCustomLayers = layers.filter(l => l.clType === "customlayer/colormap") as ColorMapCustomLayer[] @@ -85,25 +74,19 @@ export class NehubaLayerControlService implements OnDestroy{ set: () => { throw new Error(`cannot set`) }, - get: (r: SapiRegionModel) => SAPIRegion.GetDisplayColor(r) + get: (r: SxplrRegion) => r.color } })() - for (const r of regions) { - - if (!r.hasAnnotation) continue - if (!r.hasAnnotation.visualizedIn) continue - - const ngId = getParcNgId(atlas, template, parcellation, r) - const labelIndex = getRegionLabelIndex(atlas, template, parcellation, r) - if (!labelIndex) continue - - const [ red, green, blue ] = useCm.get(r) - - if (!returnVal[ngId]) { - returnVal[ngId] = {} + for (const [ngId, labelRecord] of Object.entries(record)) { + for (const [label, region] of Object.entries(labelRecord)) { + if (!region.color) continue + const [ red, green, blue ] = useCm.get(region) + if (!returnVal[ngId]) { + returnVal[ngId] = {} + } + returnVal[ngId][label] = { red, green, blue } } - returnVal[ngId][labelIndex] = { red, green, blue } } return returnVal }) @@ -140,6 +123,7 @@ export class NehubaLayerControlService implements OnDestroy{ constructor( private store$: Store<any>, private layerEffects: LayerCtrlEffects, + private baseService: BaseService, ){ this.sub.push( @@ -248,8 +232,8 @@ export class NehubaLayerControlService implements OnDestroy{ map(layers => layers.filter(l => l.clType === "customlayer/nglayer").length > 0), ), ]).pipe( - withLatestFrom(this.selectedATPR$), - map(([[ selectedRegions, customMapExists, nonmixableLayerExists ], { atlas, parcellation, template, regions }]) => { + withLatestFrom(this.completeNgIdLabelRegionMap$), + map(([[ selectedRegions, customMapExists, nonmixableLayerExists ], completeNgIdLabelRegion]) => { /** * if non mixable layer exist (e.g. pmap) * and no custom color map exist @@ -263,15 +247,17 @@ export class NehubaLayerControlService implements OnDestroy{ * if custom map exists, roi is all regions * otherwise, roi is only selectedRegions */ - const roi = customMapExists ? regions : selectedRegions - - const roiIndexSet = new Set<string>( - roi.map(r => { - const ngId = getParcNgId(atlas, template, parcellation, r) - const label = getRegionLabelIndex(atlas, template, parcellation, r) - return ngId && label && serializeSegment(ngId, label) - }).filter(v => !!v) - ) + const selectedRegionNameSet = new Set(selectedRegions.map(r => r.name)) + const roiIndexSet = new Set<string>() + for (const ngId in completeNgIdLabelRegion) { + for (const label in completeNgIdLabelRegion[ngId]) { + const val = completeNgIdLabelRegion[ngId][label] + if (!customMapExists && !selectedRegionNameSet.has(val.name)) { + continue + } + roiIndexSet.add(serializeSegment(ngId, label)) + } + } if (roiIndexSet.size > 0) { return [...roiIndexSet] } else { diff --git a/src/viewerModule/nehuba/mesh.service/mesh.service.ts b/src/viewerModule/nehuba/mesh.service/mesh.service.ts index d372ce460..4ad0dbf18 100644 --- a/src/viewerModule/nehuba/mesh.service/mesh.service.ts +++ b/src/viewerModule/nehuba/mesh.service/mesh.service.ts @@ -1,13 +1,13 @@ import { Injectable, OnDestroy } from "@angular/core"; import { select, Store } from "@ngrx/store"; import { combineLatest, merge, Observable, of } from "rxjs"; -import { map, switchMap } from "rxjs/operators"; +import { map, switchMap, tap } from "rxjs/operators"; import { IMeshesToLoad } from '../constants' import { selectorAuxMeshes } from "../store"; import { LayerCtrlEffects } from "../layerCtrl.service/layerCtrl.effects"; import { atlasSelection } from "src/state"; import { Tree } from "src/components/flatHierarchy/treeView/treeControl" -import { getParcNgId, getRegionLabelIndex } from "../config.service"; +import { BaseService } from "../base.service/base.service"; /** * control mesh loading etc @@ -21,6 +21,7 @@ export class NehubaMeshService implements OnDestroy { constructor( private store$: Store<any>, private effect: LayerCtrlEffects, + private baseService: BaseService, ){ } @@ -30,66 +31,44 @@ export class NehubaMeshService implements OnDestroy { public auxMeshes$ = this.effect.onATPDebounceNgLayers$.pipe( - map(({ tmplAuxNgLayers }) => tmplAuxNgLayers) + map(({ tmplAuxNgLayers }) => tmplAuxNgLayers), + tap(v => console.log('mesh.service', v)) ) public loadMeshes$: Observable<IMeshesToLoad> = merge( combineLatest([ - this.store$.pipe( - atlasSelection.fromRootStore.distinctATP(), - ), + this.baseService.completeNgIdLabelRegionMap$, this.store$.pipe( select(atlasSelection.selectors.selectedParcAllRegions), ), this.store$.pipe( select(atlasSelection.selectors.selectedRegions), - ) + ), + ]).pipe( - switchMap(([{ atlas, template, parcellation }, regions, selectedRegions]) => { + switchMap(([record, regions, selectedRegions]) => { const ngIdRecord: Record<string, number[]> = {} const tree = new Tree( regions, - (c, p) => (c.hasParent || []).some(_p => _p["@id"] === p["@id"]) + (c, p) => (c.parentIds.some( id => p.id === id)) ) + + const selectedRegionFlag = selectedRegions.length > 0 + const selectedRegionNameSet = new Set(selectedRegions.map(r => r.name)) - for (const r of regions) { - const regionLabelIndex = getRegionLabelIndex( atlas, template, parcellation, r ) - if (!regionLabelIndex) { - continue - } - if ( - tree.someAncestor(r, anc => !!getRegionLabelIndex(atlas, template, parcellation, anc)) - ) { - continue - } - const ngId = getParcNgId(atlas, template, parcellation, r) - if (!ngIdRecord[ngId]) { - ngIdRecord[ngId] = [] - } - ngIdRecord[ngId].push(regionLabelIndex) - } - - if (selectedRegions.length > 0) { - /** - * If regions are selected, reset the meshes - */ - for (const key in ngIdRecord) { - ngIdRecord[key] = [] - } - - /** - * only show selected region - */ - for (const r of selectedRegions) { - const ngId = getParcNgId(atlas, template, parcellation, r) - const regionLabelIndex = getRegionLabelIndex( atlas, template, parcellation, r ) + for (const [ngId, labelToRegion] of Object.entries(record)) { + for (const [label, region] of Object.entries(labelToRegion)) { + if (selectedRegionFlag && !selectedRegionNameSet.has(region.name)) { + continue + } if (!ngIdRecord[ngId]) { ngIdRecord[ngId] = [] } - ngIdRecord[ngId].push(regionLabelIndex) + ngIdRecord[ngId].push(Number(label)) } } + const arr: IMeshesToLoad[] = [] for (const ngId in ngIdRecord) { diff --git a/src/viewerModule/nehuba/nehubaViewer/nehubaViewer.component.ts b/src/viewerModule/nehuba/nehubaViewer/nehubaViewer.component.ts index 465d31449..10d7ba686 100644 --- a/src/viewerModule/nehuba/nehubaViewer/nehubaViewer.component.ts +++ b/src/viewerModule/nehuba/nehubaViewer/nehubaViewer.component.ts @@ -147,7 +147,6 @@ export class NehubaViewerUnit implements OnDestroy { if (this.nehubaViewer$) { this.nehubaViewer$.next(this) } - getImportNehubaPr() .then(() => { this.nehubaLoaded = true diff --git a/src/viewerModule/nehuba/nehubaViewerGlue/nehubaViewerGlue.component.ts b/src/viewerModule/nehuba/nehubaViewerGlue/nehubaViewerGlue.component.ts index e570bcd5f..10d71071e 100644 --- a/src/viewerModule/nehuba/nehubaViewerGlue/nehubaViewerGlue.component.ts +++ b/src/viewerModule/nehuba/nehubaViewerGlue/nehubaViewerGlue.component.ts @@ -6,7 +6,7 @@ import { IViewer, TViewerEvent } from "../../viewer.interface"; import { NehubaMeshService } from "../mesh.service"; import { NehubaLayerControlService, SET_COLORMAP_OBS, SET_LAYER_VISIBILITY } from "../layerCtrl.service"; import { NG_LAYER_CONTROL, SET_SEGMENT_VISIBILITY } from "../layerCtrl.service/layerCtrl.util"; -import { SapiRegionModel } from "src/atlasComponents/sapi"; +import { SxplrRegion } from "src/atlasComponents/sapi/type_sxplr"; import { NehubaConfig } from "../config.service"; import { SET_MESHES_TO_LOAD } from "../constants"; import { atlasSelection, userInteraction } from "src/state"; @@ -54,7 +54,7 @@ import { atlasSelection, userInteraction } from "src/state"; export class NehubaGlueCmp implements IViewer<'nehuba'>, OnDestroy { - private onhoverSegments: SapiRegionModel[] = [] + private onhoverSegments: SxplrRegion[] = [] private onDestroyCb: (() => void)[] = [] public nehubaConfig: NehubaConfig diff --git a/src/viewerModule/nehuba/nehubaViewerInterface/nehubaViewerContainer.component.ts b/src/viewerModule/nehuba/nehubaViewerInterface/nehubaViewerContainer.component.ts index f4ad7e411..f3c063b51 100644 --- a/src/viewerModule/nehuba/nehubaViewerInterface/nehubaViewerContainer.component.ts +++ b/src/viewerModule/nehuba/nehubaViewerInterface/nehubaViewerContainer.component.ts @@ -1,13 +1,12 @@ import { AfterViewInit, Component, EventEmitter, OnDestroy, Output, ViewChild } from "@angular/core"; -import { concat, Observable, of, Subscription } from "rxjs"; -import { map, withLatestFrom } from "rxjs/operators"; -import { SapiRegionModel } from "src/atlasComponents/sapi"; +import { concat, of, Subscription } from "rxjs"; +import { withLatestFrom } from "rxjs/operators"; import { EnumViewerEvt, TViewerEvent } from "../../viewer.interface"; import { NehubaLayerControlService } from "../layerCtrl.service"; import { NehubaViewerContainerDirective } from "./nehubaViewerInterface.directive"; -import { getParcNgId, getRegionLabelIndex } from "../config.service"; import { Store } from "@ngrx/store"; import { atlasSelection } from "src/state"; +import { SAPI } from "src/atlasComponents/sapi"; @Component({ selector: `sxplr-nehuba-viewer-container`, @@ -47,26 +46,29 @@ export class NehubaViewerContainer implements AfterViewInit, OnDestroy { }), concat( - of(null), + of('start' as const), mouseOverSegments ).pipe( withLatestFrom( - this.multiNgIdsRegionsLabelMap$ + this.layerCtrlService.completeNgIdLabelRegionMap$ ) ).subscribe(([seg, multiNgIdsRegionsLabelIndexMap]) => { + const isStart = seg === "start" this.viewerEvent.emit({ type: EnumViewerEvt.VIEWER_CTX, data: { viewerType: 'nehuba', payload: { - nehuba: seg && seg.map(v => { + nehuba: isStart + ? [] + : seg.map(v => { return { layerName: v.layer.name, labelIndices: [ Number(v.segmentId) ], regions: (() => { - const map = multiNgIdsRegionsLabelIndexMap.get(v.layer.name) - if (!map) return [] - return [map.get(Number(v.segmentId))] + const record = multiNgIdsRegionsLabelIndexMap[v.layer.name] || {} + if (!record) return [] + return [record[Number(v.segmentId)]] })() } }) @@ -117,23 +119,6 @@ export class NehubaViewerContainer implements AfterViewInit, OnDestroy { @ViewChild(NehubaViewerContainerDirective, { static: true }) private nehubaContainerDirective: NehubaViewerContainerDirective - private multiNgIdsRegionsLabelMap$: Observable<Map<string, Map<number, SapiRegionModel>>> = this.layerCtrlService.selectedATPR$.pipe( - map(( { atlas, parcellation, template, regions } ) => { - - const retMap = new Map<string, Map<number, SapiRegionModel>>() - for (const r of regions) { - const ngId = getParcNgId(atlas, template, parcellation, r) - if (!ngId) continue - if (!retMap.has(ngId)) { - retMap.set(ngId, new Map()) - } - const labelIndex = getRegionLabelIndex(atlas, template, parcellation, r) - if (!labelIndex) continue - retMap.get(ngId).set(labelIndex, r) - } - return retMap - }) - ) private subscriptions: Subscription[] = [] } diff --git a/src/viewerModule/nehuba/nehubaViewerInterface/nehubaViewerInterface.directive.ts b/src/viewerModule/nehuba/nehubaViewerInterface/nehubaViewerInterface.directive.ts index 0b7f185aa..baa371a0a 100644 --- a/src/viewerModule/nehuba/nehubaViewerInterface/nehubaViewerInterface.directive.ts +++ b/src/viewerModule/nehuba/nehubaViewerInterface/nehubaViewerInterface.directive.ts @@ -2,14 +2,14 @@ import { Directive, ViewContainerRef, ComponentRef, OnDestroy, Output, EventEmit import { NehubaViewerUnit } from "../nehubaViewer/nehubaViewer.component"; import { Store, select } from "@ngrx/store"; import { Subscription, Observable, asyncScheduler, combineLatest } from "rxjs"; -import { distinctUntilChanged, filter, debounceTime, scan, map, throttleTime, switchMap, take } from "rxjs/operators"; +import { distinctUntilChanged, filter, debounceTime, scan, map, throttleTime, switchMap, take, tap } from "rxjs/operators"; import { serializeSegment } from "../util"; import { LoggingService } from "src/logging"; import { arrayOfPrimitiveEqual } from 'src/util/fn' import { INavObj, NehubaNavigationService } from "../navigation.service"; import { NehubaConfig, defaultNehubaConfig, getNehubaConfig } from "../config.service"; import { atlasAppearance, atlasSelection, userPreference } from "src/state"; -import { SapiAtlasModel, SapiParcellationModel, SapiSpaceModel } from "src/atlasComponents/sapi"; +import { SxplrAtlas, SxplrParcellation, SxplrTemplate } from "src/atlasComponents/sapi/type_sxplr"; import { NgLayerCustomLayer } from "src/state/atlasAppearance"; import { arrayEqual } from "src/util/array"; import { cvtNavigationObjToNehubaConfig } from "../config.service/util"; @@ -175,7 +175,7 @@ export class NehubaViewerContainerDirective implements OnDestroy{ this.store$.pipe( atlasSelection.fromRootStore.distinctATP(), debounceTime(16), - switchMap((ATP: { atlas: SapiAtlasModel, parcellation: SapiParcellationModel, template: SapiSpaceModel }) => this.store$.pipe( + switchMap((ATP: { atlas: SxplrAtlas, parcellation: SxplrParcellation, template: SxplrTemplate }) => this.store$.pipe( select(atlasAppearance.selectors.customLayers), debounceTime(16), map(cl => cl.filter(l => l.clType === "baselayer/nglayer") as NgLayerCustomLayer[]), diff --git a/src/viewerModule/nehuba/statusCard/statusCard.component.ts b/src/viewerModule/nehuba/statusCard/statusCard.component.ts index c658f2c65..50fa2c0fa 100644 --- a/src/viewerModule/nehuba/statusCard/statusCard.component.ts +++ b/src/viewerModule/nehuba/statusCard/statusCard.component.ts @@ -21,7 +21,7 @@ import { NEHUBA_INSTANCE_INJTKN } from '../util' import { IQuickTourData } from "src/ui/quickTour/constrants"; import { actions } from "src/state/atlasSelection"; import { atlasSelection } from "src/state"; -import { SapiSpaceModel } from "src/atlasComponents/sapi"; +import { SxplrTemplate } from "src/atlasComponents/sapi/type_sxplr"; import { getNehubaConfig } from "../config.service"; @Component({ @@ -45,7 +45,7 @@ export class StatusCardComponent implements OnInit, OnChanges{ public arialabel = ARIA_LABELS.STATUS_PANEL public showFull = false - private selectedTemplate: SapiSpaceModel + private selectedTemplate: SxplrTemplate private currentNavigation: any private subscriptions: Subscription[] = [] diff --git a/src/viewerModule/nehuba/types.ts b/src/viewerModule/nehuba/types.ts index 6fd0dddab..f61a467b3 100644 --- a/src/viewerModule/nehuba/types.ts +++ b/src/viewerModule/nehuba/types.ts @@ -1,4 +1,4 @@ -import { SapiRegionModel } from "src/atlasComponents/sapi"; +import { SxplrRegion } from "src/atlasComponents/sapi/type_sxplr"; import { INavObj } from "./navigation.service"; export type TNehubaContextInfo = { @@ -10,6 +10,6 @@ export type TNehubaContextInfo = { nehuba: { layerName: string labelIndices: number[] - regions: SapiRegionModel[] + regions: SxplrRegion[] }[] } diff --git a/src/viewerModule/nehuba/viewerCtrl/perspectiveViewSlider/perspectiveViewSlider.component.ts b/src/viewerModule/nehuba/viewerCtrl/perspectiveViewSlider/perspectiveViewSlider.component.ts index 56a362190..721a27550 100644 --- a/src/viewerModule/nehuba/viewerCtrl/perspectiveViewSlider/perspectiveViewSlider.component.ts +++ b/src/viewerModule/nehuba/viewerCtrl/perspectiveViewSlider/perspectiveViewSlider.component.ts @@ -1,9 +1,10 @@ import { Component, OnDestroy, Inject, ViewChild, ChangeDetectionStrategy } from "@angular/core"; import { FormControl } from "@angular/forms"; import { select, Store } from "@ngrx/store"; -import { combineLatest, concat, NEVER, Observable, of, Subject, Subscription } from "rxjs"; +import { combineLatest, concat, forkJoin, NEVER, Observable, of, Subject, Subscription, throwError } from "rxjs"; import { switchMap, distinctUntilChanged, map, debounceTime, shareReplay, take, withLatestFrom } from "rxjs/operators"; -import { SAPI, SapiSpaceModel } from "src/atlasComponents/sapi"; +import { SAPI } from "src/atlasComponents/sapi"; +import { SxplrTemplate } from "src/atlasComponents/sapi/type_sxplr" import { fromRootStore } from "src/state/atlasSelection"; import { selectedTemplate } from "src/state/atlasSelection/selectors"; import { panelMode, panelOrder } from "src/state/userInterface/selectors"; @@ -147,9 +148,21 @@ export class PerspectiveViewSlider implements OnDestroy { private currentTemplateSize$ = this.store$.pipe( fromRootStore.distinctATP(), - switchMap(({ atlas, template }) => - atlas && template - ? this.sapi.getSpace(atlas['@id'], template['@id']).getTemplateSize() + switchMap(({ template }) => + template + ? this.sapi.getVoxelTemplateImage(template).pipe( + map(defaultImage => { + if (defaultImage.length == 0) { + const errMsg = `template ${template.name} has no ng volume` + throw new Error(errMsg) + } + const img = defaultImage[0] + return { + ...img.info || {}, + transform: img.transform + } + }) + ) : NEVER), ) @@ -394,8 +407,8 @@ const viewToSuffix = { [EnumClassicalView.CORONAL]: 'coronal', } -function getScreenshotUrl(space: SapiSpaceModel, requestedView: EnumClassicalView): string { - const prefix = spaceIdToPrefix[space?.['@id']] +function getScreenshotUrl(space: SxplrTemplate, requestedView: EnumClassicalView): string { + const prefix = spaceIdToPrefix[space?.id] if (!prefix) return null const suffix = viewToSuffix[requestedView] if (!suffix) return null diff --git a/src/viewerModule/threeSurfer/store/actions.ts b/src/viewerModule/threeSurfer/store/actions.ts index 613fcbbfc..90d736a27 100644 --- a/src/viewerModule/threeSurfer/store/actions.ts +++ b/src/viewerModule/threeSurfer/store/actions.ts @@ -1,9 +1,9 @@ import { createAction, props } from "@ngrx/store"; import { nameSpace } from "./const" -export const selectVolumeById = createAction( - `${nameSpace} selectVolumeById`, +export const selectSurfaceVariant = createAction( + `${nameSpace} selectSurfaceVariant`, props<{ - id: string + variant: string }>() ) diff --git a/src/viewerModule/threeSurfer/store/effects.ts b/src/viewerModule/threeSurfer/store/effects.ts index 4fa4c9f19..cfdf2bfec 100644 --- a/src/viewerModule/threeSurfer/store/effects.ts +++ b/src/viewerModule/threeSurfer/store/effects.ts @@ -3,7 +3,8 @@ import { createEffect } from "@ngrx/effects"; import { select, Store } from "@ngrx/store"; import { EMPTY, forkJoin, merge, Observable, of, pipe, throwError } from "rxjs"; import { debounceTime, map, switchMap, withLatestFrom, filter, shareReplay, distinctUntilChanged } from "rxjs/operators"; -import { SAPI, SapiAtlasModel, SapiParcellationModel, SapiSpaceModel } from "src/atlasComponents/sapi"; +import { SAPI } from "src/atlasComponents/sapi"; +import { SxplrAtlas, SxplrParcellation, SxplrTemplate } from "src/atlasComponents/sapi/type_sxplr" import { atlasAppearance, atlasSelection } from "src/state"; import { ThreeSurferCustomLabelLayer, ThreeSurferCustomLayer } from "src/state/atlasAppearance/const"; import * as selectors from "./selectors" @@ -13,25 +14,14 @@ export const fromATP = { getThreeSurfaces: (sapi: SAPI) => { return pipe( filter( - ({ atlas, template, parcellation }: {atlas: SapiAtlasModel, template: SapiSpaceModel, parcellation: SapiParcellationModel}) => !!atlas && !!template && !!parcellation + ({ atlas, template, parcellation }: {atlas: SxplrAtlas, template: SxplrTemplate, parcellation: SxplrParcellation}) => !!atlas && !!template && !!parcellation ), - switchMap(({ atlas, template, parcellation }: {atlas: SapiAtlasModel, template: SapiSpaceModel, parcellation: SapiParcellationModel}) => - forkJoin({ - surfaces: sapi.getSpace(atlas["@id"], template["@id"]).getVolumes().pipe( - map( - volumes => volumes.filter(vol => vol.data.type === "gii") - ) - ), - labels: sapi.getParcellation(atlas["@id"], parcellation["@id"]).getVolumes().pipe( - map( - volumes => volumes.filter(vol => - vol.data.type === "gii-label" && - vol.data.space["@id"] === template["@id"] - ) - ) - ) + switchMap(({ template, parcellation }: {atlas: SxplrAtlas, template: SxplrTemplate, parcellation: SxplrParcellation}) => { + return forkJoin({ + surfaces: sapi.getSurfaceTemplateImage(template), + labels: sapi.getTranslatedLabelledThreeMap(parcellation, template), }) - ) + }) ) } } @@ -44,7 +34,7 @@ export class ThreeSurferEffects { ) private selectedSurfaceId$ = this.store.pipe( - select(selectors.getSelectedVolumeId), + select(selectors.getSelectedSurfaceVariant), distinctUntilChanged() ) @@ -81,18 +71,19 @@ export class ThreeSurferEffects { onATPDebounceHasSurfaceVolumes = createEffect(() => this.onATPDebounceThreeSurferLayers$.pipe( switchMap(({ surfaces }) => { - const defaultSurface = surfaces.find(s => s.metadata.shortName === "pial") || surfaces[0] + + const defaultSurface = surfaces.find(s => s.variant === "pial") || surfaces[0] if (!defaultSurface) return EMPTY return of( - actions.selectVolumeById({ - id: defaultSurface["@id"] + actions.selectSurfaceVariant({ + variant: defaultSurface.variant }) ) }) )) onSurfaceSelected = createEffect(() => this.selectedSurfaceId$.pipe( - switchMap(id => this.onATPDebounceThreeSurferLayers$.pipe( + switchMap(variant => this.onATPDebounceThreeSurferLayers$.pipe( switchMap(({ surfaces }) => { if (surfaces.length === 0) return EMPTY @@ -100,19 +91,16 @@ export class ThreeSurferEffects { /** * select the pial or first one by default */ - const selectedSrc = surfaces.find(s => s["@id"] === id) - - if (!(selectedSrc.data?.url_map)) { - return throwError(`Expecting surfaces[0].data.url_map to be defined, but is not.`) - } + const selectedSrc = surfaces.filter(surface => surface.variant === variant) - for (const key in selectedSrc.data.url_map) { + for (const src of selectedSrc) { layers.push({ + clType: 'baselayer/threesurfer', - id: `${selectedSrc["@id"]}-${key}`, - name: `${selectedSrc["@id"]}-${key}`, - laterality: key as 'left' | 'right', - source: selectedSrc.data.url_map[key] + id: src.id, + name: src.id, + laterality: src.laterality, + source: src.url }) } return of(...[ @@ -127,14 +115,15 @@ export class ThreeSurferEffects { )) onATPDebounceAddBaseLayers$ = createEffect(() => this.onATPDebounceThreeSurferLayers$.pipe( - switchMap(({ labels }) => { + switchMap(({ labels, surfaces }) => { const labelMaps: ThreeSurferCustomLabelLayer[] = [] - for (const label of labels) { + for (const key in labels) { + const { laterality, regions, url } = labels[key] labelMaps.push({ clType: 'baselayer/threesurfer-label', - id: `${label["@id"]}-${label.metadata.shortName}`, - laterality: label.metadata.shortName as 'left' | 'right', - source: label.data.url + id: `${url}-${laterality}`, + laterality, + source: url }) } return of( diff --git a/src/viewerModule/threeSurfer/store/selectors.ts b/src/viewerModule/threeSurfer/store/selectors.ts index 82c32604a..017d9aa89 100644 --- a/src/viewerModule/threeSurfer/store/selectors.ts +++ b/src/viewerModule/threeSurfer/store/selectors.ts @@ -4,7 +4,7 @@ import { Store } from "./store" const selectStore = state => state[nameSpace] as Store -export const getSelectedVolumeId = createSelector( +export const getSelectedSurfaceVariant = createSelector( selectStore, - ({ selectedVolumeId }) => selectedVolumeId + ({ selectedSurfaceVariant }) => selectedSurfaceVariant ) diff --git a/src/viewerModule/threeSurfer/store/store.ts b/src/viewerModule/threeSurfer/store/store.ts index b830d4278..713003dce 100644 --- a/src/viewerModule/threeSurfer/store/store.ts +++ b/src/viewerModule/threeSurfer/store/store.ts @@ -2,22 +2,22 @@ import { createReducer, on } from "@ngrx/store"; import * as actions from "./actions" export type Store = { - selectedVolumeId: string + selectedSurfaceVariant: string } export const defaultStore: Store = { - selectedVolumeId: null + selectedSurfaceVariant: null } export const reducer = createReducer( defaultStore, on( - actions.selectVolumeById, - (state, { id }) => { + actions.selectSurfaceVariant, + (state, { variant }) => { return { ...state, - selectedVolumeId: id + selectedSurfaceVariant: variant } } ) diff --git a/src/viewerModule/threeSurfer/threeSurferGlue/threeSurfer.component.ts b/src/viewerModule/threeSurfer/threeSurferGlue/threeSurfer.component.ts index f04ad6cc1..a5292817e 100644 --- a/src/viewerModule/threeSurfer/threeSurferGlue/threeSurfer.component.ts +++ b/src/viewerModule/threeSurfer/threeSurferGlue/threeSurfer.component.ts @@ -1,7 +1,7 @@ import { Component, Output, EventEmitter, ElementRef, OnDestroy, AfterViewInit, Inject, Optional, ChangeDetectionStrategy } from "@angular/core"; import { EnumViewerEvt, IViewer, TViewerEvent } from "src/viewerModule/viewer.interface"; -import { combineLatest, Observable, Subject } from "rxjs"; -import { debounceTime, distinctUntilChanged, filter, map, shareReplay } from "rxjs/operators"; +import { combineLatest, forkJoin, from, merge, Observable, Subject } from "rxjs"; +import { debounceTime, distinctUntilChanged, filter, map, scan, shareReplay, switchMap } from "rxjs/operators"; import { ComponentStore } from "src/viewerModule/componentStore"; import { select, Store } from "@ngrx/store"; import { ClickInterceptor, CLICK_INTERCEPTOR_INJECTOR } from "src/util"; @@ -11,11 +11,11 @@ import { getUuid } from "src/util/fn"; import { AUTO_ROTATE, TInteralStatePayload, ViewerInternalStateSvc } from "src/viewerModule/viewerInternalState.service"; import { atlasAppearance, atlasSelection } from "src/state"; import { ThreeSurferCustomLabelLayer, ThreeSurferCustomLayer, ColorMapCustomLayer } from "src/state/atlasAppearance/const"; -import { SapiRegionModel, SapiVolumeModel } from "src/atlasComponents/sapi"; -import { getRegionLabelIndex } from "src/viewerModule/nehuba/config.service"; +import { SxplrRegion } from "src/atlasComponents/sapi/type_sxplr" import { arrayEqual } from "src/util/array"; import { ThreeSurferEffects } from "../store/effects"; import { selectors, actions } from "../store" +import { SAPI } from "src/atlasComponents/sapi"; const viewerType = 'ThreeSurfer' type TInternalState = { @@ -30,7 +30,7 @@ type TInternalState = { const pZoomFactor = 5e3 type THandlingCustomEv = { - regions: SapiRegionModel[] + regions: SxplrRegion[] error?: string evMesh?: { faceIndex: number @@ -112,7 +112,7 @@ export class ThreeSurferGlueCmp implements IViewer<'threeSurfer'>, AfterViewInit }> = {} private internalStateNext: (arg: TInteralStatePayload<TInternalState>) => void - private mouseoverRegions: SapiRegionModel[] = [] + private mouseoverRegions: SxplrRegion[] = [] private selectedRegions$ = this.store$.pipe( select(atlasSelection.selectors.selectedRegions) @@ -136,8 +136,8 @@ export class ThreeSurferGlueCmp implements IViewer<'threeSurfer'>, AfterViewInit /** * maps laterality to label index to sapi region */ - private latLblIdxToRegionRecord: LateralityRecord<Record<number, SapiRegionModel>> = {} - private latLblIdxToRegionRecord$: Observable<LateralityRecord<Record<number, SapiRegionModel>>> = combineLatest([ + private latLblIdxToRegionRecord: LateralityRecord<Record<number, SxplrRegion>> = {} + private latLblIdxToRegionRecord$: Observable<LateralityRecord<Record<number, SxplrRegion>>> = combineLatest([ this.store$.pipe( atlasSelection.fromRootStore.distinctATP() ), @@ -145,15 +145,21 @@ export class ThreeSurferGlueCmp implements IViewer<'threeSurfer'>, AfterViewInit select(atlasSelection.selectors.selectedParcAllRegions), ) ]).pipe( - map(([ { atlas, parcellation, template }, regions]) => { + switchMap(([ { atlas, parcellation, template }, regions]) => { const returnObj = { - 'left': {} as Record<number, SapiRegionModel>, - 'right': {} as Record<number, SapiRegionModel> + 'left': {} as Record<number, SxplrRegion>, + 'right': {} as Record<number, SxplrRegion> } - - for (const region of regions) { - const idx = getRegionLabelIndex(atlas, template, parcellation, region) - if (idx) { + return merge( + ...regions.map(region => + from(this.sapi.getRegionLabelIndices(template, parcellation, region)).pipe( + map(label => ({ region, label })) + ) + ) + ).pipe( + scan((acc, curr) => { + const { label, region } = curr + let key : 'left' | 'right' if ( /left/i.test(region.name) ) key = 'left' if ( /right/i.test(region.name) ) key = 'right' @@ -162,12 +168,17 @@ export class ThreeSurferGlueCmp implements IViewer<'threeSurfer'>, AfterViewInit * TODO * there are ... more regions than expected, which has label index without laterality */ - continue + return { ...acc } } - returnObj[key][idx] = region - } - } - return returnObj + return { + ...acc, + [key]: { + ...acc[key], + [label]: region + } + } + }, {'left': {}, 'right': {}}) + ) }) ) @@ -185,11 +196,11 @@ export class ThreeSurferGlueCmp implements IViewer<'threeSurfer'>, AfterViewInit */ private showDelineation: boolean = true - public threeSurferSurfaceLayers$ = this.effect.onATPDebounceThreeSurferLayers$.pipe( - map(({ surfaces }) => surfaces) + public threeSurferSurfaceVariants$ = this.effect.onATPDebounceThreeSurferLayers$.pipe( + map(({ surfaces }) => surfaces.reduce((acc, val) => acc.includes(val.variant) ? acc : [...acc, val.variant] ,[] as string[])) ) public selectedSurfaceLayerId$ = this.store$.pipe( - select(selectors.getSelectedVolumeId) + select(selectors.getSelectedSurfaceVariant) ) constructor( @@ -197,6 +208,7 @@ export class ThreeSurferGlueCmp implements IViewer<'threeSurfer'>, AfterViewInit private el: ElementRef, private store$: Store, private navStateStoreRelay: ComponentStore<{ perspectiveOrientation: [number, number, number, number], perspectiveZoom: number }>, + private sapi: SAPI, private snackbar: MatSnackBar, @Optional() intViewerStateSvc: ViewerInternalStateSvc, @Optional() @Inject(CLICK_INTERCEPTOR_INJECTOR) clickInterceptor: ClickInterceptor, @@ -369,7 +381,7 @@ export class ThreeSurferGlueCmp implements IViewer<'threeSurfer'>, AfterViewInit } private tsRef: TThreeSurfer - private selectedRegions: SapiRegionModel[] = [] + private selectedRegions: SxplrRegion[] = [] private relayStoreLock: () => void = null private tsRefInitCb: ((tsRef: any) => void)[] = [] @@ -673,10 +685,10 @@ export class ThreeSurferGlueCmp implements IViewer<'threeSurfer'>, AfterViewInit } } - switchSurfaceLayer(layer: SapiVolumeModel): void{ + switchSurfaceLayer(variant: string): void{ this.store$.dispatch( - actions.selectVolumeById({ - id: layer["@id"] + actions.selectSurfaceVariant({ + variant }) ) } diff --git a/src/viewerModule/threeSurfer/threeSurferGlue/threeSurfer.template.html b/src/viewerModule/threeSurfer/threeSurferGlue/threeSurfer.template.html index 2a9703618..fcef001a1 100644 --- a/src/viewerModule/threeSurfer/threeSurferGlue/threeSurfer.template.html +++ b/src/viewerModule/threeSurfer/threeSurferGlue/threeSurfer.template.html @@ -29,16 +29,16 @@ </div> <mat-divider></mat-divider> - <button *ngFor="let surfaceLayer of threeSurferSurfaceLayers$ | async" + <button *ngFor="let surfaceLayer of (threeSurferSurfaceVariants$ | async)" mat-menu-item (click)="switchSurfaceLayer(surfaceLayer)" color="primary"> <mat-icon fontSet="fas" - [fontIcon]="surfaceLayer['@id'] === (selectedSurfaceLayerId$ | async) ? 'fa-circle' : 'fa-none'"> + [fontIcon]="surfaceLayer === (selectedSurfaceLayerId$ | async) ? 'fa-circle' : 'fa-none'"> </mat-icon> <span> - {{ surfaceLayer.metadata.shortName }} + {{ surfaceLayer }} </span> </button> </mat-menu> diff --git a/src/viewerModule/threeSurfer/types.ts b/src/viewerModule/threeSurfer/types.ts index 9a15c5642..1a4cdf152 100644 --- a/src/viewerModule/threeSurfer/types.ts +++ b/src/viewerModule/threeSurfer/types.ts @@ -1,4 +1,4 @@ -import { SapiRegionModel } from 'src/atlasComponents/sapi' +import { SxplrRegion } from 'src/atlasComponents/sapi/type_sxplr' export type TThreeSurferMesh = { colormap: string @@ -6,11 +6,25 @@ export type TThreeSurferMesh = { hemisphere: 'left' | 'right' } +export type TThreeMesh = { + id: string + variant: string + space: string + url: string + laterality: 'left' | 'right' +} + +export type TThreeMeshLabel = { + url: string + space: string + laterality: 'left' | 'right' +} + export type TThreeSurferContextInfo = { position: number[] faceIndex: number vertexIndices: number[] fsversion: string - regions: SapiRegionModel[] + regions: SxplrRegion[] error?: string } diff --git a/src/viewerModule/viewerCmp/viewerCmp.component.ts b/src/viewerModule/viewerCmp/viewerCmp.component.ts index cef42ef50..08df7f8b4 100644 --- a/src/viewerModule/viewerCmp/viewerCmp.component.ts +++ b/src/viewerModule/viewerCmp/viewerCmp.component.ts @@ -1,6 +1,6 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, TemplateRef, ViewChild, ViewContainerRef } from "@angular/core"; import { select, Store } from "@ngrx/store"; -import { combineLatest, Observable, of, Subscription } from "rxjs"; +import { combineLatest, forkJoin, Observable, of, Subscription } from "rxjs"; import { debounceTime, distinctUntilChanged, map, shareReplay, startWith, switchMap } from "rxjs/operators"; import { CONST, ARIA_LABELS, QUICKTOUR_DESC } from 'common/constants' import { animate, state, style, transition, trigger } from "@angular/animations"; @@ -8,13 +8,14 @@ import { IQuickTourData } from "src/ui/quickTour"; import { EnumViewerEvt, TContextArg, TSupportedViewers, TViewerEvent } from "../viewer.interface"; import { ContextMenuService, TContextMenuReg } from "src/contextMenuModule"; import { DialogService } from "src/services/dialogService.service"; -import {SAPI, SapiAtlasModel, SapiRegionModel} from "src/atlasComponents/sapi"; -import { atlasSelection, userInteraction, } from "src/state"; -import { SapiSpatialFeatureModel, SapiFeatureModel, SapiParcellationModel, SapiSpaceModel } from "src/atlasComponents/sapi/type"; -import { getUuid } from "src/util/fn"; +import { SAPI } from "src/atlasComponents/sapi"; +import { Feature, NgLayerSpec, SxplrAtlas, SxplrRegion, TThreeMesh } from "src/atlasComponents/sapi/type_sxplr" +import { atlasSelection, userInteraction } from "src/state"; + import { environment } from "src/environments/environment" -import { SapiViewsFeaturesVoiQuery } from "src/atlasComponents/sapiViews/features"; +// import { SapiViewsFeaturesVoiQuery } from "src/atlasComponents/sapiViews/features"; import { SapiViewsCoreSpaceBoundingBox } from "src/atlasComponents/sapiViews/core"; +import { SxplrTemplate } from "src/atlasComponents/sapi/type_sxplr"; @Component({ selector: 'iav-cmp-viewer-container', @@ -70,8 +71,8 @@ export class ViewerCmp implements OnDestroy { @ViewChild('genericInfoVCR', { read: ViewContainerRef }) genericInfoVCR: ViewContainerRef - @ViewChild('voiFeatures', { read: SapiViewsFeaturesVoiQuery }) - voiQueryDirective: SapiViewsFeaturesVoiQuery + // @ViewChild('voiFeatures', { read: SapiViewsFeaturesVoiQuery }) + // voiQueryDirective: SapiViewsFeaturesVoiQuery @ViewChild('bbox', { read: SapiViewsCoreSpaceBoundingBox }) boundingBoxDirective: SapiViewsCoreSpaceBoundingBox @@ -94,7 +95,7 @@ export class ViewerCmp implements OnDestroy { shareReplay(1) ) - public fetchedAtlases$: Observable<SapiAtlasModel[]> = this.sapi.atlases$ + public fetchedAtlases$: Observable<SxplrAtlas[]> = this.sapi.atlases$ public selectedAtlas$ = this.selectedATP.pipe( map(({ atlas }) => atlas) @@ -127,20 +128,24 @@ export class ViewerCmp implements OnDestroy { public useViewer$: Observable<TSupportedViewers | 'notsupported'> = combineLatest([ this.store$.pipe( atlasSelection.fromRootStore.distinctATP(), - switchMap(({ atlas, template }) => atlas && template - ? this.sapi.getSpace(atlas["@id"], template["@id"]).getVolumes() - : of(null)), + switchMap(({ template }) => template + ? forkJoin({ + voxel: this.sapi.getVoxelTemplateImage(template), + surface: this.sapi.getSurfaceTemplateImage(template), + }) + : of(null as { voxel: NgLayerSpec[], surface: TThreeMesh[] }) + ), map(vols => { if (!vols) return null const flags = { isNehuba: false, isThreeSurfer: false } - if (vols.find(vol => vol.data.volume_type === "neuroglancer/precomputed")) { + if (vols.voxel.length > 0) { flags.isNehuba = true } - if (vols.find(vol => vol.data.volume_type === "gii")) { + if (vols.surface.length > 0) { flags.isThreeSurfer = true } return flags @@ -166,7 +171,7 @@ export class ViewerCmp implements OnDestroy { public viewerCtx$ = this.ctxMenuSvc.context$ - public selectedFeature$: Observable<SapiFeatureModel> = this.store$.pipe( + public selectedFeature$: Observable<Feature> = this.store$.pipe( select(userInteraction.selectors.selectedFeature) ) @@ -193,7 +198,7 @@ export class ViewerCmp implements OnDestroy { private viewerStatusRegionCtxMenu: TemplateRef<any> public context: TContextArg<TSupportedViewers> - private templateSelected: SapiSpaceModel + private templateSelected: SxplrTemplate constructor( private store$: Store<any>, @@ -227,7 +232,7 @@ export class ViewerCmp implements OnDestroy { message.push(`- _${atlas.name}_`) } if (checkPrerelease(tmpl)) { - message.push(`- _${tmpl.fullName}_`) + message.push(`- _${tmpl.name}_`) } if (checkPrerelease(parc)) { message.push(`- _${parc.name}_`) @@ -311,7 +316,7 @@ export class ViewerCmp implements OnDestroy { ) } - public selectRoi(roi: SapiRegionModel): void { + public selectRoi(roi: SxplrRegion): void { this.store$.dispatch( atlasSelection.actions.selectRegion({ region: roi @@ -347,16 +352,8 @@ export class ViewerCmp implements OnDestroy { this.store$.dispatch( userInteraction.actions.mouseoverPosition({ position: { - "@id": getUuid(), - "@type": "https://openminds.ebrains.eu/sands/CoordinatePoint", - coordinates: nav.position.map(p => { - return { - value: p, - } - }), - coordinateSpace: { - '@id': this.templateSelected["@id"] - } + loc: nav.position as [number, number, number], + space: this.templateSelected } }) ) @@ -371,19 +368,22 @@ export class ViewerCmp implements OnDestroy { this.ctxMenuSvc.dismissCtxMenu() } - showDataset(feat: SapiFeatureModel): void { - if ((feat as SapiSpatialFeatureModel).location) { - const feature = feat as SapiSpatialFeatureModel - this.store$.dispatch( - atlasSelection.actions.navigateTo({ - navigation: { - orientation: [0, 0, 0, 1], - position: feature.location.center.coordinates.map(v => v.value * 1e6) - }, - animation: true - }) - ) - } + showDataset(feat: Feature): void { + /** + * TODO if feat is spatial feature, navigate to region + */ + // if ((feat as SapiSpatialFeatureModel).location) { + // const feature = feat as SapiSpatialFeatureModel + // this.store$.dispatch( + // atlasSelection.actions.navigateTo({ + // navigation: { + // orientation: [0, 0, 0, 1], + // position: feature.location.center.coordinates.map(v => v.value * 1e6) + // }, + // animation: true + // }) + // ) + // } this.store$.dispatch( userInteraction.actions.showFeature({ diff --git a/src/viewerModule/viewerCmp/viewerCmp.template.html b/src/viewerModule/viewerCmp/viewerCmp.template.html index 6774d54ae..0731f9bf2 100644 --- a/src/viewerModule/viewerCmp/viewerCmp.template.html +++ b/src/viewerModule/viewerCmp/viewerCmp.template.html @@ -29,7 +29,7 @@ </mat-list-item> - <ng-template [ngIf]="voiQueryDirective && (voiQueryDirective.onhover | async)" let-feat> + <!-- <ng-template [ngIf]="voiQueryDirective && (voiQueryDirective.onhover | async)" let-feat> <mat-list-item> <mat-icon fontSet="fas" @@ -38,7 +38,8 @@ </mat-icon> <div matLine>{{ feat?.metadata?.fullName || 'Feature' }}</div> </mat-list-item> - </ng-template> + </ng-template> --> + </mat-list> <!-- TODO Potentially implementing plugin contextual info --> </div> @@ -230,11 +231,11 @@ <ng-container *ngTemplateOutlet="autocompleteTmpl; context: { showTour: true }"> </ng-container> - <ng-template [ngIf]="VOI_QUERY_FLAG"> + <!-- <ng-template [ngIf]="VOI_QUERY_FLAG"> <div *ngIf="!((selectedRegions$ | async)[0])" class="sxplr-p-2 w-100"> <ng-container *ngTemplateOutlet="spatialFeatureListViewTmpl"></ng-container> </div> - </ng-template> + </ng-template> --> </div> <!-- such a gross implementation --> @@ -268,7 +269,7 @@ </div> <!-- tab toggling hide/show of min search tray --> - <div class="tab-toggle-container d-inline-block v-align-top"> + <!-- <div class="tab-toggle-container d-inline-block v-align-top"> <ng-container *ngTemplateOutlet="tabTmpl; context: { isOpen: minTrayVisSwitch.switchState$ | async, regionSelected: selectedRegions$ | async, @@ -276,7 +277,7 @@ badge: voiQueryDirective && (voiQueryDirective.features$ | async).length || null }"> </ng-container> - </div> + </div> --> </ng-template> @@ -796,7 +797,7 @@ <!-- context menu template --> <ng-template #viewerCtxMenuTmpl let-tmplRefs="tmplRefs"> <mat-card class="sxplr-p-0 d-flex flex-column" - [iav-key-listener]="[{type: 'keydown', target: 'document', capture: true}]" + [iav-key-listener]="[{type: 'keydown', target: 'document', capture: true, key: 'Esc'}]" (iav-key-event)="disposeCtxMenu()" (iav-outsideClick)="disposeCtxMenu()"> <mat-card-content *ngFor="let tmplRef of tmplRefs" @@ -930,13 +931,14 @@ </sxplr-sapiviews-core-datasets-dataset> - <sxplr-sapiviews-features-entry + <!-- TODO FIXME --> + <!-- <sxplr-sapiviews-features-entry [sxplr-sapiviews-features-entry-atlas]="selectedAtlas$ | async" [sxplr-sapiviews-features-entry-space]="templateSelected$ | async" [sxplr-sapiviews-features-entry-parcellation]="parcellationSelected$ | async" [sxplr-sapiviews-features-entry-region]="(selectedRegions$ | async)[0]" [sxplr-sapiviews-features-entry-feature]="feature"> - </sxplr-sapiviews-features-entry> + </sxplr-sapiviews-features-entry> --> </ng-template> <!-- general feature tmpl --> @@ -962,7 +964,7 @@ </ng-template> -<ng-template #spatialFeatureListViewTmpl> +<!-- <ng-template #spatialFeatureListViewTmpl> <div *ngIf="voiQueryDirective && (voiQueryDirective.busy$ | async); else notBusyTmpl" class="fs-200"> <spinner-cmp></spinner-cmp> </div> @@ -973,7 +975,6 @@ Volumes of interest </mat-card-title> <mat-card-subtitle class="overflow-hidden"> - <!-- TODO in future, perhaps encapsulate this as a component? seems like a nature fit in sapiView/space/boundingbox --> <ng-template let-bbox [ngIf]="boundingBoxDirective && (boundingBoxDirective.bbox$ | async | getProperty : 'bbox')" [ngIfElse]="bboxFallbackTmpl"> Bounding box: {{ bbox[0] | numbers | json }} - {{ bbox[1] | numbers | json }} mm </ng-template> @@ -996,9 +997,10 @@ </ng-template> </mat-card> </ng-template> -</ng-template> +</ng-template> --> -<div class="d-none" +<!-- TODO FIXME --> +<!-- <div class="d-none" *ngIf="VOI_QUERY_FLAG" sxplr-sapiviews-core-space-boundingbox [sxplr-sapiviews-core-space-boundingbox-atlas]="selectedAtlas$ | async" @@ -1012,4 +1014,4 @@ (sxplr-sapiviews-features-voi-query-onclick)="showDataset($event)" #voiFeatures="sxplrSapiViewsFeaturesVoiQuery"> -</div> +</div> --> diff --git a/src/atlasComponents/sapiViews/features/connectivity/connectivityBrowser/connectivityBrowser.component.spec.ts b/tmpFeatures/connectivity/connectivityBrowser/connectivityBrowser.component.spec.ts similarity index 100% rename from src/atlasComponents/sapiViews/features/connectivity/connectivityBrowser/connectivityBrowser.component.spec.ts rename to tmpFeatures/connectivity/connectivityBrowser/connectivityBrowser.component.spec.ts diff --git a/src/atlasComponents/sapiViews/features/connectivity/connectivityBrowser/connectivityBrowser.component.ts b/tmpFeatures/connectivity/connectivityBrowser/connectivityBrowser.component.ts similarity index 100% rename from src/atlasComponents/sapiViews/features/connectivity/connectivityBrowser/connectivityBrowser.component.ts rename to tmpFeatures/connectivity/connectivityBrowser/connectivityBrowser.component.ts diff --git a/src/atlasComponents/sapiViews/features/connectivity/connectivityBrowser/connectivityBrowser.stories.ts b/tmpFeatures/connectivity/connectivityBrowser/connectivityBrowser.stories.ts similarity index 100% rename from src/atlasComponents/sapiViews/features/connectivity/connectivityBrowser/connectivityBrowser.stories.ts rename to tmpFeatures/connectivity/connectivityBrowser/connectivityBrowser.stories.ts diff --git a/src/atlasComponents/sapiViews/features/connectivity/connectivityBrowser/connectivityBrowser.style.scss b/tmpFeatures/connectivity/connectivityBrowser/connectivityBrowser.style.scss similarity index 100% rename from src/atlasComponents/sapiViews/features/connectivity/connectivityBrowser/connectivityBrowser.style.scss rename to tmpFeatures/connectivity/connectivityBrowser/connectivityBrowser.style.scss diff --git a/src/atlasComponents/sapiViews/features/connectivity/connectivityBrowser/connectivityBrowser.template.html b/tmpFeatures/connectivity/connectivityBrowser/connectivityBrowser.template.html similarity index 100% rename from src/atlasComponents/sapiViews/features/connectivity/connectivityBrowser/connectivityBrowser.template.html rename to tmpFeatures/connectivity/connectivityBrowser/connectivityBrowser.template.html diff --git a/src/atlasComponents/sapiViews/features/connectivity/connectivityDoi.pipe.ts b/tmpFeatures/connectivity/connectivityDoi.pipe.ts similarity index 100% rename from src/atlasComponents/sapiViews/features/connectivity/connectivityDoi.pipe.ts rename to tmpFeatures/connectivity/connectivityDoi.pipe.ts diff --git a/src/atlasComponents/sapiViews/features/connectivity/hasConnectivity.directive.ts b/tmpFeatures/connectivity/hasConnectivity.directive.ts similarity index 99% rename from src/atlasComponents/sapiViews/features/connectivity/hasConnectivity.directive.ts rename to tmpFeatures/connectivity/hasConnectivity.directive.ts index 122083f1d..89168b6ad 100644 --- a/src/atlasComponents/sapiViews/features/connectivity/hasConnectivity.directive.ts +++ b/tmpFeatures/connectivity/hasConnectivity.directive.ts @@ -74,7 +74,6 @@ export class HasConnectivity implements OnDestroy { if (this.region.name) { this.connectivityModalities.forEach(m => { const type = m.types[0] - this.sapi.getParcellation(this.atlas["@id"], this.parcellation["@id"]) .getFeatures({type, page: 1, size: 1}).pipe(take(1)) .subscribe((res: SapiParcellationFeatureModel[] | any) => { diff --git a/src/atlasComponents/sapiViews/features/connectivity/index.ts b/tmpFeatures/connectivity/index.ts similarity index 100% rename from src/atlasComponents/sapiViews/features/connectivity/index.ts rename to tmpFeatures/connectivity/index.ts diff --git a/src/atlasComponents/sapiViews/features/connectivity/module.ts b/tmpFeatures/connectivity/module.ts similarity index 100% rename from src/atlasComponents/sapiViews/features/connectivity/module.ts rename to tmpFeatures/connectivity/module.ts diff --git a/src/atlasComponents/sapiViews/features/entry/entry.component.ts b/tmpFeatures/entry/entry.component.ts similarity index 100% rename from src/atlasComponents/sapiViews/features/entry/entry.component.ts rename to tmpFeatures/entry/entry.component.ts diff --git a/src/atlasComponents/sapiViews/features/entry/entry.style.css b/tmpFeatures/entry/entry.style.css similarity index 100% rename from src/atlasComponents/sapiViews/features/entry/entry.style.css rename to tmpFeatures/entry/entry.style.css diff --git a/src/atlasComponents/sapiViews/features/entry/entry.template.html b/tmpFeatures/entry/entry.template.html similarity index 100% rename from src/atlasComponents/sapiViews/features/entry/entry.template.html rename to tmpFeatures/entry/entry.template.html diff --git a/src/atlasComponents/sapiViews/features/entryListItem/entryListItem.component.ts b/tmpFeatures/entryListItem/entryListItem.component.ts similarity index 100% rename from src/atlasComponents/sapiViews/features/entryListItem/entryListItem.component.ts rename to tmpFeatures/entryListItem/entryListItem.component.ts diff --git a/src/atlasComponents/sapiViews/features/entryListItem/entryListItem.style.css b/tmpFeatures/entryListItem/entryListItem.style.css similarity index 100% rename from src/atlasComponents/sapiViews/features/entryListItem/entryListItem.style.css rename to tmpFeatures/entryListItem/entryListItem.style.css diff --git a/src/atlasComponents/sapiViews/features/entryListItem/entryListItem.template.html b/tmpFeatures/entryListItem/entryListItem.template.html similarity index 100% rename from src/atlasComponents/sapiViews/features/entryListItem/entryListItem.template.html rename to tmpFeatures/entryListItem/entryListItem.template.html diff --git a/src/atlasComponents/sapiViews/features/entryListItem/entryListitem.stories.ts b/tmpFeatures/entryListItem/entryListitem.stories.ts similarity index 100% rename from src/atlasComponents/sapiViews/features/entryListItem/entryListitem.stories.ts rename to tmpFeatures/entryListItem/entryListitem.stories.ts diff --git a/src/atlasComponents/sapiViews/features/featureBadgeColor.pipe.ts b/tmpFeatures/featureBadgeColor.pipe.ts similarity index 100% rename from src/atlasComponents/sapiViews/features/featureBadgeColor.pipe.ts rename to tmpFeatures/featureBadgeColor.pipe.ts diff --git a/src/atlasComponents/sapiViews/features/featureBadgeFlag.pipe.ts b/tmpFeatures/featureBadgeFlag.pipe.ts similarity index 100% rename from src/atlasComponents/sapiViews/features/featureBadgeFlag.pipe.ts rename to tmpFeatures/featureBadgeFlag.pipe.ts diff --git a/src/atlasComponents/sapiViews/features/featureBadgeName.pipe.ts b/tmpFeatures/featureBadgeName.pipe.ts similarity index 100% rename from src/atlasComponents/sapiViews/features/featureBadgeName.pipe.ts rename to tmpFeatures/featureBadgeName.pipe.ts diff --git a/src/atlasComponents/sapiViews/features/ieeg/ieegDataset/ieegDataset.component.ts b/tmpFeatures/ieeg/ieegDataset/ieegDataset.component.ts similarity index 100% rename from src/atlasComponents/sapiViews/features/ieeg/ieegDataset/ieegDataset.component.ts rename to tmpFeatures/ieeg/ieegDataset/ieegDataset.component.ts diff --git a/src/atlasComponents/sapiViews/features/ieeg/ieegDataset/ieegDataset.stories.ts b/tmpFeatures/ieeg/ieegDataset/ieegDataset.stories.ts similarity index 100% rename from src/atlasComponents/sapiViews/features/ieeg/ieegDataset/ieegDataset.stories.ts rename to tmpFeatures/ieeg/ieegDataset/ieegDataset.stories.ts diff --git a/src/atlasComponents/sapiViews/features/ieeg/ieegDataset/ieegDataset.style.css b/tmpFeatures/ieeg/ieegDataset/ieegDataset.style.css similarity index 100% rename from src/atlasComponents/sapiViews/features/ieeg/ieegDataset/ieegDataset.style.css rename to tmpFeatures/ieeg/ieegDataset/ieegDataset.style.css diff --git a/src/atlasComponents/sapiViews/features/ieeg/ieegDataset/ieegDataset.template.html b/tmpFeatures/ieeg/ieegDataset/ieegDataset.template.html similarity index 100% rename from src/atlasComponents/sapiViews/features/ieeg/ieegDataset/ieegDataset.template.html rename to tmpFeatures/ieeg/ieegDataset/ieegDataset.template.html diff --git a/src/atlasComponents/sapiViews/features/ieeg/inRoi.pipe.ts b/tmpFeatures/ieeg/inRoi.pipe.ts similarity index 100% rename from src/atlasComponents/sapiViews/features/ieeg/inRoi.pipe.ts rename to tmpFeatures/ieeg/inRoi.pipe.ts diff --git a/src/atlasComponents/sapiViews/features/ieeg/index.ts b/tmpFeatures/ieeg/index.ts similarity index 100% rename from src/atlasComponents/sapiViews/features/ieeg/index.ts rename to tmpFeatures/ieeg/index.ts diff --git a/src/atlasComponents/sapiViews/features/ieeg/module.ts b/tmpFeatures/ieeg/module.ts similarity index 100% rename from src/atlasComponents/sapiViews/features/ieeg/module.ts rename to tmpFeatures/ieeg/module.ts diff --git a/src/atlasComponents/sapiViews/features/index.ts b/tmpFeatures/index.ts similarity index 100% rename from src/atlasComponents/sapiViews/features/index.ts rename to tmpFeatures/index.ts diff --git a/src/atlasComponents/sapiViews/features/module.ts b/tmpFeatures/module.ts similarity index 100% rename from src/atlasComponents/sapiViews/features/module.ts rename to tmpFeatures/module.ts diff --git a/src/atlasComponents/sapiViews/features/orderFilterFeatureList.pipe.ts b/tmpFeatures/orderFilterFeatureList.pipe.ts similarity index 100% rename from src/atlasComponents/sapiViews/features/orderFilterFeatureList.pipe.ts rename to tmpFeatures/orderFilterFeatureList.pipe.ts diff --git a/src/atlasComponents/sapiViews/features/receptors/autoradiography/autoradiograph.stories.ts b/tmpFeatures/receptors/autoradiography/autoradiograph.stories.ts similarity index 100% rename from src/atlasComponents/sapiViews/features/receptors/autoradiography/autoradiograph.stories.ts rename to tmpFeatures/receptors/autoradiography/autoradiograph.stories.ts diff --git a/src/atlasComponents/sapiViews/features/receptors/autoradiography/autoradiography.component.ts b/tmpFeatures/receptors/autoradiography/autoradiography.component.ts similarity index 100% rename from src/atlasComponents/sapiViews/features/receptors/autoradiography/autoradiography.component.ts rename to tmpFeatures/receptors/autoradiography/autoradiography.component.ts diff --git a/src/atlasComponents/sapiViews/features/receptors/autoradiography/autoradiography.style.css b/tmpFeatures/receptors/autoradiography/autoradiography.style.css similarity index 100% rename from src/atlasComponents/sapiViews/features/receptors/autoradiography/autoradiography.style.css rename to tmpFeatures/receptors/autoradiography/autoradiography.style.css diff --git a/src/atlasComponents/sapiViews/features/receptors/autoradiography/autoradiography.template.html b/tmpFeatures/receptors/autoradiography/autoradiography.template.html similarity index 100% rename from src/atlasComponents/sapiViews/features/receptors/autoradiography/autoradiography.template.html rename to tmpFeatures/receptors/autoradiography/autoradiography.template.html diff --git a/src/atlasComponents/sapiViews/features/receptors/base.ts b/tmpFeatures/receptors/base.ts similarity index 95% rename from src/atlasComponents/sapiViews/features/receptors/base.ts rename to tmpFeatures/receptors/base.ts index 2428c72f6..08dc8f461 100644 --- a/src/atlasComponents/sapiViews/features/receptors/base.ts +++ b/tmpFeatures/receptors/base.ts @@ -1,7 +1,7 @@ import { Directive, Input, SimpleChanges } from "@angular/core"; import { BehaviorSubject } from "rxjs"; import { SAPI, SapiAtlasModel, SapiParcellationModel, SapiRegionModel, SapiSpaceModel } from "src/atlasComponents/sapi"; -import { SapiRegionalFeatureReceptorModel } from "src/atlasComponents/sapi/type"; +import { TabularFeature } from "src/atlasComponents/sapi/type_sxplr" @Directive() export abstract class BaseReceptor{ @@ -22,7 +22,7 @@ export abstract class BaseReceptor{ featureId: string @Input('sxplr-sapiviews-features-receptor-data') - receptorData: SapiRegionalFeatureReceptorModel + receptorData: TabularFeature<number> error: string diff --git a/src/atlasComponents/sapiViews/features/receptors/entry/entry.component.ts b/tmpFeatures/receptors/entry/entry.component.ts similarity index 100% rename from src/atlasComponents/sapiViews/features/receptors/entry/entry.component.ts rename to tmpFeatures/receptors/entry/entry.component.ts diff --git a/src/atlasComponents/sapiViews/features/receptors/entry/entry.stories.ts b/tmpFeatures/receptors/entry/entry.stories.ts similarity index 100% rename from src/atlasComponents/sapiViews/features/receptors/entry/entry.stories.ts rename to tmpFeatures/receptors/entry/entry.stories.ts diff --git a/src/atlasComponents/sapiViews/features/receptors/entry/entry.style.css b/tmpFeatures/receptors/entry/entry.style.css similarity index 100% rename from src/atlasComponents/sapiViews/features/receptors/entry/entry.style.css rename to tmpFeatures/receptors/entry/entry.style.css diff --git a/src/atlasComponents/sapiViews/features/receptors/entry/entry.template.html b/tmpFeatures/receptors/entry/entry.template.html similarity index 100% rename from src/atlasComponents/sapiViews/features/receptors/entry/entry.template.html rename to tmpFeatures/receptors/entry/entry.template.html diff --git a/src/atlasComponents/sapiViews/features/receptors/fingerprint/fingerprint.component.ts b/tmpFeatures/receptors/fingerprint/fingerprint.component.ts similarity index 82% rename from src/atlasComponents/sapiViews/features/receptors/fingerprint/fingerprint.component.ts rename to tmpFeatures/receptors/fingerprint/fingerprint.component.ts index 98c5b0076..7780f53ad 100644 --- a/src/atlasComponents/sapiViews/features/receptors/fingerprint/fingerprint.component.ts +++ b/tmpFeatures/receptors/fingerprint/fingerprint.component.ts @@ -2,7 +2,7 @@ import { AfterViewInit, Component, ElementRef, EventEmitter, HostListener, Injec import { fromEvent, Observable, Subscription } from "rxjs"; import { distinctUntilChanged, map } from "rxjs/operators"; import { SAPI } from "src/atlasComponents/sapi"; -import { SapiRegionalFeatureReceptorModel } from "src/atlasComponents/sapi/type"; +import { TabularFeature } from "src/atlasComponents/sapi/type_sxplr"; import { DARKTHEME } from "src/util/injectionTokens"; import { BaseReceptor } from "../base"; @@ -21,22 +21,27 @@ type RequiredType = { } } -function transformRadar(input: SapiRegionalFeatureReceptorModel['data']['fingerprints']): RequiredType[]{ +function transformRadar(input: TabularFeature<number>): RequiredType[]{ const listRequired: RequiredType[] = [] - for (const key in input) { - const item = input[key] + if (input.index.length !== input.data.length) { + throw new Error(`Expecting index length: '${input.index.length}' to be the same as data length : '${input.data.length}'.`) + } + const rowLength = new Set([input.data.map(row => row.length)]) + if (rowLength.size !== 1) { + throw new Error(`Expecting all row length to equal, but exists: ${JSON.stringify(Array.from(rowLength))}`) + } + input.index.forEach((label, idx) => { listRequired.push({ receptor: { - label: key + label }, density: { - mean: item.mean, - sd: item.std, - unit: item.unit + mean: input.data[idx][0], + sd: input.data[idx][1], + unit: '' } }) - - } + }) return listRequired } diff --git a/src/atlasComponents/sapiViews/features/receptors/fingerprint/fingerprint.stories.ts b/tmpFeatures/receptors/fingerprint/fingerprint.stories.ts similarity index 100% rename from src/atlasComponents/sapiViews/features/receptors/fingerprint/fingerprint.stories.ts rename to tmpFeatures/receptors/fingerprint/fingerprint.stories.ts diff --git a/src/atlasComponents/sapiViews/features/receptors/fingerprint/fingerprint.style.css b/tmpFeatures/receptors/fingerprint/fingerprint.style.css similarity index 100% rename from src/atlasComponents/sapiViews/features/receptors/fingerprint/fingerprint.style.css rename to tmpFeatures/receptors/fingerprint/fingerprint.style.css diff --git a/src/atlasComponents/sapiViews/features/receptors/fingerprint/fingerprint.template.html b/tmpFeatures/receptors/fingerprint/fingerprint.template.html similarity index 100% rename from src/atlasComponents/sapiViews/features/receptors/fingerprint/fingerprint.template.html rename to tmpFeatures/receptors/fingerprint/fingerprint.template.html diff --git a/src/atlasComponents/sapiViews/features/receptors/index.ts b/tmpFeatures/receptors/index.ts similarity index 100% rename from src/atlasComponents/sapiViews/features/receptors/index.ts rename to tmpFeatures/receptors/index.ts diff --git a/src/atlasComponents/sapiViews/features/receptors/module.ts b/tmpFeatures/receptors/module.ts similarity index 100% rename from src/atlasComponents/sapiViews/features/receptors/module.ts rename to tmpFeatures/receptors/module.ts diff --git a/src/atlasComponents/sapiViews/features/receptors/profile/profile.component.ts b/tmpFeatures/receptors/profile/profile.component.ts similarity index 100% rename from src/atlasComponents/sapiViews/features/receptors/profile/profile.component.ts rename to tmpFeatures/receptors/profile/profile.component.ts diff --git a/src/atlasComponents/sapiViews/features/receptors/profile/profile.stories.ts b/tmpFeatures/receptors/profile/profile.stories.ts similarity index 100% rename from src/atlasComponents/sapiViews/features/receptors/profile/profile.stories.ts rename to tmpFeatures/receptors/profile/profile.stories.ts diff --git a/src/atlasComponents/sapiViews/features/receptors/profile/profile.style.css b/tmpFeatures/receptors/profile/profile.style.css similarity index 100% rename from src/atlasComponents/sapiViews/features/receptors/profile/profile.style.css rename to tmpFeatures/receptors/profile/profile.style.css diff --git a/src/atlasComponents/sapiViews/features/receptors/profile/profile.template.html b/tmpFeatures/receptors/profile/profile.template.html similarity index 100% rename from src/atlasComponents/sapiViews/features/receptors/profile/profile.template.html rename to tmpFeatures/receptors/profile/profile.template.html diff --git a/src/atlasComponents/sapiViews/features/voi/index.ts b/tmpFeatures/voi/index.ts similarity index 100% rename from src/atlasComponents/sapiViews/features/voi/index.ts rename to tmpFeatures/voi/index.ts diff --git a/src/atlasComponents/sapiViews/features/voi/module.ts b/tmpFeatures/voi/module.ts similarity index 100% rename from src/atlasComponents/sapiViews/features/voi/module.ts rename to tmpFeatures/voi/module.ts diff --git a/src/atlasComponents/sapiViews/features/voi/voiQuery.directive.ts b/tmpFeatures/voi/voiQuery.directive.ts similarity index 75% rename from src/atlasComponents/sapiViews/features/voi/voiQuery.directive.ts rename to tmpFeatures/voi/voiQuery.directive.ts index 623011d89..fe76589bd 100644 --- a/src/atlasComponents/sapiViews/features/voi/voiQuery.directive.ts +++ b/tmpFeatures/voi/voiQuery.directive.ts @@ -3,7 +3,8 @@ import { interval, merge, Observable, of, Subject, Subscription } from "rxjs"; import { debounce, debounceTime, distinctUntilChanged, filter, pairwise, shareReplay, startWith, switchMap, take, tap } from "rxjs/operators"; import { AnnotationLayer, TNgAnnotationPoint, TNgAnnotationAABBox } from "src/atlasComponents/annotations"; import { SAPI } from "src/atlasComponents/sapi/sapi.service"; -import { BoundingBoxConcept, SapiAtlasModel, SapiSpaceModel, SapiVOIDataResponse, OpenMINDSCoordinatePoint } from "src/atlasComponents/sapi/type"; +import { BoundingBox, SxplrAtlas, SxplrTemplate, VoiFeature } from "src/atlasComponents/sapi/type_sxplr"; + import { ClickInterceptor, CLICK_INTERCEPTOR_INJECTOR } from "src/util"; import { arrayEqual } from "src/util/array"; @@ -17,9 +18,9 @@ export class SapiViewsFeaturesVoiQuery implements OnChanges, OnDestroy{ static VOI_LAYER_NAME = 'voi-annotation-layer' static VOI_ANNOTATION_COLOR = "#ffff00" private voiQuerySpec = new Subject<{ - atlas: SapiAtlasModel - space: SapiSpaceModel - bbox: BoundingBoxConcept + atlas: SxplrAtlas + space: SxplrTemplate + bbox: BoundingBox }>() private canFetchVoi(){ @@ -27,22 +28,22 @@ export class SapiViewsFeaturesVoiQuery implements OnChanges, OnDestroy{ } @Input('sxplr-sapiviews-features-voi-query-atlas') - atlas: SapiAtlasModel + atlas: SxplrAtlas @Input('sxplr-sapiviews-features-voi-query-space') - space: SapiSpaceModel + space: SxplrTemplate @Input('sxplr-sapiviews-features-voi-query-bbox') - bbox: BoundingBoxConcept + bbox: BoundingBox @Output('sxplr-sapiviews-features-voi-query-onhover') - onhover = new EventEmitter<SapiVOIDataResponse>() + onhover = new EventEmitter<VoiFeature>() @Output('sxplr-sapiviews-features-voi-query-onclick') - onclick = new EventEmitter<SapiVOIDataResponse>() + onclick = new EventEmitter<VoiFeature>() public busy$ = new EventEmitter<boolean>() - public features$: Observable<SapiVOIDataResponse[]> = this.voiQuerySpec.pipe( + public features$: Observable<VoiFeature[]> = this.voiQuerySpec.pipe( debounceTime(160), tap(() => this.busy$.emit(true)), switchMap(({ atlas, bbox, space }) => { @@ -51,18 +52,14 @@ export class SapiViewsFeaturesVoiQuery implements OnChanges, OnDestroy{ } return merge( of([]), - this.sapi.getSpace(atlas["@id"], space["@id"]).getFeatures({ bbox: JSON.stringify(bbox) }).pipe( - tap(val => { - this.busy$.emit(false) - }) - ) + this.sapi.getVoiFeatures(bbox) ) }), startWith([]), shareReplay(1) ) - private hoveredFeat: SapiVOIDataResponse + private hoveredFeat: VoiFeature private onDestroyCb: (() => void)[] = [] private subscription: Subscription[] = [] ngOnChanges(simpleChanges: SimpleChanges): void { @@ -131,7 +128,7 @@ export class SapiViewsFeaturesVoiQuery implements OnChanges, OnDestroy{ clickInterceptor.register(handle) this.subscription.push( this.features$.pipe( - startWith([] as SapiVOIDataResponse[]), + startWith([] as VoiFeature[]), distinctUntilChanged(arrayEqual((o, n) => o["@id"] === n["@id"])), pairwise(), debounce(() => @@ -142,8 +139,8 @@ export class SapiViewsFeaturesVoiQuery implements OnChanges, OnDestroy{ ), ).subscribe(([ prev, curr ]) => { for (const v of prev) { - const box = this.pointsToAABB(v.location.maxpoint, v.location.minpoint) - const point = this.pointToPoint(v.location.center) + const box = this.pointsToAABB(v.bbox.maxpoint, v.bbox.minpoint) + const point = this.pointToPoint(v.bbox.center) this.annotationIdToFeature.delete(box.id) this.annotationIdToFeature.delete(point.id) if (!this.voiBBoxSvc) continue @@ -154,8 +151,8 @@ export class SapiViewsFeaturesVoiQuery implements OnChanges, OnDestroy{ } } for (const v of curr) { - const box = this.pointsToAABB(v.location.maxpoint, v.location.minpoint) - const point = this.pointToPoint(v.location.center) + const box = this.pointsToAABB(v.bbox.maxpoint, v.bbox.minpoint) + const point = this.pointToPoint(v.bbox.center) this.annotationIdToFeature.set(box.id, v) this.annotationIdToFeature.set(point.id, v) if (!this.voiBBoxSvc) { @@ -170,20 +167,20 @@ export class SapiViewsFeaturesVoiQuery implements OnChanges, OnDestroy{ ) } - private annotationIdToFeature = new Map<string, SapiVOIDataResponse>() + private annotationIdToFeature = new Map<string, VoiFeature>() - private pointsToAABB(pointA: OpenMINDSCoordinatePoint, pointB: OpenMINDSCoordinatePoint): TNgAnnotationAABBox{ + private pointsToAABB(pointA: [number, number, number], pointB: [number, number, number]): TNgAnnotationAABBox{ return { id: `${SapiViewsFeaturesVoiQuery.VOI_LAYER_NAME}:${pointA["@id"]}:${pointB["@id"]}`, - pointA: pointA.coordinates.map(v => v.value * 1e6) as [number, number, number], - pointB: pointB.coordinates.map(v => v.value * 1e6) as [number, number, number], + pointA: pointA.map(v => v * 1e6) as [number, number, number], + pointB: pointB.map(v => v * 1e6) as [number, number, number], type: "aabbox" } } - private pointToPoint(point: OpenMINDSCoordinatePoint): TNgAnnotationPoint { + private pointToPoint(point: [number, number, number]): TNgAnnotationPoint { return { - id: `${SapiViewsFeaturesVoiQuery.VOI_LAYER_NAME}:${point["@id"]}`, - point: point.coordinates.map(v => v.value * 1e6) as [number, number, number], + id: `${SapiViewsFeaturesVoiQuery.VOI_LAYER_NAME}:${JSON.stringify(point)}}`, + point: point.map(v => v * 1e6) as [number, number, number], type: "point" } } diff --git a/tsconfig.json b/tsconfig.json index 7e2716b1f..bfd3effbe 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -22,6 +22,7 @@ "angularCompilerOptions":{ "fullTemplateTypeCheck": true, "strictInjectionParameters": true, - "annotateForClosureCompiler" : true + "annotateForClosureCompiler" : true, + "strictTemplates": true } } \ No newline at end of file -- GitLab