diff --git a/SSBtoolkit-Tutorial1-EBRAINS.ipynb b/SSBtoolkit-Tutorial1-EBRAINS.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..f168044cd983f5ed297bf310989ff981a289b0d3
--- /dev/null
+++ b/SSBtoolkit-Tutorial1-EBRAINS.ipynb
@@ -0,0 +1,482 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "ebbbd7d9",
+   "metadata": {},
+   "source": [
+    "<div style=\"padding-bottom:50px\">\n",
+    "<img src=\"https://res.cloudinary.com/djz27k5hg/image/upload/v1637335206/logos/Logo_des_Forschungszentrums_J_C3_BClich_seit_2018_hcliq4.svg\"  width=250 align='left' style=\"margin-top:30px\"/>\n",
+    "<img src=\"https://res.cloudinary.com/djz27k5hg/image/upload/v1637657234/logos/HBP_horizontal_logo_qtcyzn.png\" width=\"300\" align='left' style=\"margin-left:50px\">\n",
+    "<img src=\"https://res.cloudinary.com/djz27k5hg/image/upload/v1637333672/logos/ebrains_logo_tndl7p.svg\" width=\"280\" align='left' style=\"margin-left:50px; margin-top:25px\">\n",
+    "</div> \n",
+    "\n",
+    "<br><br><br><br>\n",
+    "\n",
+    "# Simulation of dose-response curves of agonists using affinity values\n",
+    "\n",
+    "In this tutorial we will simulate a mathematical model of a signaling pathway to obtain dose-response curves, from wich  *potency (EC<sub>50</sub>)* values of agonists can be infered. \n",
+    "\n",
+    "\n",
+    "## <span style=\"color:red\">This tutorial just works specifically on EBRAINS</span>\n",
+    "\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "f0984b4a",
+   "metadata": {},
+   "source": [
+    "## Install Dependencies"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "bc7afa75",
+   "metadata": {},
+   "source": [
+    "### Install on SSB toolkit on Google Colab"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "d7c956eb",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "pip install -r SSBtoolkit/requirements.txt"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "0d2bec33",
+   "metadata": {},
+   "source": [
+    "### Import Dependencies"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "e344d8de",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "#Import Python dependencies\n",
+    "import os, sys, json, math, site\n",
+    "import numpy as np\n",
+    "import pandas as pd\n",
+    "import seaborn as sns\n",
+    "import matplotlib.pyplot as plt\n",
+    "\n",
+    "from sklearn.linear_model import LinearRegression\n",
+    " \n",
+    "from src.lib.ssbtoolkit import convert, get, simulation"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "c123810d",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "#Setting BioNetGen environment path\n",
+    "distpath = '/opt/app-root/src/.local/lib/python3.8/site-packages/'\n",
+    "BioNetGen=os.path.join(distpath, 'bionetgen/bng-linux:')\n",
+    "mypath=%env PATH\n",
+    "newpath=BioNetGen+mypath\n",
+    "%env PATH=$newpath"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "66d54bde",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "#Test bioservices\n",
+    "from bioservices import UniProt\n",
+    "u = UniProt(verbose=False)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "ec421692",
+   "metadata": {},
+   "source": [
+    "## Load experimental data"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "184abec2",
+   "metadata": {},
+   "source": [
+    "Once the SSBtoolkit environment is set up we are ready to start to simulate.\n",
+    "\n",
+    "We will begin by loading the affinity data of some selective agonists of the Adenosine 2A receptor. The experimental affinity data was taken from *([Varani, K. et al., 2015](https://doi.org/10.1021/acs.jmedchem.5b00215))*. This data can be found in `examples/data.csv`."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "be92204e",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "data = pd.read_csv('example/A2AR_binding_data.csv')\n",
+    "data"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "b75c81c0",
+   "metadata": {},
+   "source": [
+    "Commonly, the experimental affinity values come in different \"flavors\". \n",
+    "\n",
+    "The SSB framework just accepts affinity values as pK<sub>d</sub>. Since the affinity values in our data set is repported as K<sub>i</sub> and EC<sub>50</sub> and we need to convert them to pK<sub>i</sub> and pEC<sub>50</sub> repectively.\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "b26bfc66",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "data['pKi'] = data.Ki.apply(lambda x: -np.log10(x*1E-6))\n",
+    "data['pEC50']=data.EC50.apply(lambda x: -np.log10(x*1E-6))\n",
+    "data"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "05c44c9d",
+   "metadata": {},
+   "source": [
+    "## Selection of the signaling pathway \n",
+    "\n",
+    "The core of the SSB framework is, naturally, the mathematical models of the GPCRs' signaling pathways. \n",
+    "\n",
+    "Since G-protein sub-families are classified by their $\\alpha$ subunits, this classfication as been served to identify their signaling pathways:\n",
+    "* G<sub>s</sub>\n",
+    "* G<sub>i/o</sub>\n",
+    "* G<sub>q/11</sub>\n",
+    "* G<sub>12/13</sub>\n",
+    "\n",
+    "📖 See [The SSB toolkit](https://github.com/rribeiro-sci/SSBtoolkit/blob/main/docs/ssb_toolkit.md) documentation for more details.\n",
+    "\n",
+    "We can define manualy the G$\\alpha$ pathway we want to work with, or simply query our internal database of human GPCR pathways using the UNIPROT id of our receptor using the SSBtoolkit built-in function `get.gprotein()`. The UNIPROT id for the human Adenosine A2 receptot is [P29274](https://www.uniprot.org/uniprot/P29274)."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "a6d7dcb1",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "uniprotID = 'P29274'\n",
+    "gprotein = get.gprotein(uniprotID)\n",
+    "gprotein"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "9393b0cb",
+   "metadata": {},
+   "source": [
+    "<span style=\"color:black\">⚠️ WARNING: our toolkit was specifically design for human GPCRs. The quering for pathways for GPCRs other than Human may be included in the future. However, if you want to study a non-human GPCR you can still use the SSB toolkit by setting manually the G$\\alpha$ pathway.</span>\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "b555bc6f",
+   "metadata": {},
+   "source": [
+    "##  Preparation, Simulation and Analysis\n",
+    "\n",
+    "To obtain a dose-response curve from the simulation of signaling pathways, individual simulations of the pathway according to a series of ligand concentrations must be performed (as it would be done in the wet-lab).  \n",
+    "\n",
+    "To define an array of ligand concentrations we will use a geometric progression. The reason why we use a geometric progression is due to the impact of the dilution fraction on the accuracy of K<sub>d</sub> and EC<sub>50</sub>/IC<sub>50</sub> values experimentally estimated. This factor, that defines the spacing between the adjacent concentration values, has an impact on the concentration values that are on the linear portion of the curve. Therefore, using a geometric progression we can mimic the experimental conditions where each concentration equals to the power of 2 of the previous lowest concentration *([Sebaugh, J.L., 2011](https://doi.org/10.1002/pst.426))*\n",
+    "\n",
+    "<span style=\"color:black\"> ⚠️ WARNING: the SSB toolkit uses μM as default concentration units.</span>\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "252c3fe8",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# setting the range of ligand concentrations\n",
+    "lig_conc_min = 1E-4 # μM\n",
+    "lig_conc_max = 1E4  # μM\n",
+    "lig_conc_range = np.geomspace(lig_conc_min, lig_conc_max, 20) # 20 concentration values"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "a4cf0857",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "lig_conc_range"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "0dbc3673",
+   "metadata": {},
+   "source": [
+    "SSB simulations are also sensible to the concentration of the protein, wich must be, again, in <b><i>μM</i></b>. However, the  concentration values reported in functional assays comes, commonly, in <b><i>μg</i></b> of protein.\n",
+    "\n",
+    "The experimental data we are using was obtained from a functional assay using 50 <b><i>μg</i></b> of protein. We can use the SSBtoolkit built-in function `convert.microgr2nanomolar()` to convert  <b><i>μg</i></b> of protein in <b><i>μM</i></b>."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "ca0b4a08",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# the following function takes as input the UniProtID and the concentration in μg.\n",
+    "prot_conc = convert.microgr2nanomolar(uniprotID, 50) \n",
+    "print(prot_conc, 'μM')"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "8f795fe7",
+   "metadata": {},
+   "source": [
+    "Finnaly, we need to define the length and number of time steps (resolution) of the simulation. "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "4cdacd1a",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "time = 10000  # time of simulation in seconds\n",
+    "nsteps = 1000   # number of time steps"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "ba2bc317",
+   "metadata": {},
+   "source": [
+    "## Integration of ODEs \n",
+    "\n",
+    "After having defined all the simulation parameters we are ready to proceed with the simulations. A simulation of a methamatical model of a signaling pathway consists of the integration of a set of ordinary differential equations (ODEs) as function of time. Since each ODE represents a molecular event of the signaling pathway, when integrated over time, such equations can describe how the concentration of species inside the model changes over time. The key point of this tutorial is the use of the drug-receptor affinity value (K<sub>d</sub>) to fire up the model. With the K<sub>d</sub> values one can calculate the fraction of receptors that are occupied by the ligand in the equilibrium and, according to the *occupancy theory*, the fraction of occupied receptors represents the concentration of activated receptors in the equilibrium *([Kenakin T., 2004 ](https://doi.org/10.1016/j.tips.2004.02.012))*. 📖 Read the [Docs](https://github.com/rribeiro-sci/SSBtoolkit/blob/main/docs/ssb_toolkit.md) for more details.\n",
+    "\n",
+    "\n",
+    "In this tutorial we want to simulate dose-response curves of agonists towards Adenosine A2 receptor, so, we will use the SSBtoolkit built-in class `simulation.activation()`. \n",
+    "\n",
+    "\n",
+    "<span style='color:black'>ℹ️ If you want study antagonists follow the tutorial [Simulation of dose-responses curves of antagonists](https://github.com/rribeiro-sci/SSBtoolkit/blob/main/SSBtoolkit_Tutorial2.ipynb).</span>"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "5b3bf63d",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# we will start by creating a simulation instance.\n",
+    "sim = simulation.activation()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "c1ae3b1f",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# configuration of simulation parameters\n",
+    "sim.SetSimulationParameters(ligands=data.id.to_list()[:2], \n",
+    "                            affinities=data.pKi.to_list()[:2], \n",
+    "                            pathway=gprotein, \n",
+    "                            receptor_conc=prot_conc,\n",
+    "                            lig_conc_range=lig_conc_range, \n",
+    "                            ttotal=time, \n",
+    "                            nsteps=nsteps,  \n",
+    "                            binding_kinetics=False)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "5f8df280",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "#Start the simulation\n",
+    "sim.Run()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "697afeef",
+   "metadata": {},
+   "source": [
+    "In the end, the concentration values of the species of the signaling pathway over the simulation time will be saved inside the instance.\n",
+    "\n",
+    "The response of a signaling pathway is, naturally, represented by the increase or decrease of one of the species described by the model. So, to predict the dose-response curve we need, firstly, to extract the maximum concentration value orbserved for one specie from each individual simulation (from the series of simulations for each ligand concentration). Then, such values will be fitted to a logistic regression. \n",
+    "\n",
+    "To achieve this, we will use the analysis function:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "8b21a9a2",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "sim.Analysis()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "37fb6a47",
+   "metadata": {},
+   "source": [
+    "We can now to plot the dose-response curves:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "6aeba621",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "sim.Curve()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "5291e364",
+   "metadata": {},
+   "source": [
+    "Finnaly, from the dose-response curves we can interpolate the EC<sub>50</sub> values."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "dcc07180",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "sim.Potency()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "561e9437",
+   "metadata": {},
+   "source": [
+    "💡 The potency predicted values can be exported as a python dictionary using the function `sim.PotencyToDict()` or saved in a csv file: `sim.PotencyToCSV()`. \n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "e9076090",
+   "metadata": {},
+   "source": [
+    "## Save results on Google Drive"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "00a87ac7",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from google.colab import drive\n",
+    "drive.mount('/gdrive')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "6cea1600",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "sim.PotencyToCSV(path='/gdrive/MyDrive/XX') ## change XX accordingly. "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "ee42b0a5",
+   "metadata": {},
+   "source": [
+    "## Congratulations! \n",
+    "\n",
+    "Congratulations on completing this tutorial notebook! If you enjoyed working through the tutorial, and want to continue working with SSBtoolkit, we encourage you to finish the rest of the tutorials in this series. \n",
+    "\n",
+    "## Cite Us\n",
+    "\n",
+    "If you use or adapt this tutorial for your own research projects please cite us.\n",
+    "\n",
+    "```\n",
+    "@article{XXX,\n",
+    "    title={XXX},\n",
+    "    author={XXX},\n",
+    "    publisher={XXX},\n",
+    "    note={\\url{XXX}},\n",
+    "    year={XXX}\n",
+    "}\n",
+    "```\n",
+    "\n",
+    "\n",
+    "\n",
+    "## Acknowledgments\n",
+    "\n",
+    "EU Human Brain Project (SGA1 and SGA2): This open source software was developed in part in the Human Brain Project funded from the European Union's Horizon 2020 Framework Programme for Research and Innovation under Specific Grant Agreements No 720270 and No. 78907 (Human Brain Project SGA1 and SGA2).\n",
+    "\n",
+    "<div style=\"padding-bottom:50px\">\n",
+    "<img src=\"https://res.cloudinary.com/djz27k5hg/image/upload/v1637657234/logos/HBP_horizontal_logo_qtcyzn.png\" width=\"300\" align='left' style=\"margin-left:50px\">\n",
+    "    <img src=\"https://res.cloudinary.com/djz27k5hg/image/upload/v1642677502/logos/COFUNDED_EU_j2ktlp.jpg\" width=\"300\" align='left' style=\"margin-left:50px\">\n",
+    "</div>  "
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.9.13"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/src/lib/ssbtoolkit.py b/src/lib/ssbtoolkit.py
index 4f2ba5a72a2e1fecc510e4d38b5dd5dc3c4702c6..1c6ef2e357fa0a473e0298c4ec912df49d65511e 100644
--- a/src/lib/ssbtoolkit.py
+++ b/src/lib/ssbtoolkit.py
@@ -45,7 +45,7 @@ from pysb.macros import *
 from pysb.simulator import ScipyOdeSimulator
 
 #Layout libraries
-import qgrid 
+#import qgrid 
 
 #directories (problem with sphinx)
 abs_path=(os.path.join(os.path.split(os.getcwd())[0], 'src/lib'))
@@ -573,6 +573,7 @@ class simulation:
 
             .. warning:: this functions requires the qgrid library. It doens't work on Google Colab.
             """
+            import qgrid
             self._DefaultPathwayParametersDataFrame =  pd.read_csv('src/lib/pathways/{}_parameters.csv'.format(self._pathway))
 
             col_opts = { 'editable': False, 'sortable':False}
@@ -586,6 +587,7 @@ class simulation:
 
             :parameter path:     Required (kwarg str): directory path
             """
+            import qgrid
             self._DefaultPathwayParametersDataFrame =  pd.read_csv(path)
             col_opts = { 'editable': False, 'sortable':False}
             col_defs = {'Value': { 'editable': True, 'width': 150 }}
@@ -973,6 +975,7 @@ class simulation:
 
             .. warning:: this functions requires the qgrid library. It doens't work on Google Colab.
             """
+            import qgrid
             self._DefaultPathwayParametersDataFrame =  pd.read_csv('src/lib/pathways/{}_parameters.csv'.format(self._pathway))
 
             col_opts = { 'editable': False, 'sortable':False}
@@ -986,6 +989,7 @@ class simulation:
 
             :parameter path:     Required (kwarg str): directory path
             """
+            import qgrid
             self._DefaultPathwayParametersDataFrame =  pd.read_csv(path)
             col_opts = { 'editable': False, 'sortable':False}
             col_defs = {'Value': { 'editable': True, 'width': 150 }}
@@ -1379,6 +1383,7 @@ class simulation:
 
             .. warning:: this functions requires the qgrid library. It doens't work on Google Colab.
             """
+            import qgrid
             self._DefaultPathwayParametersDataFrame =  pd.read_csv('src/lib/pathways/{}_parameters.csv'.format(self._pathway))
 
             col_opts = { 'editable': False, 'sortable':False}
@@ -1392,6 +1397,7 @@ class simulation:
 
             :parameter path:     Required (kwarg str): directory path
             """
+            import qgrid
             self._DefaultPathwayParametersDataFrame =  pd.read_csv(path)
             col_opts = { 'editable': False, 'sortable':False}
             col_defs = {'Value': { 'editable': True, 'width': 150 }}