Skip to content

sct-pipeline/csa-atrophy

Folders and files

NameName
Last commit message
Last commit date
Aug 13, 2020
May 23, 2020
Mar 11, 2021
Oct 13, 2020
Aug 15, 2020
Nov 15, 2020
Nov 15, 2020
Oct 16, 2020
May 13, 2021
Sep 9, 2020
Aug 24, 2020
Jan 7, 2021
Sep 4, 2020
Sep 8, 2020
Aug 27, 2020
Aug 3, 2020

Repository files navigation

csa-atrophy

csa-atrophy

Evaluate the sensitivity of atrophy detection with SCT. The algorithm works as follows:

  • Consider subject I --> sI
  • Applies a rescaling on the native image (e.g. 1, 0.95, 0.8) --> rX
  • Applies random affine transformation --> tY
  • Segment the cord
  • Compute CSA --> CSA(sI, rX, tY)

How to run

This code has been tested using Python 3.7.

Download (or git clone) this repository:

git clone https://github.com/sct-pipeline/csa-atrophy.git
cd csa-atrophy

Installation: csa-atrophy requires specific python packages for computing statistics and processing images. If not already present on the computer's python environment such packages will automatically be installed by running pip command:

pip install -e .

Download the Spine Generic Multi-Subject dataset.

Edit the file config_sct_run_batch.yml according to your setup. Notable flags include:

  • path_data: If you downloaded the spine-generic data at another location, make sure to update the path;
  • include_list: If you only want to run the script in a few subjects, list them here. Example: include_list: ['sub-unf04', 'sub-unf05']

See sct_run_batch -h to look at the available options.

Run the analysis:

sct_run_batch -config config_sct_run_batch.yml

:note: desired subjects using flag -include and in parallel processing using flag -jobs.

To output statistics, run in Dataset

csa_rescale_stat -i csa_atrophy_results/results -o csa_atrophy_results -config config_script.yml -fig

Quality Control

After running the analysis, check your Quality Control (QC) report by opening the file qc/index.html. Use the “Search” feature of the QC report to quickly jump to segmentations or labeling results. If you spot issues (wrong labeling), add their filenames in the 'config_correction.yml' file (see https://spine-generic.rtfd.io/en/latest/analysis-pipeline.html for further indications). Then, manually create labels in the cord at the level of inter-vertebral discs C1-C2, C2-C3, ..., C4-C5 with the command:

manual_correction -config config_correction.yml -path-in csa_atrophy_results/data_processed -path-out PATH_DATA

The bash script outputs all manual labelings to the derivatives directory in the dataset path defined in path_data. It is now possible to re-run the whole process. With the command below labeling will use the manual corrections that are present in the derivatives/ folder of the dataset, otherwise labeling will be done automatically.

sct_run_batch -config config_sct_run_batch.yml

Statistics

After everything is done, compute stats: Per-subject stat: Panda dataframe df_sub:

  • intra-subject MEAN: MEAN[CSA(sI, rX, :)] --> MEAN_intra(sI, rX): df_sub['mean']
  • intra-subject STD: STD[CSA(sI, rX, :)] --> STD_intra(sI, rX): df_sub['std']
  • intra-subject COV: STD[CSA(sI, rX, :)] / MEAN[CSA(sI, rX, :)] --> COV_intra(sI, rX): df_sub['cov']
  • rescale_estimated_subject MEAN: MEAN[ CSA(sI, rX, :) ] / MEAN[ CSA(sI, 1, :) ] --> MEAN_rescale_estimated_subject(sI, rX): df_sub['rescale_estimated']
  • intra-subject error MEAN: MEAN[CSA(sI, rX, :)] - (rX^2 * MEAN[CSA(sI, 1, :)]) --> MEAN_error_intra(sI, rX): df_sub['error']
  • intra-subject error in percentage MEAN: [MEAN[CSA(sI, rX, :)] - (rX^2 * MEAN[CSA(sI, 1, :)])] / MEAN[CSA(sI, rX, :)] --> MEAN_error_intra_perc(sI, rX): df_sub['perc_error']
  • intra-subject difference MEAN: [MEAN[CSA(sI, 1, :)] - (rX^2 * MEAN[CSA(sI, rX, :)])] --> MEAN_diff(sI, rX): df_sub['diff']

Across-subject stats: Panda dataframe df_rescale

  • intra-subject STD: MEAN[STD_intra(:, rX)] --> STD_intra(rX): df_rescale['std_intra']
  • intra-subject COV: MEAN[COV_intra_sub(:, rX)] --> COV_intra(rX): df_rescale['cov']
  • inter-subject STD: STD[MEAN_intra(:, rX)] --> STD_inter(rX): df_rescale['std_inter']
  • rescale_estimated (across subjects) MEAN: MEAN[MEAN_rescale_estimated_subject(:, rX)] --> MEAN_rescale_estimated(rX): df_rescale['mean_rescale_estimated']
  • rescale_estimated (across subjects) STD: STD[MEAN_rescale_estimated_subject(:, rX)] --> STD_rescale_estimated(rX): df_rescale['std_rescale_estimated']
  • error in percentage (across subjects) MEAN: MEAN[MEAN_error_intra(:, rX)]
  • error in percentage (across subjects) STD: STD[MEAN_error_intra(:, rX)]
  • intra-subject difference STD: STD[MEAN_diff(:, rX)]

Power analysis:

  • sample size for a between subject study: [(z(uncertainty) + z(power))^2 * (2 * STD[MEAN(:, rX)]^2)] / [MEAN[CSA(sI, 1, :)] - MEAN[CSA(sI, rX, :)]]
  • sample size for a within subject study: [(z(uncertainty) + z(power))^2 * (STD[MEAN_diff(:, rX)]^2)] / [MEAN[CSA(sI, 1, :)] - MEAN[CSA(sI, rX, :)]]

Plot results:

  • STD_intersub
  • Mean and STD inter-subject error percentage in function of rescaling
  • sample size: minimum number of patients to detect an atrophy of X with Y% power and Z% uncertainty
  • CSA values boxplot in function of rescaling
  • Error values boxplot in function of rescaling