diff --git a/giga_connectome/data/methods/template.jinja b/giga_connectome/data/methods/template.jinja new file mode 100644 index 0000000..64fb9c3 --- /dev/null +++ b/giga_connectome/data/methods/template.jinja @@ -0,0 +1,32 @@ +These results were generated with +giga_connectome (version {{ data.version }}, https://giga-connectome.readthedocs.io/en/latest/) +using Nilearn (version {{ data.nilearn_version }}, RRID:SCR_001362) +and TemplateFlow (version {{ data.templateflow_version }}). + +The following steps were followed. + +1. Created subject specific grey matter mask in MNI space ({{ data.mni_space }}). + +1. Sampled the {{ data.atlas }} atlas to the space of subject specific grey matter mask in MNI space. + +1. Calculated the conjunction of the customised grey matter mask and resampled atlas to find valid parcels. + +1. Used the new input specific grey matter mask and atlas to extract time series and connectomes for each subject. + The time series data were denoised as follow: + + - Time series extractions through label or map maskers are performed on the denoised nifti file. + - Denoising steps were performed on the voxel level: + - spatial smoothing (FWHM: {{ data.smoothing_fwhm }} mm) + - detrending, only if high pass filter was not applied through confounds + - regressing out confounds (using a {{ data.strategy }} strategy) + - standardized (using {{ data.standardize }}) + - Extracted time series from atlas + - Computed correlation matrix (Pearson's correlation with LedoitWolf covariance estimator) + +{% if data.average_correlation %} +1. Calculate intranetwork correlation of each parcel. The values replace the diagonal of the connectomes. +{% endif %} + +{% if data.analysis_level %} +1. Create a group average connectome. +{% endif %} diff --git a/giga_connectome/methods.py b/giga_connectome/methods.py new file mode 100644 index 0000000..10cf984 --- /dev/null +++ b/giga_connectome/methods.py @@ -0,0 +1,52 @@ +"""Module responsible for generating method section.""" + +from pathlib import Path + +from jinja2 import Environment, FileSystemLoader, select_autoescape + +from nilearn import __version__ as nilearn_version +from templateflow import __version__ as templateflow_version + +from giga_connectome import __version__ + + +def generate_method_section( + output_dir: Path, + atlas: str, + smoothing_fwhm: float, + strategy: str, + standardize: str, + mni_space: str, + average_correlation: bool, + analysis_level: bool, +) -> None: + + env = Environment( + loader=FileSystemLoader(Path(__file__).parent), + autoescape=select_autoescape(), + lstrip_blocks=True, + trim_blocks=True, + ) + + template = env.get_template("data/methods/template.jinja") + + output_file = output_dir / "logs" / "CITATION.md" + output_file.parent.mkdir(parents=True, exist_ok=True) + + data = { + "version": __version__, + "nilearn_version": nilearn_version, + "templateflow_version": templateflow_version, + "atlas": atlas, + "smoothing_fwhm": smoothing_fwhm, + "strategy": strategy, + "standardize": "percent signal change" + if standardize == "psc" + else standardize, + "mni_space": mni_space, + "average_correlation": average_correlation, + "analysis_level": analysis_level, + } + + with open(output_file, "w") as f: + print(template.render(data=data), file=f) diff --git a/giga_connectome/tests/test_methods.py b/giga_connectome/tests/test_methods.py new file mode 100644 index 0000000..b7071c1 --- /dev/null +++ b/giga_connectome/tests/test_methods.py @@ -0,0 +1,14 @@ +from giga_connectome import methods + + +def test_generate_method_section(tmp_path): + methods.generate_method_section( + output_dir=tmp_path, + atlas="DiFuMo", + smoothing_fwhm=5, + standardize="psc", + strategy="simple", + mni_space="MNI152NLin6Asym", + average_correlation=True, + analysis_level=True, + ) diff --git a/giga_connectome/workflow.py b/giga_connectome/workflow.py index 72d2e17..5fbada5 100644 --- a/giga_connectome/workflow.py +++ b/giga_connectome/workflow.py @@ -11,7 +11,7 @@ ) from giga_connectome.denoise import is_ica_aroma -from giga_connectome import utils +from giga_connectome import utils, methods from giga_connectome.logger import gc_logger @@ -63,6 +63,17 @@ def workflow(args): gc_log.info(f"Indexing BIDS directory:\n\t{bids_dir}") + methods.generate_method_section( + output_dir=output_dir, + atlas=atlas["name"], + smoothing_fwhm=smoothing_fwhm, + standardize=args.standardize, + strategy=args.denoise_strategy, + mni_space=template, + average_correlation=calculate_average_correlation, + analysis_level=analysis_level == "group", + ) + # create subject ts and connectomes # refactor the two cases into one diff --git a/pyproject.toml b/pyproject.toml index a7f77d6..53e076b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,6 +26,7 @@ dependencies = [ "templateflow < 23.0.0", "tqdm", "setuptools", + "jinja2 >= 2.0", "rich", ] dynamic = ["version"]