{"id":13689301,"url":"https://github.com/neurolib-dev/neurolib","last_synced_at":"2025-05-01T23:33:41.294Z","repository":{"id":36994502,"uuid":"236208651","full_name":"neurolib-dev/neurolib","owner":"neurolib-dev","description":"Easy whole-brain modeling for computational neuroscientists 🧠💻👩🏿‍🔬","archived":false,"fork":false,"pushed_at":"2024-11-01T15:02:10.000Z","size":61627,"stargazers_count":406,"open_issues_count":22,"forks_count":84,"subscribers_count":9,"default_branch":"master","last_synced_at":"2024-11-01T15:33:40.868Z","etag":null,"topics":["brain-modeling","brain-network","brain-simulations","computational-neuroscience","mean-field-theory","neural-networks","neuroscience","neuroscience-methods"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/neurolib-dev.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","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,"publiccode":null,"codemeta":null}},"created_at":"2020-01-25T18:05:36.000Z","updated_at":"2024-10-25T06:15:35.000Z","dependencies_parsed_at":"2023-02-13T00:15:46.106Z","dependency_job_id":"b25cb6c5-82fe-48ba-9362-1aab7754bfa5","html_url":"https://github.com/neurolib-dev/neurolib","commit_stats":{"total_commits":1275,"total_committers":12,"mean_commits":106.25,"dds":"0.46509803921568627","last_synced_commit":"846c3f7925fa42e63ae2e23ee08e10bbf71146e0"},"previous_names":[],"tags_count":24,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neurolib-dev%2Fneurolib","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neurolib-dev%2Fneurolib/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neurolib-dev%2Fneurolib/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neurolib-dev%2Fneurolib/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/neurolib-dev","download_url":"https://codeload.github.com/neurolib-dev/neurolib/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224282215,"owners_count":17285793,"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":["brain-modeling","brain-network","brain-simulations","computational-neuroscience","mean-field-theory","neural-networks","neuroscience","neuroscience-methods"],"created_at":"2024-08-02T15:01:41.934Z","updated_at":"2025-05-01T23:33:41.287Z","avatar_url":"https://github.com/neurolib-dev.png","language":"Python","funding_links":[],"categories":["Python"],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \t\u003cimg alt=\"Header image of neurolib - A Python simulation framework for\neasy whole-brain neural mass modeling.\" src=\"https://github.com/neurolib-dev/neurolib/raw/master/resources/readme_header.png\" \u003e\n\u003c/p\u003e \n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/neurolib-dev/neurolib/actions\"\u003e\n  \t\u003cimg alt=\"Build\" src=\"https://img.shields.io/github/workflow/status/neurolib-dev/neurolib/ci\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://zenodo.org/badge/latestdoi/236208651\"\u003e\n  \t\u003cimg alt=\"DOI\" src=\"https://zenodo.org/badge/236208651.svg\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://link.springer.com/article/10.1007%2Fs12559-021-09931-9\"\u003e\n    \u003cimg alt=\"paper\" src=\"https://img.shields.io/badge/DOI-10.1007%2Fs12559--021--09931--9-blue\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/neurolib-dev/neurolib/releases\"\u003e\n  \t\u003cimg alt=\"Release\" src=\"https://img.shields.io/github/v/release/neurolib-dev/neurolib\"\u003e\u003c/a\u003e\n  \u003cbr\u003e\n  \u003ca href=\"https://codecov.io/gh/neurolib-dev/neurolib\"\u003e\n  \t\u003cimg alt=\"codecov\" src=\"https://codecov.io/gh/neurolib-dev/neurolib/branch/master/graph/badge.svg\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://pepy.tech/project/neurolib\"\u003e\n  \t\u003cimg alt=\"Downloads\" src=\"https://pepy.tech/badge/neurolib\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/psf/black\"\u003e\n  \t\u003cimg alt=\"Code style: black\" src=\"https://img.shields.io/badge/code%20style-black-000000.svg\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://mybinder.org/v2/gh/neurolib-dev/neurolib.git/master?filepath=examples\"\u003e\n  \t\u003cimg alt=\"Launch in binder\" src=\"https://mybinder.org/badge_logo.svg\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\n\u003c!--include-in-documentation--\u003e\n\n## What is neurolib?\n\n`neurolib` is a simulation and optimization framework for whole-brain modeling. It allows you to implement your own neural mass models which can simulate fMRI BOLD activity. `neurolib` helps you to analyse your simulations, to load and handle structural and functional brain data, and to use powerful evolutionary algorithms to tune your model's parameters and fit it to empirical data.\n\nYou can chose from different neural mass [models](https://github.com/neurolib-dev/neurolib/tree/master/neurolib/models) to simulate the activity of each brain area. The main implementation is a mean-field model of spiking adaptive exponential integrate-and-fire neurons (AdEx) called `ALNModel` where each brain area contains two populations of excitatory and inhibitory neurons. An analysis and validation of the `ALNModel` model can be found in our [paper](https://link.springer.com/article/10.1007%2Fs12559-021-09931-9).\n\n\n\n📚 Please read the [gentle introduction](https://caglorithm.github.io/notebooks/neurolib-intro/) to `neurolib` for an overview of the basic functionality and the science behind whole-brain simulations or read the [documentation](https://neurolib-dev.github.io/) for getting started.\n\nTo browse the source code of `neurolib` visit out [GitHub repository](https://github.com/neurolib-dev/neurolib).\n\n📝 \u003ca href=\"#how-to-cite\"\u003eCite\u003c/a\u003e the following paper if you use `neurolib` for your own research:\n\n\u003e Cakan, C., Jajcay, N. \u0026 Obermayer, K. neurolib: A Simulation Framework for Whole-Brain Neural Mass Modeling. [Cogn. Comput. (2021)](https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1007822). \n\nThe figure below shows a schematic of how a brain network is constructed:\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/neurolib-dev/neurolib/raw/master/resources/pipeline.jpg\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\nExamples:\n\u003ca href=\"#single-node\"\u003eSingle node simulation\u003c/a\u003e ·\n\u003ca href=\"#whole-brain-network\"\u003eWhole-brain network\u003c/a\u003e ·\n\u003ca href=\"#parameter-exploration\"\u003eParameter exploration\u003c/a\u003e ·\n\u003ca href=\"#evolutionary-optimization\"\u003eEvolutionary optimization\u003c/a\u003e\n\u003cbr\u003e\u003cbr\u003e    \n    \n\u003c/p\u003e\n\n## Whole-brain modeling\n\nTypically, in whole-brain modeling, diffusion tensor imaging (DTI) is used to infer the structural connectivity (the connection strengths) between different brain areas. In a DTI scan, the direction of the diffusion of molecules is measured across the whole brain. Using [tractography](https://en.wikipedia.org/wiki/Tractography), this information can yield the distribution of axonal fibers in the brain that connect distant brain areas, called the connectome. Together with an atlas that divides the brain into distinct areas, a matrix can be computed that encodes how many fibers go from one area to another, the so-called structural connectivity (SC) matrix. This matrix defines the coupling strengths between brain areas and acts as an adjacency matrix of the brain network. The fiber length determines the signal transmission delay between all brain areas. Combining the structural data with a computational model of the neuronal activity of each brain area, we can create a dynamical model of the whole brain.\n\nThe resulting whole-brain model consists of interconnected brain areas, with each brain area having their internal neural dynamics. The neural activity can also be used to simulate hemodynamic [BOLD](https://en.wikipedia.org/wiki/Blood-oxygen-level-dependent_imaging) activity using the Balloon-Windkessel model, which can be compared to empirical fMRI data. Often, BOLD activity is used to compute correlations of activity between brain areas, the so called [resting state functional connectivity](https://en.wikipedia.org/wiki/Resting_state_fMRI#Functional), resulting in a matrix with correlations between each brain area. This matrix can then be fitted to empirical fMRI recordings of the resting-state activity of the brain.\n\n\nBelow is an animation of the neuronal activity of a whole-brain model plotted on a brain.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/neurolib-dev/neurolib/raw/master/resources/brain_slow_waves_small.gif\"\u003e\n\u003c/p\u003e\n\n## Installation\n\nThe easiest way to get going is to install the pypi package using `pip`:\n\n```\npip install neurolib\n```\nAlternatively, you can also clone this repository and install all dependencies with\n\n```\ngit clone https://github.com/neurolib-dev/neurolib.git\ncd neurolib/\npip install -r requirements.txt\npip install .\n```\nIt is recommended to clone or fork the entire repository since it will also include all examples and tests.\n\n## Project layout\n\n```\nneurolib/\t \t\t\t\t# Main module\n├── models/ \t\t\t\t\t# Neural mass models\n\t├──model.py \t\t\t\t# Base model class\n\t└── /.../ \t\t\t\t# Implemented mass models\n├── optimize/ \t\t\t\t\t# Optimization submodule\n\t├── evolution/ \t\t\t\t# Evolutionary optimization\n\t└── exploration/ \t\t\t# Parameter exploration\n├── control/optimal_control/\t\t\t# Optimal control submodule\n\t├── oc.py \t\t\t\t# Optimal control base class\n\t├── cost_functions.py \t\t\t# cost functions for OC\n\t├── /.../ \t\t\t\t# Implemented OC models\n├── data/ \t\t\t\t\t# Empirical datasets (structural, functional)\n├── utils/\t\t\t\t\t# Utility belt\n\t├── atlases.py\t\t\t\t# Atlases (Region names, coordinates)\n\t├── collections.py\t\t\t# Custom data types\n\t├── functions.py \t\t\t# Useful functions\n\t├── loadData.py\t\t\t\t# Dataset loader\n\t├── parameterSpace.py\t\t\t# Parameter space\n\t├── saver.py \t\t\t\t# Save simulation outputs\n\t├── signal.py\t\t\t\t# Signal processing functions\n\t└── stimulus.py \t\t\t# Stimulus construction\n├── examples/\t\t\t\t\t# Example Jupyter notebooks\n├── docs/\t\t\t\t\t# Documentation \n└── tests/\t\t\t\t\t# Automated tests\n\n```\n\n## Examples\n\nExample [IPython Notebooks](examples/) on how to use the library can be found in the `./examples/` directory, don't forget to check them out! You can run the examples in your browser using Binder by clicking [here](https://mybinder.org/v2/gh/neurolib-dev/neurolib.git/master?filepath=examples) or one of the following links:\n\n- [Example 0.0](https://mybinder.org/v2/gh/neurolib-dev/neurolib/master?filepath=examples%2Fexample-0-aln-minimal.ipynb) - Basic use of the `aln` model\n- [Example 0.3](https://mybinder.org/v2/gh/neurolib-dev/neurolib/master?filepath=examples%2Fexample-0.3-fhn-minimal.ipynb) - Fitz-Hugh Nagumo model `fhn` on a brain network\n- [Example 0.6](https://mybinder.org/v2/gh/neurolib-dev/neurolib/master?filepath=examples%2Fexample-0.6-custom-model.ipynb) - Minimal example of how to implement your own model in `neurolib`\n- [Example 1.2](https://mybinder.org/v2/gh/neurolib-dev/neurolib/master?filepath=examples%2Fexample-1.2-brain-network-exploration.ipynb) - Parameter exploration of a brain network and fitting to BOLD data\n- [Example 2.0](https://mybinder.org/v2/gh/neurolib-dev/neurolib/master?filepath=examples%2Fexample-2-evolutionary-optimization-minimal.ipynb) - A simple example of the evolutionary optimization framework \n- [Example 5.2](https://mybinder.org/v2/gh/neurolib-dev/neurolib/master?filepath=examples%2Fexample-5.2-oc-wc-model-deterministic.ipynb) - Example of optimal control of the noise-free Wilson-Cowan model\n\nA basic overview of the functionality of `neurolib` is also given in the following. \n\n### Single node\n\nThis example is available in detail as a [IPython Notebook](examples/example-0-aln-minimal.ipynb). \n\nTo create a single `aln` model with the default parameters, simply run\n\n```python\nfrom neurolib.models.aln import ALNModel\n\nmodel = ALNModel()\nmodel.params['sigma_ou'] = 0.1 # add some noise\n\nmodel.run()\n```\n\nThe results from this small simulation can be plotted easily:\n\n```python\nimport matplotlib.pyplot as plt\nplt.plot(model.t, model.output.T)\n\n```\n\u003cp align=\"left\"\u003e\n  \u003cimg src=\"https://github.com/neurolib-dev/neurolib/raw/master/resources/single_timeseries.png\"\u003e\n\u003c/p\u003e\n\n### Whole-brain network\n\nA detailed example is available as a [IPython Notebook](examples/example-0-aln-minimal.ipynb). \n\nTo simulate a whole-brain network model, first we need to load a DTI and a resting-state fMRI dataset. `neurolib` already provides some example data for you:\n\n```python\nfrom neurolib.utils.loadData import Dataset\n\nds = Dataset(\"gw\")\n```\nThe dataset that we just loaded, looks like this:\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/neurolib-dev/neurolib/raw/master/resources/gw_data.png\"\u003e\n\u003c/p\u003e\n\nWe initialize a model with the dataset and run it:\n\n```python\nmodel = ALNModel(Cmat = ds.Cmat, Dmat = ds.Dmat)\nmodel.params['duration'] = 5*60*1000 # in ms, simulates for 5 minutes\n\nmodel.run(bold=True)\n```\nThis can take several minutes to compute, since we are simulating 80 brain regions for 5 minutes realtime. Note that we specified `bold=True` which simulates the BOLD model in parallel to the neuronal model. The resulting firing rates and BOLD functional connectivity looks like this:\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/neurolib-dev/neurolib/raw/master/resources/gw_simulated.png\"\u003e\n\u003c/p\u003e\n\nThe quality of the fit of this simulation can be computed by correlating the simulated functional connectivity matrix above to the empirical resting-state functional connectivity for each subject of the dataset. This gives us an estimate of how well the model reproduces inter-areal BOLD correlations. As a rule of thumb, a value above 0.5 is considered good. \n\nWe can compute the quality of the fit of the simulated data using `func.fc()` which calculates a functional connectivity matrix of `N` (`N` = number of brain regions) time series. We use `func.matrix_correlation()` to compare this matrix to empirical data.\n\n```python\nscores = [func.matrix_correlation(func.fc(model.BOLD.BOLD[:, 5:]), fcemp) for fcemp in ds.FCs]\n\nprint(\"Correlation per subject:\", [f\"{s:.2}\" for s in scores])\nprint(f\"Mean FC/FC correlation: {np.mean(scores):.2}\")\n```\n```\nCorrelation per subject: ['0.34', '0.61', '0.54', '0.7', '0.54', '0.64', '0.69', '0.47', '0.59', '0.72', '0.58']\nMean FC/FC correlation: 0.58\n```\n### Parameter exploration\nA detailed example of a single-node exploration is available as a [IPython Notebook](examples/example-1-aln-parameter-exploration.ipynb). For an example of a brain network exploration, see [this Notebook](examples/example-1.2-brain-network-exploration.ipynb).\n\nWhenever you work with a model, it is of great importance to know what kind of dynamics it exhibits given a certain set of parameters. It is often useful to get an overview of the state space of a given model of interest. For example in the case of `aln`, the dynamics depends a lot on the mean inputs to the excitatory and the inhibitory population. `neurolib` makes it very easy to quickly explore parameter spaces of a given model:\n\n```python\n# create model\nmodel = ALNModel()\n# define the parameter space to explore\nparameters = ParameterSpace({\"mue_ext_mean\": np.linspace(0, 3, 21),  # input to E\n\t\t\"mui_ext_mean\": np.linspace(0, 3, 21)}) # input to I\n\n# define exploration              \nsearch = BoxSearch(model, parameters)\n\nsearch.run()                \n```\nThat's it!. You can now use the builtin functions to load the simulation results from disk and perform your analysis:\n\n```python\nsearch.loadResults()\n\n# calculate maximum firing rate for each parameter\nfor i in search.dfResults.index:\n    search.dfResults.loc[i, 'max_r'] = np.max(search.results[i]['rates_exc'][:, -int(1000/model.params['dt']):])\n```\nWe can plot the results to get something close to a bifurcation diagram!\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/neurolib-dev/neurolib/raw/master/resources/exploration_aln.png\"\u003e\n\u003c/p\u003e\n\n### Evolutionary optimization\n\nA detailed example is available as a [IPython Notebook](examples/example-2-evolutionary-optimization-minimal.ipynb). \n\n`neurolib` also implements evolutionary parameter optimization, which works particularly well with brain networks. In an evolutionary algorithm, each simulation is represented as an individual and the parameters of the simulation, for example coupling strengths or noise level values, are represented as the genes of each individual. An individual is a part of a population. In each generation, individuals are evaluated and ranked according to a fitness criterion. For whole-brain network simulations, this could be the fit of the simulated activity to empirical data. Then, individuals with a high fitness value are `selected` as parents and `mate` to create offspring. These offspring undergo random `mutations` of their genes. After all offspring are evaluated, the best individuals of the population are selected to transition into the next generation. This process goes on for a given amount generations until a stopping criterion is reached. This could be a predefined maximum number of generations or when a large enough population with high fitness values is found. \n\nAn example genealogy tree is shown below. You can see the evolution starting at the top and individuals reproducing generation by generation. The color indicates the fitness.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/neurolib-dev/neurolib/raw/master/resources/evolution_tree.png\", width=\"400\"\u003e\n\u003c/p\u003e\n\n`neurolib` makes it very easy to set up your own evolutionary optimization and everything else is handled under the hood. You can chose between two implemented evolutionary algorithms: `adaptive` is a gaussian mutation and rank selection algorithm with adaptive step size that ensures convergence (a schematic is shown in the image below). `nsga2` is an implementation of the popular multi-objective optimization algorithm by Deb et al. 2002. \n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/neurolib-dev/neurolib/raw/master/resources/evolutionary-algorithm.png\", width=\"400\"\u003e\n\u003c/p\u003e\n\nOf course, if you like, you can dig deeper, define your own selection, mutation and mating operators. In the following demonstration, we will simply evaluate the fitness of each individual as the distance to the unit circle. After a couple of generations of mating, mutating and selecting, only individuals who are close to the circle should survive:\n\n```python\nfrom neurolib.utils.parameterSpace import ParameterSpace\nfrom neurolib.optimize.evolution import Evolution\n\ndef optimize_me(traj):\n    ind = evolution.getIndividualFromTraj(traj)\n    \n    # let's make a circle\n    fitness_result = abs((ind.x**2 + ind.y**2) - 1)\n    \n    # gather results\n    fitness_tuple = (fitness_result ,)\n    result_dict = {\"result\" : [fitness_result]}\n    \n    return fitness_tuple, result_dict\n    \n# we define a parameter space and its boundaries\npars = ParameterSpace(['x', 'y'], [[-5.0, 5.0], [-5.0, 5.0]])\n\n# initialize the evolution and go\nevolution = Evolution(optimize_me, pars, weightList = [-1.0], POP_INIT_SIZE= 100, POP_SIZE = 50, NGEN=10)\nevolution.run()    \n```\n\nThat's it! Now we can check the results:\n\n```python\nevolution.loadResults()\nevolution.info(plot=True)\n```\n\nThis will gives us a summary of the last generation and plots a distribution of the individuals (and their parameters). Below is an animation of 10 generations of the evolutionary process. Ass you can see, after a couple of generations, all remaining individuals lie very close to the unit circle.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/neurolib-dev/neurolib/raw/master/resources/evolution_animated.gif\"\u003e\n\u003c/p\u003e\n\n### Optimal control\nThe optimal control module enables to compute efficient stimulation for your neural model. If you know how your output should look like, this module computes the optimal input. Detailes example notebooks can be found in the [example folder](https://github.com/neurolib-dev/neurolib/tree/master/examples) (examples 5.1, 5.2, 5.3, 5.4). In optimal control computations, you trade precision with respect to a target against control strength. You can determine how much each contribution affects the results, by setting weights accordingly.\n\nTo compute an optimal control signal, you need to create a model (e.g., an FHN model) and define a target state (e.g., a sine curve with period 2).\n```python\nfrom neurolib.models.fhn import FHNModel\nmodel = FHNModel()\n\nduration = 10.\nmodel.params[\"duration\"] = duration\ndt = model.params[\"dt\"]\n\nperiod = 2.\ntarget = np.sin(2. * np.pi * np.arange(0, duration+dt, dt) / period)\n```\nYou can then create a controlled model and run the iterative optimization to find the most efficient control input. The optimal control and the controlled model activity can be taken from the controlled model.\n```python\nmodel_controlled = oc_fhn.OcFhn(model, target)\nmodel_controlled.optimize(500) # run 500 iterations\noptimal_control = model_controlled.control\noptimal_state = model_controlled.get_xs()\n```\n\nFor a comprehensive study on optimal control of the Wilson-Cowan model based on the neurolib optimal control module, see Salfenmoser, L. \u0026 Obermayer, K. Optimal control of a Wilson–Cowan model of neural population dynamics. Chaos 33, 043135 (2023). https://doi.org/10.1063/5.0144682.\n\n## More information\n\n### Built With\n\n`neurolib` is built using other amazing open source projects:\n\n* [pypet](https://github.com/SmokinCaterpillar/pypet) - Python parameter exploration toolbox\n* [deap](https://github.com/DEAP/deap) - Distributed Evolutionary Algorithms in Python\n* [numpy](https://github.com/numpy/numpy) - The fundamental package for scientific computing with Python\n* [numba](https://github.com/numba/numba) - NumPy aware dynamic Python compiler using LLVM\n* [Jupyter](https://github.com/jupyter/notebook) - Jupyter Interactive Notebook\n\n### How to cite\nCakan, C., Jajcay, N. \u0026 Obermayer, K. neurolib: A Simulation Framework for Whole-Brain Neural Mass Modeling. Cogn. Comput. (2021). https://doi.org/10.1007/s12559-021-09931-9\n```bibtex\n@article{cakan2021,\n    author={Cakan, Caglar and Jajcay, Nikola and Obermayer, Klaus},\n    title={neurolib: A Simulation Framework for Whole-Brain Neural Mass Modeling},\n    journal={Cognitive Computation},\n    year={2021},\n    month={Oct},\n    issn={1866-9964},\n    doi={10.1007/s12559-021-09931-9},\n    url={https://doi.org/10.1007/s12559-021-09931-9}\n}\n```\n\n### Get in touch\n\nCaglar Cakan (cakan@ni.tu-berlin.de)  \nDepartment of Software Engineering and Theoretical Computer Science, Technische Universität Berlin, Germany  \nBernstein Center for Computational Neuroscience Berlin, Germany \n\n### Acknowledgments\nThis work was supported by the Deutsche Forschungsgemeinschaft (DFG, German Research Foundation) with the project number 327654276 (SFB 1315) and the Research Training Group GRK1589/2.\n\nThe optimal control module was developed by Lena Salfenmoser and Martin Krück supported by the DFG project 163436311 (SFB 910).\n\n\u003c!--end-include-in-documentation--\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fneurolib-dev%2Fneurolib","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fneurolib-dev%2Fneurolib","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fneurolib-dev%2Fneurolib/lists"}