diff --git a/.idea/SEPAL.iml b/.idea/SEPAL.iml
index 039314d..06b0085 100644
--- a/.idea/SEPAL.iml
+++ b/.idea/SEPAL.iml
@@ -5,8 +5,11 @@
+
+
+
-
-
+
+
\ No newline at end of file
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
new file mode 100644
index 0000000..6e113c6
--- /dev/null
+++ b/.idea/codeStyles/Project.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml
new file mode 100644
index 0000000..79ee123
--- /dev/null
+++ b/.idea/codeStyles/codeStyleConfig.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml
index 105ce2d..dd4c951 100644
--- a/.idea/inspectionProfiles/profiles_settings.xml
+++ b/.idea/inspectionProfiles/profiles_settings.xml
@@ -1,5 +1,6 @@
+
diff --git a/README.md b/README.md
index da46e12..80891e4 100644
--- a/README.md
+++ b/README.md
@@ -15,7 +15,7 @@ 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
@@ -23,17 +23,17 @@ Created 28 September 2020
### 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
diff --git a/demo/DCE_ROI_data/k_tissue.npy b/demo/DCE_ROI_data/k_tissue.npy
new file mode 100644
index 0000000..a38cc71
Binary files /dev/null and b/demo/DCE_ROI_data/k_tissue.npy differ
diff --git a/demo/DCE_ROI_data/k_vif.npy b/demo/DCE_ROI_data/k_vif.npy
new file mode 100644
index 0000000..4729dd6
Binary files /dev/null and b/demo/DCE_ROI_data/k_vif.npy differ
diff --git a/demo/DCE_ROI_data/signal_tissue.npy b/demo/DCE_ROI_data/signal_tissue.npy
new file mode 100644
index 0000000..4b54dbc
Binary files /dev/null and b/demo/DCE_ROI_data/signal_tissue.npy differ
diff --git a/demo/DCE_ROI_data/signal_vif.npy b/demo/DCE_ROI_data/signal_vif.npy
new file mode 100644
index 0000000..cef8ba4
Binary files /dev/null and b/demo/DCE_ROI_data/signal_vif.npy differ
diff --git a/demo/DCE_ROI_data/t1_tissue.npy b/demo/DCE_ROI_data/t1_tissue.npy
new file mode 100644
index 0000000..d866464
Binary files /dev/null and b/demo/DCE_ROI_data/t1_tissue.npy differ
diff --git a/demo/DCE_ROI_data/t1_vif.npy b/demo/DCE_ROI_data/t1_vif.npy
new file mode 100644
index 0000000..07a7beb
Binary files /dev/null and b/demo/DCE_ROI_data/t1_vif.npy differ
diff --git a/demo/T1_data/FA12.nii.gz b/demo/T1_data/FA12.nii.gz
new file mode 100644
index 0000000..5996a69
Binary files /dev/null and b/demo/T1_data/FA12.nii.gz differ
diff --git a/demo/T1_data/FA2.nii.gz b/demo/T1_data/FA2.nii.gz
new file mode 100644
index 0000000..ff6a880
Binary files /dev/null and b/demo/T1_data/FA2.nii.gz differ
diff --git a/demo/T1_data/FA5.nii.gz b/demo/T1_data/FA5.nii.gz
new file mode 100644
index 0000000..6e0aeb4
Binary files /dev/null and b/demo/T1_data/FA5.nii.gz differ
diff --git a/demo/T1_data/TI_1068ms.nii.gz b/demo/T1_data/TI_1068ms.nii.gz
new file mode 100644
index 0000000..67b861b
Binary files /dev/null and b/demo/T1_data/TI_1068ms.nii.gz differ
diff --git a/demo/T1_data/TI_168ms.nii.gz b/demo/T1_data/TI_168ms.nii.gz
new file mode 100644
index 0000000..32a86b3
Binary files /dev/null and b/demo/T1_data/TI_168ms.nii.gz differ
diff --git a/demo/T1_data/mask.nii.gz b/demo/T1_data/mask.nii.gz
new file mode 100644
index 0000000..73ab352
Binary files /dev/null and b/demo/T1_data/mask.nii.gz differ
diff --git a/demo/demo_aif_module.ipynb b/demo/demo_aif_module.ipynb
new file mode 100644
index 0000000..8fcecee
--- /dev/null
+++ b/demo/demo_aif_module.ipynb
@@ -0,0 +1,296 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "eb332c7d-4589-47da-81d0-e2697ee70254",
+ "metadata": {},
+ "source": [
+ "## AIF module demo"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4276273d-31f5-4625-bfc8-9018b7cd984d",
+ "metadata": {},
+ "source": [
+ "### Import modules"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "42671502-6096-4107-8c21-3f876b950a66",
+ "metadata": {
+ "tags": []
+ },
+ "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 aifs\n",
+ "%load_ext autoreload\n",
+ "%autoreload 2"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0c2eae34-da30-465b-9b23-3dbadd7dc0d8",
+ "metadata": {},
+ "source": [
+ "### The AIF Class\n",
+ "AIF objects define an arterial input function. This can either be a population average function or an AIF based on individual patient measurements."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "reported-projector",
+ "metadata": {},
+ "source": [
+ "### Classic Parker AIF\n",
+ "Create a Parker AIF object of the Parker subclass of AIF:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "4f59a6a6-69b0-4f28-a4a1-03b0b846f6e8",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "parker_aif = aifs.Parker(hct=0.42)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f9a0f8e5-ddd6-4164-a4df-7f50a3af82eb",
+ "metadata": {},
+ "source": [
+ "We can use the c_ap method to get concentration at arbitrary time points:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "f65ca4cc-58d3-422a-822b-6c52cd9328c9",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "