{"id":13422167,"url":"https://github.com/fsmMLK/openSAHE","last_synced_at":"2025-03-15T11:31:16.944Z","repository":{"id":134626959,"uuid":"416809278","full_name":"fsmMLK/openSAHE","owner":"fsmMLK","description":null,"archived":false,"fork":false,"pushed_at":"2024-04-12T12:42:02.000Z","size":55774,"stargazers_count":5,"open_issues_count":2,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-10-27T22:32:51.244Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fsmMLK.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2021-10-13T15:59:40.000Z","updated_at":"2024-10-03T14:36:49.000Z","dependencies_parsed_at":"2024-03-01T18:59:35.709Z","dependency_job_id":null,"html_url":"https://github.com/fsmMLK/openSAHE","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fsmMLK%2FopenSAHE","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fsmMLK%2FopenSAHE/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fsmMLK%2FopenSAHE/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fsmMLK%2FopenSAHE/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fsmMLK","download_url":"https://codeload.github.com/fsmMLK/openSAHE/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243724939,"owners_count":20337653,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-07-30T23:00:38.443Z","updated_at":"2025-03-15T11:31:16.936Z","avatar_url":"https://github.com/fsmMLK.png","language":"Python","readme":"# openSAHE - Open Source Statistical Anatomical Atlas of the Human head for Electrophysiology Applications\n\nVolume conductor problems in cerebral electrophysiology and bioimpedance do not have analytical solutions for nontrivial geometries and require a 3D model of the head and its electrical properties for solving the associated PDEs numerically.\nIdeally, the model should be made with patient-specific information. In clinical practice, this is not always the case and an average head model is often used. Also, the electrical properties of the tissues might not be completely known due to natural variability. Anatomical atlases are important tools for in silico studies on cerebral circulation and electrophysiology that require statistically consistent data, e.g., machine learning, sensitivity analyses, and as a benchmark to test inverse problem solvers.\n\nThe objective of this work is to develop a 4D (3D+T) statistical anatomical atlas of the electrical properties of the upper part of the human head for cerebral electrophysiology and bioimpedance applications. \n\nThe atlas was constructed based on 3D magnetic resonance images (MRI) of 107 human individuals and comprises the electrical properties of the main internal structures and can be adjusted for specific electrical frequencies. T1w+T2w MRI images were used to segment the main structures of the head while angiography MRI was used to segment the main artery. The proposed atlas also comprises a time-varying model of arterial brain circulation, based on the solution of the Navier-Stokes equation in the main arteries and their vascular territories.\n\n\n## Citing the atlas\n\nPlease cite this article in your work\n\nMoura, Fernando S, Beraldo, Roberto G, Ferreira, Leonardo A, \u0026 Siltanen, Samuli. (2021). Anatomical atlas of the upper part of the human head for electroencephalography and bioimpedance applications. Physiological Measurement, 42(10). 105015. https://doi.org/10.1088/1361-6579/ac3218\n\n\n```\n@article{Moura_2021,\n\tauthor = {Fernando S Moura and Roberto G Beraldo and Leonardo A Ferreira and Samuli Siltanen},\n\ttitle = {Anatomical atlas of the upper part of the human head for electroencephalography and bioimpedance applications},\n\tjournal = {Physiological Measurement},\n\tdoi = {10.1088/1361-6579/ac3218},\n\turl = {https://doi.org/10.1088/1361-6579/ac3218},\n\tyear = 2021,\n\tmonth = {oct},\n\tpublisher = {{IOP} Publishing},\n\tvolume = {42},\n\tnumber = {10},\n\tpages = {105015}\n}\n```\n\n\nIf you use the source code, please also cite\n\nMoura, Fernando S, Beraldo, Roberto G, Ferreira, Leonardo A, \u0026 Siltanen, Samuli. (2021). openSAHE: Open Source Statistical Anatomical Atlas of the Human head for Electrophysiology Applications (source code) (v1.0.0). Zenodo. https://doi.org/10.5281/zenodo.5567086\n\n```\n@software{moura_fernando_s_2021_5567086,\n  author       = {Moura, Fernando S and Beraldo, Roberto G and Ferreira, Leonardo A and Siltanen, Samuli},\n  title        = {{openSAHE: Open Source Statistical Anatomical Atlas of the Human head for Electrophysiology Applications (source code)}},\n  month        = oct,\n  year         = 2021,\n  publisher    = {Zenodo},\n  version      = {v1.0.0},\n  doi          = {10.5281/zenodo.5567086},\n  url          = {https://doi.org/10.5281/zenodo.5567086}\n}\n```\n\nIf you use the precomputed atlases, please also cite\n\nMoura, Fernando S, Beraldo, Roberto G, Ferreira, Leonardo A, \u0026 Siltanen, Samuli. (2021). openSAHE: Open Source Statistical Anatomical Atlas of the Human head for Electrophysiology Applications (precomputed atlases) (1.0) [Data set]. Zenodo. https://doi.org/10.5281/zenodo.5559624\n\n```\n@dataset{moura_fernando_s_2021_5559624,\n  author       = {Moura, Fernando S and Beraldo, Roberto G and Ferreira, Leonardo A and Siltanen, Samuli},\n  title        = {{openSAHE: Open Source Statistical Anatomical Atlas  of the Human head for Electrophysiology Applications (precomputed atlases)}},\n  month        = oct,\n  year         = 2021,\n  publisher    = {Zenodo},\n  version      = {1.0},\n  doi          = {10.5281/zenodo.5559624},\n  url          = {https://doi.org/10.5281/zenodo.5559624}\n}\n```\n\n\n## Precomputed atlases used in the publication\n\nPrecomputed atlases used in the publication (see above) can be found at \n\n[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.5559624.svg)](https://doi.org/10.5281/zenodo.5559624)\n\nSource code version used for the publication (see above) can be found at\n\n[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.5567086.svg)](https://doi.org/10.5281/zenodo.5567086)\n\n## Installation\n\nThis toolbox was developed in a linux machine. No tests were performed in other OSs.\n\n#### Requirements\n\nThe toolbox requires the following software\n\n  - [Julia](https://julialang.org/downloads/)\n  - [OpenBF](https://github.com/INSIGNEO/openBF)\n  - [Intel Python 3.8+](https://software.intel.com/content/www/us/en/develop/tools/oneapi/components/distribution-for-python.html) via [conda](https://www.anaconda.com/products/individual) or [miniconda](https://docs.conda.io/en/latest/miniconda.html)\n  - [SingularityCE](https://github.com/sylabs/singularity)\n  - neurodocker image created with singularityCE (see instructions below)\n\n#### Intel python (current: kubuntu 20-04)\n\nInstructions for miniconda. Anaconda users can follow the same instructions\n\n1. Miniconda install. Download [install script](https://docs.conda.io/en/latest/miniconda.html) \n\n2. run the installer\n\n~~~\nsudo bash Miniconda3-latest-Linux-x86_64.sh\n~~~\n\n3. Initialize conda to add its initialization to your .bashrc\n\n~~~\n/opt/miniconda3/bin/conda init\n~~~\n\n4. Add Intel' python channel. (other option is to edit ```.condarc``` created in your home folder. see below)\n\n~~~\nconda config --add channels intel\n~~~\n\n\n5. (optional but recommended =) ) Avoid activating conda's (base) in all terminals. Open (or create) a \n   file ~/.condarc and paste the following:\n\n~~~\nchannels:        \u003c-- channels to be considered priority channels are on top.\n - intel\n - conda-forge\n - defaults\nauto_activate_base: false   \u003c-- disable (base) auto load\n~~~\n\n6. Create a new python environment for the atlas\n\n~~~\nconda create -n atlasIntelPython_3 pyqt pyyaml matplotlib nipype nibabel meshio lxml pycairo psutil nptyping tornado simpleitk scikit-image pandas jill\n~~~\n\n\n7. If matplotlib shows the following error:\n\n~~~\nBad key \"text.kerning_factor\" on line 4 in /home/samyak/anaconda3/lib/python3.7/site-packages/matplotlib/mpl-data/stylelib/_classic_test_patch.mplstyle. You probably need to get an updated matplotlibrc file from https://github.com/matplotlib/matplotlib/blob/v3.1.3/matplotlibrc.template or from the matplotlib source distribution\n ~~~\n\n  Do the following steps ( [source](https://stackoverflow.com/questions/61171307/jupyter-notebook-shows-error-message-for-matplotlib-bad-key-text-kerning-factor) ) :\n   \n     1- Go to ~/anaconda3/lib/python3.7/site-packages/matplotlib/mpl-data/stylelib/\n     2- open _classic_test_patch.mplstyle and comment out the line of text.kerning_factor:6\n\n#### Julia and openBF\n\n(Tested in Kubuntu 20.04)\n\n1. install ```Jill``` using pip3.\n\n~~~\npip3 install jill -U\n~~~\n\n This comand will add a few binaries inside ~/.\nlocal/bin/\n\n\n2. Install julia\n\n~~~\n~/.local/bin/jill install\n~~~\n\n3. Install openBF. Run julia and type the following\n\n~~~\njulia\u003e ]\npkg\u003e add https://github.com/INSIGNEO/openBF\n~~~\n\n4. (optional) if you want to update openBF:\n\n~~~\njulia\u003e ]\npkg\u003e update openBF\n~~~\n\n5. (optional) if you want to test it\n\n~~~\njulia\u003e ]\npkg\u003e test openBF\n~~~\n\n6. Open the console and find julia's executable using ```which``` command\n\n~~~\n$which julia\npath/to/juliaExe/julia\n~~~\n\n7. Open forwardProblem/tools.py and add the path to the executable to the ```juliaExe``` variable\n\n~~~\njuliaExe = 'path/to/juliaExe/julia'\n~~~\n\n8. Look for the folder where the  package was installed. In linux machine it is located at \n\n~~~\n~/.julia/packages/openBF/XXXXX/\n~~~\n\n9. Open forwardProblem/tools.py and add this path to the ```openBFDir``` variable\n\n~~~\nopenBFDir = '~/.julia/packages/openBF/XXXXX/'\n~~~\n\n#### Neurodocker Singularity Image creation\n\nAs of today (Oct/2021) singularity does not have binaries for Kubuntu. The following instructions compiles \nsingularity in your machine (kubuntu 20.04, Oct/2021). You can skip these steps if you can install singularity using \nother methods.\ninstalled versions: singularity-ce-3.8.3, go v. 1.17\n\n1. dependencies\n   ~~~\n   sudo apt-get update \u0026\u0026 sudo apt-get install -y build-essential uuid-dev libgpgme-dev squashfs-tools libseccomp-dev wget pkg-config git cryptsetup-bin\n   ~~~\n\n2. install go\n~~~\nexport VERSION=1.17 OS=linux ARCH=amd64\nwget https://dl.google.com/go/go$VERSION.$OS-$ARCH.tar.gz\nsudo tar -C /usr/local -xzvf go$VERSION.$OS-$ARCH.tar.gz\nrm go$VERSION.$OS-$ARCH.tar.gz\n~~~\n\n3. setup GO\n~~~\necho 'export GOPATH=${HOME}/go' \u003e\u003e ~/.bashrc\necho 'export PATH=/usr/local/go/bin:${PATH}:${GOPATH}/bin' \u003e\u003e ~/.bashrc\nsource ~/.bashrc\n~~~\n\n4. download singularity\n~~~\nexport VERSION=3.8.3\nwget https://github.com/sylabs/singularity/releases/download/v${VERSION}/singularity-ce-${VERSION}.tar.gz\ntar -xzf singularity-ce-${VERSION}.tar.gz\ncd singularity-ce-{$VERSION}\n~~~\n\n5. make and install\n~~~\n./mconfig --prefix=/opt/singularity\nmake -C ./builddir\n~~~\n\n6. create link\n~~~\nsudo ln -s /opt/singularity/bin/singularity /usr/local/bin/singularity\n~~~\n\n7. testing\n~~~\nsingularity version\nsingularity exec library://alpine cat /etc/alpine-release\n~~~\n\n#### Singularity image with ANTS and SPM12\n\nUse the config file in src/singularityImages/confSingularity_nipype_ANTS_SPM12_PYTHON.txt.\n\n~~~\ncd path/to/atlas/singularityImages\nsudo singularity build nipype_ANTS_SPM12_SingularityImg_test.simg confSingularity_nipype_ANTS_SPM12_PYTHON.txt\n~~~\n\nThis command will take time to prepare the image... have a cup of coffe =).\n\nContents of the image\n - Base: Ubuntu 20.04\n - MATLAB Runtime R2019b Update 3 glnxa64\n - SPM12 version r7771 (method binaries)\n - Python3.6\n - Nipype\n\n\n## Usage\n\nThe project has 3 main python functions\n\n```\n./anatomicalAtlas/staticComponent/src/main_staticAtlas.py\n./anatomicalAtlas/dynamicComponent/src/main_dynamicAtlas.py\n./forwardProblem/EITmodel.py\n```\n\nThe two first files creat the static and dynamic components of the atlas. The last is used to solve Electrical \nimpedance tomography forward problem with the atlas.\n\n\n#### Static Component of the atlas\n\nThis component is generated by calling\n\n```\npython3 main_staticAtlas.py\n```\n\nThe user can edit 3 variables inside `main_staticAtlas.py` to specify the type of atlas\n\n```\nrFactList = [ 2 ]  # list with resampling factors. use integer values\npropList = [ 'resistivity' ] # electrical property list. Valid values: 'resistivity', 'conductivity' , 'relPermittivity'\nfreqHzList = [ 1000 ]  # list of frequencies in Hz\n```\n\n - rFact controls the resampling factor used for the atlas. USE INTEGER VALUES\n      - rFact=1: no resampling (highest resolution 1x1x1 mm voxels)\n      - rFact=2: 2x downlampling. resamples, reducing by a factor of 2\n      - ...\n      - rFact=n: nx downlampling. resamples, reducing by a factor of n\n - prop: electrical property to be considered. Valid values: 'resistivity', 'conductivity' , 'relPermittivity'\n - freqHz: frequency in hertz.\n\nIf the user set more than one element per list, one atlas will be generated for each combination. (Imagine there are 3 nested for loops)\n\nInput T1 and T2 MRI images files must be placed inside  `./anatomicalAtlas/staticComponent/inputData` folder. \nIntermediate files will be created inside `./anatomicalAtlas/staticComponent/outputData` and the files of the \natlas will be craeted inside `./anatomicalAtlas/staticComponent/atlas`. These folders can be configured in `.\n/anatomicalAtlas/staticComponent/src/utils.py`\n\nThe output files inside the `./anatomicalAtlas/staticComponent/atlas` folder are:\n\n**File name prefix**\nThe resulting files of the atlas have the prefix `Atlas_[propType]_freq_XXX_RFact_YYY`, where\n - `[propType]` is the property set on `propList` input list\n - `XXX` is the frequency set on `freqHzList` input list\n - `YYY` is the resampling factor set on `rFactList` input list\n - \n1. **HEAD GEOMETRY:** Files related to the geometry of the entire head:\n\n   - `[PREFIX]_Mask.nii` Binary image in NIfTI format with the mask of the entire head, that is, if the voxel lies within the head volume, then the voxels \n     receives a `True` value. These voxels are refered as **valid pixels**\n   - `[PREFIX]_Mask.npy` The same `[PREFIX]_Mask.nii` but in numpy format.\n   - `[PREFIX]_Mask_indices.csv` CSV file with the indices of the valid voxels. Each line is in the form `i,j,k` where the voxel is located at `mask[i,j,k]`\n   - `[PREFIX]_Mask_coords.csv` CSV file with the coords of the valid voxels. Each line is in the form `x,y,z` where the i-th line is associated \n     with the voxel with indices at the same i-th line in `[PREFIX]_Mask_indices.csv`\n  - `[PREFIX]_validPixels.npy` vector with the indices of the valid pixels. The elements of this vectors are computed by collapsing the 3D mask image\n    into one dimension using `numpy.ndarray.flatten('C')` (‘C’ stands for  flattening in row-major (C-style) order.), followed by searching the \n    elements with `True` value.\n  - `[PREFIX]_vascularTerritories.nii` Image in NIfTI format with the segments that define the vascular territories.\n\n     Territory | region value | Territory | region value\n     --- | --- | --- | --- \n     Left Anterior Cerebral Artery |  1  | Right Anterior Cerebral Artery | 2\n     Left Middle Cerebral Artery |  3  | Right Middle Cerebral Artery | 4\n     Left Posterior Cerebral Artery |  5  | Right Posterior Cerebral Artery | 6\n     Left Superior Cerebellar Artery |  7  | Right Superior Cerebellar Artery | 8\n     Stem | 9 | |\n     Left External Carotid Artery | 10  | Right External Carotid Artery | 11\n\n  - `[PREFIX]_vascularTerritories.npy` Equal to `[PREFIX]_vascularTerritories.nii`, but in numpy array and only for valid pixels.\n  \n2. **BRAIN GEOMETRY:** Files related to the geometry of the entire brain volume, defined as Gray matter + White Matter + CSF:\n\n   - `[PREFIX]_BRAIN_Mask.nii` Equal to `[PREFIX]_Mask.nii`, but for GM+WM+CSF volume only.\n   - `[PREFIX]_BRAIN_Mask.npy` Equal to `[PREFIX]_Mask.npy`, but for GM+WM+CSF volume only.\n   - `[PREFIX]_BRAIN_Mask_indices.csv` Equal to `[PREFIX]_Mask_indices.npy`, but for GM+WM+CSF volume only.\n   - `[PREFIX]_BRAIN_Mask_coords.csv` Equal to `[PREFIX]_Mask_coords.npy`, but for GM+WM+CSF volume only.\n   \n3. **SCALP GEOMETRY:** Files related to the geometry of the scalp volume.\n\n   - `[PREFIX]_BRAIN_Mask.nii` Equal to `[PREFIX]_Mask.nii`, but for scalp volume only.\n   - `[PREFIX]_BRAIN_Mask.npy` Equal to `[PREFIX]_Mask.npy`, but for scalp volume only.\n   - `[PREFIX]_BRAIN_Mask_indices.csv` Equal to `[PREFIX]_Mask_indices.npy`, but for scalp volume only.\n   - `[PREFIX]_BRAIN_Mask_coords.csv` Equal to `[PREFIX]_Mask_coords.npy`, but for scalp volume only.\n\n2. **ATLAS STATISTICS:** Files related to the statistics of the atlas\n  \n   - `[PREFIX]_Avg.nii` Average image of the atlas in NIfTI format. The values are in international System of Units (SI)\n   - `[PREFIX]_Avg.npy` Numpy array with the average. The values are in international System of Units (SI). Only valid pixels are stored. See \n     valid pixels below.\n   - `[PREFIX]_CovK.npy` Covariance matrix factor matrix `K` in numpy .npy array fromat. The values are in international System of Units \n     (SI). Only valid pixels are stored. See valid pixels below.\n\n      \u003cimg src=\"https://render.githubusercontent.com/render/math?math=\\Gamma = K^T K\" width=\"100px\"\u003e\n \n   \n#### Dynamic Component of the atlas\n\nThis component is generated by calling\n\n```\npython3 main_dynamicAtlas.py\n```\n\nThe user can edit 1 variable inside this file to specify the type of atlas\n\n```\nrFactList = [ 4 ]  # list with resampling factors. use integer values\n```\n\n - rFact controls the resampling factor used for the atlas. USE INTEGER VALUES\n      - rFact=1: no resampling (highest resolution 1x1x1 mm voxels)\n      - rFact=2: 2x downlampling. resamples, reducing by a factor of 2\n      - ...\n      - rFact=n: nx downlampling. resamples, reducing by a factor of n\n\n   Obs: the user does not specify frequency and property type here because the dynamic atlas is computed in a \n   different way. The type and frequency is specified in another moment.\n\nInput Angiographic MRI images files must be placed inside  `./anatomicalAtlas/dynamicComponent/inputData` folder. \nIntermediate files will be created inside `./anatomicalAtlas/dynamicComponent/outputData` and the files of the \natlas will be craeted inside `./anatomicalAtlas/dynamicComponent/atlas`. These folders can be configured in `.\n/anatomicalAtlas/dynamicComponent/src/utils.py`\n\nThe resulting files of the atlas have the prefix `Atlas_normalized_Rfactor_YYY`, where\n - `YYY` is the resampling factor set on `rFactList` input list\n\nThe output files inside the `./anatomicalAtlas/dynamicComponent/atlas` folder are:\n\n1. **HEAD GEOMETRY:** Files related to the geometry of the entire head:\n\n   - `[PREFIX]_Mask.nii` Same of the static component.\n   - `[PREFIX]_Mask.npy` Same of the static component.\n   - `[PREFIX]_Mask_indices.csv` Same of the static component.\n   - `[PREFIX]_Mask_coords_aligned.csv` Same of the static component.\n  - `[PREFIX]_validPixels.npy` Same of the static component.\n\n2. **BLOOD GEOMETRY:** Files related to the geometry of the arterial tree:\n\n   - `[PREFIX]_BLOOD_Mask.nii` Equal to `[PREFIX]_Mask.nii`, but for arterial tree volume only.\n   - `[PREFIX]_BLOOD_Mask.npy` Equal to `[PREFIX]_Mask.npy`, but for arterial tree volume only.\n   - `[PREFIX]_BLOOD_Mask_indices.csv` Equal to `[PREFIX]_Mask_indices.npy`, but for arterial tree volume only.\n   - `[PREFIX]_BLOOD_Mask_coords.csv` Equal to `[PREFIX]_Mask_coords.npy`, but for arterial tree volume only.\n\n\n#### Electrical impedance tomography example\n\nOne example of usage is provided in the `forwardProblem` folder. It can be called by:\n\n```\npython3 EITmodel.py -i path/to/configurationFile.conf\n```\n\nwhere some configuration files are provided in the `./forwardProblem/inputFiles` directory. In this same directory there is a zip file with the FEM meshes that must be uncompressed.\n\nThe configuration file specifies the solver. Description of the fields are presented in the file.\n\n - The segment of the configuration file associated with the atlas is `EITmodel\u003eAnatomicalAtlas`\n - Frequency of the atlas is configure in the section `EITmodel\u003ecurrent\u003efrequency_Hz`\n - Segment associated with blood flow simulation is `EITmodel\u003eAnatomicalAtlas\u003eopenBF`\n - Segment associated with Visser model is `EITmodel\u003eAnatomicalAtlas\u003evisserModel`\n - Segment associated with the forward problem is `EITmodel\u003eforwardProblem`\n - Segment associated with the FEM mesh is `EITmodel\u003eFEMmodel`\n\n\n","funding_links":[],"categories":["Modeling and Meshes"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FfsmMLK%2FopenSAHE","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FfsmMLK%2FopenSAHE","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FfsmMLK%2FopenSAHE/lists"}