Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

major update #1

Merged
merged 37 commits into from
Jan 28, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions .idea/SEPAL.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions .idea/codeStyles/Project.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions .idea/codeStyles/codeStyleConfig.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions .idea/inspectionProfiles/profiles_settings.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 10 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,25 +15,25 @@ Created 28 September 2020
- Fit signal enhancement using pharmacokinetic model
- Pharmacokinetic models: steady-state, Patlak, extended Tofts, Tofts, 2CXM, 2CUM
- AIFs: patient-specific (measured), Parker, bi-exponential Parker
- Fitting an AIF time delay
- Fitting free AIF time delay parameter
- Relaxivity models: linear
- Signal models: spoiled gradient echo
- Water exchange models: FXL, NXL, NXL_be
- T1 fitting using variable flip angle method, IR-SPGR and DESPOT1-HIFI

### Not yet implemented/limitations:
- Generally untested. Not optimised for speed or robustness.
- Additional pharmacokinetic models (add by inheriting from pk_model class)
- Additional relaxivity models (add by inheriting from c_to_r_model class)
- Additional AIF functions (add by inheriting from aif class)
- Additional water exchange models, e.g. 3S2X, 2S1X (add by inheriting from water_ex_model class)
- Additional signal models (add by inheriting from signal_model class)
- Additional pharmacokinetic models (add by inheriting from PkModel class)
- Additional relaxivity models (add by inheriting from CRModel class)
- Additional water exchange models, e.g. 3S2X, 2S1X (add by inheriting from WaterExModel class)
- Additional signal models (add by inheriting from SignalModel class)
- R2/R2* effects not included in fitting of enhancement curves (but is included for enhancement-to-concentration conversion)
- Compartment-specific relaxivity parameters/models
- Fitting free water exchange parameters
- Special model implementations, e.g. linear and graphical versions of Patlak model

TODO:
- Convert fitting functions to OO methods. Add image processing functions.
- Parallel
- Calculate IRF integrals exactly.
### TODO:
- linear Patlak model
- option to truly constrain k in HIFI fit
- fast C calculation for SPGR with r2=0
- inversion recovery T1 measurement
Binary file added demo/DCE_ROI_data/k_tissue.npy
Binary file not shown.
Binary file added demo/DCE_ROI_data/k_vif.npy
Binary file not shown.
Binary file added demo/DCE_ROI_data/signal_tissue.npy
Binary file not shown.
Binary file added demo/DCE_ROI_data/signal_vif.npy
Binary file not shown.
Binary file added demo/DCE_ROI_data/t1_tissue.npy
Binary file not shown.
Binary file added demo/DCE_ROI_data/t1_vif.npy
Binary file not shown.
Binary file added demo/T1_data/FA12.nii.gz
Binary file not shown.
Binary file added demo/T1_data/FA2.nii.gz
Binary file not shown.
Binary file added demo/T1_data/FA5.nii.gz
Binary file not shown.
Binary file added demo/T1_data/TI_1068ms.nii.gz
Binary file not shown.
Binary file added demo/T1_data/TI_168ms.nii.gz
Binary file not shown.
Binary file added demo/T1_data/mask.nii.gz
Binary file not shown.
296 changes: 296 additions & 0 deletions demo/demo_aif_module.ipynb

Large diffs are not rendered by default.

545 changes: 545 additions & 0 deletions demo/demo_fit_dce.ipynb

Large diffs are not rendered by default.

465 changes: 465 additions & 0 deletions demo/demo_fit_t1.ipynb

Large diffs are not rendered by default.

440 changes: 440 additions & 0 deletions demo/demo_pk_models.ipynb

Large diffs are not rendered by default.

116 changes: 116 additions & 0 deletions demo/demo_relaxivity_module.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "fifty-passport",
"metadata": {},
"source": [
"## Relaxivity module demo"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "internal-arbor",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The autoreload extension is already loaded. To reload it, use:\n",
" %reload_ext autoreload\n"
]
}
],
"source": [
"import sys\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"sys.path.append('../src')\n",
"import relaxivity\n",
"%load_ext autoreload\n",
"%autoreload 2"
]
},
{
"cell_type": "markdown",
"id": "arabic-latvia",
"metadata": {},
"source": [
"### The CRModel class\n",
"This is an abstract base class. Subclasses represent specific relaxivity models. \n",
"The main function of these objects is to return relaxation rates as a function of contrast agent concentration. \n",
"At the moment, only the linear model is implemented:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "4080ceab-24f8-4b2e-b57d-816474887489",
"metadata": {},
"outputs": [],
"source": [
"cr_model = relaxivity.CRLinear(r1=5.0, r2=7.1)"
]
},
{
"cell_type": "markdown",
"id": "52762d06-81e5-4153-88f5-5d0e827d7f82",
"metadata": {},
"source": [
"Now we can use the R1 and R2 methods to calculate the relaxation rates for a given concentration and pre-contrast relaxation rate values:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "a3c01c12-fb5e-4aed-b9fb-b882270ba27f",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 1. 6. 11. 16. 21. 26.]\n"
]
}
],
"source": [
"C_t = np.array([0, 1, 2, 3, 4, 5])\n",
"R10 = 1\n",
"R1_post = cr_model.R1(R10, C_t)\n",
"print(R1_post)"
]
},
{
"cell_type": "markdown",
"id": "4a7c1681-7e9d-49b2-9474-56f86a8f25ef",
"metadata": {},
"source": [
"Additional subclasses could be implemented to represent other concentration-relaxation relationships, e.g. quadratic."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.7.10"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
108 changes: 108 additions & 0 deletions demo/demo_signal_models.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "eb332c7d-4589-47da-81d0-e2697ee70254",
"metadata": {},
"source": [
"## Signal models demo"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "42671502-6096-4107-8c21-3f876b950a66",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"import sys\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"sys.path.append('../src')\n",
"import signal_models\n",
"%load_ext autoreload\n",
"%autoreload 2"
]
},
{
"cell_type": "markdown",
"id": "33acaa3b-10e0-454f-b62b-6a2cb5b1d0f4",
"metadata": {},
"source": [
"### The SignalModel Class\n",
"This abstract base class represents different signal models i.e. conversion between relaxation parameters and signal intensity for a given pulse sequence. The model is defined by specifying the sequence parameters. At present, only the SPGR signal model is implemented:"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "c2e14ed8-c6f6-4e79-9fe0-fbc9b323d156",
"metadata": {},
"outputs": [],
"source": [
"sm = signal_models.SPGR(tr=5e-3, fa=15, te=1.5e-3)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "25cb9206-ef8d-4d4f-bf82-779d9463530a",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0, 0.5, 'signal')"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAX4AAAEGCAYAAABiq/5QAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAgG0lEQVR4nO3deZhU1Z3/8fe394XeNxp6YxcEBQREcUGJilsck4yJE6MxJvjLaHYdTeLvmSxPEpOZONnml8RRRxOjWYy7RsUlalwB2deWraG76ZXe9+7z+6MKbRGwka663fd+Xs9TT9W9XcX9HoEPx1PnnmPOOUREJDhivC5ARESiS8EvIhIwCn4RkYBR8IuIBIyCX0QkYOK8LmAocnNzXVlZmddliIiMKqtWrap3zuUdfH5UBH9ZWRkrV670ugwRkVHFzHYf6ryGekREAkbBLyISMAp+EZGAUfCLiASMgl9EJGAU/CIiAaPgFxEJmFExj19ExM/6BxxNHT00tPdQ39ZNQ1sPje09NLR18/GTiijNSR3W6yn4RUQioH/A0dDeTV1r6FHfFgr1+tbu0POB47YeGtu7GTjE1igxBnNKsxT8IiJe6ujpo7alm5qWLmrDoX7gua7t3aA/XJgnx8eSm5ZA7phEirNTmFOSSU5qIrljEsgZk0hOagK5aaHnzJQEYmNs2Nug4BcRAXr6Bqhp6Qo/uge9Dh+3dlHX0k1rd9/7PhsXY+SlJZKflsj4zCRmF2eQNyaRvLREcgc956YlMibR+9j1vgIRkQjr6OmjurmLfc1d4efO9xzXtHTR0N7zvs8lxMWQn5bI2PQkjhubxhlT8shPTyQ/LYn8tMR3XmcmxxMTgZ55pCj4RWRU6+sfYF9LF1VNXVQ1dVLZ1El1c+c7x9XNXTR39r7vc9mpCRSkJ1GYkcSJxZmMTU9ibEYiBelJFKQnMTY9icyUeMxGT6APlYJfREa0rt5+Kps62bu/k8r9nVQ2dbB3f2co5Pd3sq+l631j6Vkp8RRmJFOUlcz8smwKM5MYl5HM2IykcMAnkRQf602DRgAFv4h4qq9/gOrmLvbs72BPYwd7Gjvffb2/k7rW7ve8PzbGKMxIYnxmMgsn5TA+M5nxmcmMe+eRREqCou1I9F9HRCKuo6ePisYOdtV3UNHYzu6GDioaQ4/K/Z30Deqyx8YY4zKTKM5K4axpeRRlpVCUFQr3ouwUCtISiYvVvafHQsEvIsOis6efXQ3t7KwPPXY3tLOrvoNdDe3UHtRrz0yJpzQ7hVnjM7hgViGl2SmUZKdQnJ1CYUaSgj3CFPwiMmT9A46qpk6217Wxo66dHfVt7KxvZ0ddO9XNXe95b15aImU5KZw5NY+y3FRKslMoy0mlJCeFjOR4j1ogoOAXkUPo6u1nZ307b9e2hR51bWyvDYV8d9/AO+9LT4pjYt4YFk7MYWJuKhPyUinLSaUsN3VEzFeXQ9PvjEiAdfX2s6OunW01rWyraaU8HPS7G9rfmSkTY1CcncKkvDGcPiWXSXljmJg3hol5qeSkJvhyuqPfKfhFAmBgwFHR2MGWfS1s2dfK1n2tbK1pZVf9uwEfF2OU5aYyvTCNi08oZHJBGlPyxzAhNzXQUx/9SMEv4jOtXb1s2dfK5uqW8CMU9J29/QCYQVlOKlMLxnDRrEKmFKQxbWwaZTmpJMTpS9UgUPCLjGL1bd1sqGxmY1ULG6tCz7sbOt75eUZyPNML0/jUgmKmj03nuMI0puSnkZygHnyQKfhFRon6tm7W721m3d5m1lc2s6GymX0t786kKclO4fhx6XxibhHTC9OZMS6dwowkjcHL+yj4RUagtu4+1u1tYu2e5vBzE1Xh6ZJmMClvDAsnZjNzfAYzx2cwY1w66UmaIilDo+AX8djAgOPtujbe2r2f1RVNrNnTxLbaVlz4S9fSnBROKsvmc0UZzAoHfaqmSsox0J8ekShr6+5jTUUTK3c3smr3ftZUNL2zxntmSjyzizM5f9ZYZhdncmJRJlmpCR5XLH6j4BeJsPq2blbsbOTNXY2s2NXIpqoWBlxoyGZaQRoXzx7H3JIs5pZkMiE3VWPyEnEKfpFhVtPSxes7Gnh9RyNv7GxgR107AEnxMcwpzuL6syZzUlk2c0oyNS4vnlDwixyjhrZuXt/RyKvb63ltx7tBn5YYx7yyLC6bV8yCCdnMHJehefIyIij4RY5SZ08/b+5q5JW36/lHeT2bqlsASE2I5eSJOXxqfjGnTMxlxrj0iGyULXKsFPwiH8A5x9aaVl7cWsfL5fW8uauRnr4BEmJjmFuayQ3nTuWUSbmcUJRBvJYTllFAwS9yCK1dvbzydj3Pb6nlxW111LSE1pOfVpDGlQtLOX1qHgvKsnUHrIxKCn6RsN0N7Ty7uZbnNtewYlcjvf2OtMQ4Tp+ay5lT8zhzaj5jM5K8LlPkmEUs+M2sGPgdMBYYAG53zv3czLKBPwFlwC7gMufc/kjVIXI4AwOOdZXNPLNxH8s31VBe2wbA5PwxfG7RBM46Lp+TSrM0fCO+E8kefx/wDefcW2aWBqwys+XAZ4HnnHO3mtnNwM3ATRGsQ+Qdff0DvLGzkac27OOZTfuoaekmNsY4eUI2ly8oYcn0fEpzUr0uUySiIhb8zrlqoDr8utXMNgPjgUuAxeG33QP8HQW/RFBv/wCvbW/giXXVPLNpH/s7ekmKj2Hx1HzOm1nAWdPyyUzR3bESHFEZ4zezMmAO8AZQEP5HAedctZnlH+Yzy4BlACUlJdEoU3ykf8Dx5s5GHl1bxVMbqtnf0UtqQiwfmVHA+TPHcubUfH0xK4EV8eA3szHAX4GvOudahno7unPuduB2gHnz5rnIVSh+4ZxjY1ULD62u5LG1VdS2dpOSEMtHphdw0QmFnDE1TztJiRDh4DezeEKh/wfn3IPh0zVmVhju7RcCtZGsQfyvurmTB9+q5KHVlbxd20Z8rLF4Wj6XzB7HkuMK1LMXOUgkZ/UYcCew2Tl326AfPQpcBdwafn4kUjWIf3X19vPUhn08sGovr2yvxzmYX5bFDy+dxQWzxmrMXuQIItnjXwR8BlhvZmvC575FKPD/bGbXABXAP0ewBvGZDZXN/HFFBY+sqaK1q4/i7GS+fPYUPj63iJKcFK/LExkVIjmr5x/A4Qb0l0TquuI/7d19PLq2ivveqGB9ZTOJcTGcP3Msl80vZuGEHGK0Ho7IUdGduzJivV3byu9f281f36qkrbuPaQVpfOfiGVw6p4iMFC1nLPJhKfhlROkfcDy/pZb/fWUnr25vICE2hgtPKOSKhSXMLcnSJiUiw0DBLyNCW3cff1qxh3te3UVFYwfjMpK48bxpfHJ+MbljEr0uT8RXFPziqermTu5+ZRf3vVlBa1cf80qzuGnpcZx3fAFxWiNHJCIU/OKJt2tb+c2LO3h4dSUDznH+rEK+cPpEZhdnel2aiO8p+CWq1u9t5lcvlPPMphoS42K4YmEp15w2geJsTcUUiRYFv0TF6or9/OK5cl7YWkd6UhxfOmsyV51aRo7G70WiTsEvEbVubxO3Ld/G37fWkZUSz43nTePKU0pJS9J0TBGvKPglIrbua+U/n9nK8k01ZKbEc9PS47jylFJSE/VHTsRr+lsow2rv/g5uW76Nh1ZXMiYxjq+fM5WrF5Wphy8ygij4ZVg0d/TyqxfKuefV3WCw7PSJfHHxJC2WJjICKfjlmPT2D3Dv67v5+XPlNHf28om5RXz93KkUZiR7XZqIHIaCXz60l7bV8d3HNrK9rp1Fk3P41gXTOX5chtdlicgHUPDLUdvT2MH3Ht/E8k01lOakcMeV81gyPV/r6IiMEgp+GbLuvn7+56Ud/PL5t4mNMf5t6TSuOW0CiXHa4UpkNFHwy5C8tr2Bbz+8nh117Vwwayz/96IZGscXGaUU/HJEzZ29/OjJzfxxxR5KslO4++r5LJ6W73VZInIMFPxyWE9v3MctD2+gsb2Ha8+cyFeXTNXG5SI+oOCX92nq6OE7j27k4TVVTC9M566r5jOrSLN1RPxCwS/v8cLWWm56YB2N7T18ZckUrj97MvFaF1/EVxT8AkBXbz8/fHIzv3ttN9MK0rjrs/OZOV69fBE/UvALm6pa+MofV1Ne28Y1p03gxvOmkRSvsXwRv1LwB5hzjnvfqOD7j28iMzme31+zgNOn5HldlohEmII/oFq6evnmX9fzxPpqzpyax22XnahNUUQCQsEfQJurW/g/965i7/5Oblp6HNeeMZGYGC23IBIUCv6AeWRNJTf9dR3pSfH8cdlC5pdle12SiESZgj8g+voH+NHftnDnP3YyvyyL//6XueSnJ3ldloh4QMEfAM2dvXzp/tW8tK2Oz55axrcvnK65+SIBpuD3uZ317VxzzwoqGjq49WOz+NSCEq9LEhGPKfh9bMWuRr7wu5UYcO/nT2bhxByvSxKREUDB71NPrKvma39eQ1FmMv979XxKc1K9LklERggFvw/d8fIOfvDkZuaWZHHHlfPIStWG5yLyLgW/jzjn+PFTW/nNi9s5f+ZY/uuTs7X0goi8j4LfJ/oHHLc8vIH736zg0yeX8L1LZhKrm7JE5BAU/D7Q2z/A1/60hsfXVfOviydx43nTtPG5iByWgn+U6+kb4Pr73uKZTTV88/zjuPbMSV6XJCIjnIJ/FOvu6+e6P7zFs5tr+c7FM/jsoglelyQio0DEbt80s7vMrNbMNgw69x0zqzSzNeHHBZG6vt919/XzxXtDof/9S45X6IvIkEXyvv27gaWHOP9fzrnZ4ceTEby+b/X2D3D9fat5fkstP7h0Jp85pczrkkRkFIlY8DvnXgIaI/XrB1X/gOOGv6xl+aYavvvR4/n0yaVelyQio4wXK3Vdb2brwkNBWYd7k5ktM7OVZrayrq4umvWNWM45bnl4PY+sqeLflk7jqlPLvC5JREahaAf/r4FJwGygGvjp4d7onLvdOTfPOTcvL0/bAQL85Omt3P/mHq47axL/uniy1+WIyCgV1eB3ztU45/qdcwPA/wALonn90eyeV3fx679v519OLuGGc6d5XY6IjGJRDX4zKxx0eCmw4XDvlXc9ub6a7zy2kXNmFPD9S2bq5iwROSYRm8dvZvcDi4FcM9sL/Duw2MxmAw7YBVwbqev7xYpdjXz1T2uYW5LFLy+fo2UYROSYRSz4nXOXH+L0nZG6nh9VNHSw7HcrKcpM5s6r5mnBNREZFtp/b4Rq6erlmntWMODgzs/OJzNFSyuLyPBQ8I9Aff0DfOm+1eysb+fXV8xlQq42URGR4aO1ekagnzy9lRe31fGjj83i1Em5XpcjIj6jHv8I88S6am5/aQdXnlLK5doYXUQiQME/gpTXtHLjA2s5qTSLWy6c4XU5IuJTCv4RorWrl2t/v4qUhDj+36fnkhCn3xoRiQyN8Y8AzjlufnA9uxs7uO/zJ1OQnuR1SSLiY0cMfjNrJXSz1ft+BDjnXHpEqgqYP67YwxPrqrlp6XGcPDHH63JExOeOGPzOubRoFRJU5TWtfPexjZw+JZdrz5jodTkiEgBHNdRjZvnAO+MQzrmKYa8oQLp6+7n+vtWMSYzjp5edSIyWYxCRKBjSN4hm9lEzKwd2Ai8SWmfnbxGsKxB++ORmtta0cttls8lP07i+iETHUKeOfB9YCGxzzk0AlgCvRKyqAPhHeT2/e20315w2gTOmar8BEYmeoQZ/r3OuAYgxsxjn3AuENlORD6Glq5cbH1jLpLxUbjxPa+uLSHQNdYy/yczGAC8BfzCzWqAvcmX52/ce20RtazcPfvFUrbgpIlE31B7/JUAn8DXgKWA7cHGkivKz5ZtqeGDVXq5bPIkTizO9LkdEAmhIPX7nXPugw3siVIvvtXT18u2H1jO9MJ3rz57idTkiElBDndXzMTMrN7NmM2sxs1Yza4l0cX7zk6e2UN/WzY8/PktLMoiIZ4Y6xv8T4GLn3OZIFuNnK3c1cu/rFXxu0QROKMr0uhwRCbChdjtrFPofXk/fAN98cD3jM5P5xrlTvS5HRAJuqD3+lWb2J+BhoPvASefcg5Eoym9+++J2ymvbuPOqeaQmal08EfHWUFMoHegAzh10zgEK/g+wd38Hv3rhbc6fOZYl0wu8LkdEZMizeq6OdCF+9aMnt2AGt1ykjVVEZGQYUvCb2S8OcboZWOmce2R4S/KPV7fX88T6ar72kamMz0z2uhwREWDoX+4mEVqioTz8OAHIBq4xs59FpLJRrq9/gO8+uonxmclce6aWWxaRkWOoY/yTgbOdc30AZvZr4BngHGB9hGob1e57s4KtNa385oq5WpZBREaUofb4xwOpg45TgXHOuX4GzfKRkObOXm5bvo1TJ+Vw3vFjvS5HROQ9juYGrjVm9ndC2y6eAfzQzFKBZyNU26j12xe309TRy7cumI6ZNlcRkZFlqLN67jSzJ4EFhIL/W865qvCPb4xUcaPRvuYu7nplJ5fMHsfM8RlelyMi8j5HHOoxs+PCz3OBQmAPUAGMDZ+Tg/z8uW30Dzi+cY7W2ReRkemDevxfB5YBPx10zg16ffawVzSKvV3bxp9W7OHKU8ooyUnxuhwRkUM6Yo/fObcs/PLXwCXOubOAFwjN4b8hwrWNOv/x9BZSEuL40tmTvS5FROSwhjqr5xbnXIuZnUZoCufdhP4xkLANlc08vbGGL5w+kZwxiV6XIyJyWEMN/v7w84XAb8J36yZEpqTR6efPlZOeFMfVp5V5XYqIyBENNfgrzey3wGXAk2aWeBSf9b2NVc0s31TD506bQHpSvNfliIgc0VDD+zLgaWCpc66J0HINmsYZ9ovnyklLiuPqRRO8LkVE5AMNdR5/B4OWYHbOVQPVkSpqNNlc3cLTG2v48pIpZCSrty8iI5+Ga47RL58vJy0xjmvU2xeRUULBfwy217Xxtw37uOrUMjJS1NsXkdEhYsFvZneZWa2ZbRh0LtvMlptZefg5K1LXj4Y7Xt5JQmwMn11U5nUpIiJDFske/93A0oPO3Qw855ybAjwXPh6V6lq7+etbe/n4SUXkat6+iIwiEQt+59xLQONBpy8B7gm/vgf4p0hdP9J+/9ouevsH+PxpGtsXkdEl2mP8BeEZQQdmBuUf7o1mtszMVprZyrq6uqgVOBQdPX387vXdnDO9gIl5Y7wuR0TkqIzYL3edc7c75+Y55+bl5eV5Xc57PLBqL00dvSw7Q1sqisjoE+3grzGzQoDwc22Ur3/M+gccd7y8kzklmZxUOqq/mxaRgIp28D8KXBV+fRXwSJSvf8z+vrWWisYOPn/aRO2uJSKjUiSnc94PvAZMM7O9ZnYNcCtwjpmVE1rl89ZIXT9Sfv/6bgrSEzn3+AKvSxER+VCGuufuUXPOXX6YHy2J1DUjbXdDOy9uq+MrS6YQHztivx4RETkipddR+MMbFcSYcfmCEq9LERH50BT8Q9TV28+fV+7hvOMLKEhP8rocEZEPTcE/RI+vq6apo5crFpZ6XYqIyDFR8A/R71/fzaS8VE6ZmON1KSIix0TBPwQbq5pZu6eJKxaWagqniIx6Cv4h+MvKvSTExnDpnPFelyIicswU/B+gp2+AR9ZUcs7xBWSmaH95ERn9FPwf4PktNezv6OUTJxV5XYqIyLBQ8H+AB1btpSA9kTOmjKyF4kREPiwF/xHUtnbxwtY6Lp1TRGyMvtQVEX9Q8B/BI6ur6B9wGuYREV9R8B+Gc46/rNrDnJJMJudrsxUR8Q8F/2FsqGxhW02bevsi4jsK/sN4bF0V8bHGhbMKvS5FRGRYKfgPwTnHE+uqOX1Knubui4jvKPgP4a2KJiqbOrnoBPX2RcR/FPyH8Pi6KhLiYjhnhnbZEhH/UfAfpH8gNMyzeGoeaUnxXpcjIjLsFPwHWbGrkdrWbi4+cZzXpYiIRISC/yCPr6siOT6WJdPzvS5FRCQiFPyD9PUP8Lf1+zh7ej4pCRHbh15ExFMK/kHe2NlIQ3sPF2s2j4j4mIJ/kOWbakiKj+HMqRrmERH/UvCHOedYvqmG0ybnkZwQ63U5IiIRo+AP21zdSmVTJ+fMUG9fRPxNwR+2fFMNZnD2cbppS0T8TcEf9uzmGuYUZ5KXluh1KSIiEaXgB6qbO1lf2cw5M8Z6XYqISMQp+IFnN9cCaHxfRAJBwQ88u6mGspwUJuVppy0R8b/AB39bdx+vbW/gnBkFmGlDdRHxv8AH/8vb6ujpH+Aj0zWbR0SCIfDB/1J5HWmJcZxUmuV1KSIiURHo4HfO8dK2ek6dnENcbKD/U4hIgAQ67XbUt1PZ1MnpU/K8LkVEJGoCHfwvb6sD4AwFv4gESLCDv7yespwUSnJSvC5FRCRqPNltxMx2Aa1AP9DnnJsX7Rp6+gZ4bUcDH59bFO1Li4h4ysttps5yztV7dfG3KvbT0dPP6VNyvSpBRMQTgR3qeWlbHbExximTcrwuRUQkqrwKfgc8Y2arzGzZod5gZsvMbKWZrayrqxv2Al4ur2duSSZpSfHD/muLiIxkXgX/IufcXOB84DozO+PgNzjnbnfOzXPOzcvLG95ZNw1t3WyoatY0ThEJJE+C3zlXFX6uBR4CFkTz+q9sb8A5OGOqgl9EgifqwW9mqWaWduA1cC6wIZo1vL6jgbTEOGaNz4jmZUVERgQvZvUUAA+FV8KMA+5zzj0VzQLe2NHAvLIsYmO0GqeIBE/Ug985twM4MdrXPaC+rZvtde184qRir0oQEfFU4KZzrtjZCMDJE7M9rkRExBuBC/43djaSHB/LzHEa3xeRYApk8M8tzSQhLnBNFxEBAhb8zR29bNnXwoIy3a0rIsEVqOBfubsR5zS+LyLBFqjgf3NnIwmxMcwuzvS6FBERzwQq+N/Y2ciJxRkkxcd6XYqIiGcCE/zt3X2sr2zm5Aka3xeRYAtM8L9VsZ/+AceCCRrfF5FgC0zwr9jZSGyMMbc0y+tSREQ8FZjgX72niWkFaYxJ9HLTMRER7wUi+AcGHGv2NHGiZvOIiAQj+HfUt9Pa1cccBb+ISDCCf+2eJgBml2R6WoeIyEgQiOBfs6eJMYlxTMob43UpIiKeC0zwn1CUoY1XREQIQPB39fazubpFyzSIiIT5Pvg3VjXTN+A0o0dEJMz3wb+6oglAM3pERMJ8H/xr9jQxLiOJ/PQkr0sRERkRAhH8msYpIvIuXwd/fVs3e/d36otdEZFBfB38a8Lj+7OLtTCbiMgBvg7+tXubiI0xZo5P97oUEZERw9fBX5SVzMfnjiclQStyiogc4OtE/OT8Ej45v8TrMkRERhRf9/hFROT9FPwiIgGj4BcRCRgFv4hIwCj4RUQCRsEvIhIwCn4RkYBR8IuIBIw557yu4QOZWR2w+yg+kgvUR6ickSyI7Q5imyGY7Q5im+HY2l3qnMs7+OSoCP6jZWYrnXPzvK4j2oLY7iC2GYLZ7iC2GSLTbg31iIgEjIJfRCRg/Br8t3tdgEeC2O4gthmC2e4gthki0G5fjvGLiMjh+bXHLyIih6HgFxEJGN8Fv5ktNbOtZva2md3sdT2RYGZ3mVmtmW0YdC7bzJabWXn42VcbDZtZsZm9YGabzWyjmX0lfN7v7U4yszfNbG243d8Nn/d1uwHMLNbMVpvZ4+HjILR5l5mtN7M1ZrYyfG7Y2+2r4DezWOC/gfOBGcDlZjbD26oi4m5g6UHnbgaec85NAZ4LH/tJH/AN59x0YCFwXfj31u/t7gbOds6dCMwGlprZQvzfboCvAJsHHQehzQBnOedmD5q7P+zt9lXwAwuAt51zO5xzPcAfgUs8rmnYOedeAhoPOn0JcE/49T3AP0WzpkhzzlU7594Kv24lFAjj8X+7nXOuLXwYH344fN5uMysCLgTuGHTa120+gmFvt9+CfzywZ9Dx3vC5IChwzlVDKCSBfI/riRgzKwPmAG8QgHaHhzzWALXAcudcENr9M+DfgIFB5/zeZgj9o/6Mma0ys2Xhc8Pebr9ttm6HOKf5qj5iZmOAvwJfdc61mB3qt9xfnHP9wGwzywQeMrOZHpcUUWZ2EVDrnFtlZos9LifaFjnnqswsH1huZlsicRG/9fj3AsWDjouAKo9qibYaMysECD/XelzPsDOzeEKh/wfn3IPh075v9wHOuSbg74S+3/FzuxcBHzWzXYSGa882s3vxd5sBcM5VhZ9rgYcIDV8Pe7v9FvwrgClmNsHMEoBPAY96XFO0PApcFX59FfCIh7UMOwt17e8ENjvnbhv0I7+3Oy/c08fMkoGPAFvwcbudc990zhU558oI/R1+3jl3BT5uM4CZpZpZ2oHXwLnABiLQbt/duWtmFxAaH4wF7nLO/cDbioafmd0PLCa0XGsN8O/Aw8CfgRKgAvhn59zBXwCPWmZ2GvAysJ53x32/RWic38/tPoHQF3qxhDpqf3bOfc/McvBxuw8ID/Xc4Jy7yO9tNrOJhHr5EBqGv88594NItNt3wS8iIkfmt6EeERH5AAp+EZGAUfCLiASMgl9EJGAU/CIiAaPgl8Azs/7waogbzOyxA/Pmwz97ysyaDqwQeYRf42dmdsag48vN7NuHeW+emT01bA0QOUoKfhHoDK+GOJPQ4nfXDfrZfwCfOdKHzSwbWBhePO+ApcAhw905VwdUm9miYytb5MNR8Iu812sMWtjPOfcc0PoBn/kEg0I+fJfxbOAtMzsz/H8Ta8Jry6eF3/Yw8OnhLFxkqBT8ImHh/RyWcPTLfCwCVg06ngOsdaG7I28ArnPOzQZOBzrD71kZPhaJOgW/CCSHlz1uALKB5Uf5+UKgbtDxUuBv4devALeZ2ZeBTOdcX/h8LTDuQ1cscgwU/CLhMX6gFEjgvWP8Q/o8kDTo+FzgGQDn3K3A54Fk4HUzOy78niTe7f2LRJWCXyTMOdcMfBm4IbwE9FBtBiYDmFkGEOecawgfT3LOrXfO/ZjQ8M6B4J9KaOVFkahT8IsM4pxbDawltBwwZvYy8BdgiZntNbPzDvGxJwitlgpwDvDsoJ99NTxNdC2hHv6BIaCzwp8TiTqtzikyDMzsH8BFwH8CdzjnXv+A978EXOKc2x+N+kQGU/CLDAMzO5nQdwXrhvDePEJb7D0c8cJEDkHBLyISMBrjFxEJGAW/iEjAKPhFRAJGwS8iEjAKfhGRgPn/hiV7DNPRxwoAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"R1_range = np.linspace(0.5, 50, 100)\n",
"s = sm.R_to_s(s0=100, R1=R1_range, R2s=0, k_fa=1)\n",
"\n",
"plt.plot(R1_range, s)\n",
"plt.xlabel('R1 (/s)')\n",
"plt.ylabel('signal')"
]
}
],
"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.8.8"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Loading