{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "%matplotlib inline"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "\nNeuroimaging cartesian reconstruction\n=====================================\n\nAuthor: Chaithya G R\n\nIn this tutorial we will use the pysap-mri's launch grid helper function\nto carry out grid search. We will search for best regularisation weight\nand the best wavelet for reconstruction.\nFor this the search space works on :\nmu          ==> 5 Values on log scale between 1e-8 and 1e-6\nWavelets    ==> sym8 and sym12\nnb_scale    ==> 3 and 4\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "# Imports\nfrom mri.operators import FFT, WaveletN\nfrom mri.operators.utils import convert_mask_to_locations\nfrom mri.reconstructors import SingleChannelReconstructor\nfrom mri.scripts.gridsearch import launch_grid\n\nfrom pysap.data import get_sample_data\n\nfrom modopt.math.metrics import ssim\nfrom modopt.opt.proximity import SparseThreshold\nfrom modopt.opt.linear import Identity\nimport numpy as np\n\n\n# Load MR data and obtain kspace\nimage = get_sample_data('2d-mri')\nmask = get_sample_data(\"cartesian-mri-mask\")\nkspace_loc = convert_mask_to_locations(mask.data)\nfourier_op = FFT(samples=kspace_loc, shape=image.shape)\nkspace_data = fourier_op.op(image.data)\n# Define the keyword dictionaries based on convention\nref = image\nmetrics = {\n    'ssim': {\n        'metric': ssim,\n        'mapping': {'x_new': 'test', 'y_new': None},\n        'cst_kwargs': {'ref': image, 'mask': None},\n        'early_stopping': True,\n    },\n}\nlinear_params = {\n    'init_class': WaveletN,\n    'kwargs':\n        {\n            'wavelet_name': ['sym8', 'sym12'],\n            'nb_scale': [3, 4]\n        }\n}\nregularizer_params = {\n    'init_class': SparseThreshold,\n    'kwargs':\n        {\n            'linear': Identity(),\n            'weights': np.logspace(-8, -6, 5),\n        }\n}\noptimizer_params = {\n    # Just following convention\n    'kwargs':\n        {\n            'optimization_alg': 'fista',\n            'num_iterations': 20,\n            'metrics': metrics,\n        }\n}\n# Call the launch grid function and obtain results\nraw_results, test_cases, key_names, best_idx = launch_grid(\n    kspace_data=kspace_data,\n    fourier_op=fourier_op,\n    linear_params=linear_params,\n    regularizer_params=regularizer_params,\n    optimizer_params=optimizer_params,\n    reconstructor_class=SingleChannelReconstructor,\n    reconstructor_kwargs={'gradient_formulation': 'synthesis'},\n    compare_metric_details={'metric': 'ssim'},\n    n_jobs=-1,\n    verbose=1,\n)\nimage_rec = raw_results[best_idx][0]"
      ]
    }
  ],
  "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.6.12"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}