From 44db2fe595de8d9cd8ca06cdb40de7d839fc9559 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Mon, 24 Oct 2022 13:53:20 +0200 Subject: [PATCH 01/18] update: add junifer logo in README and docs index --- README.md | 2 ++ docs/images/junifer_logo.png | Bin 0 -> 62081 bytes docs/index.rst | 4 ++++ 3 files changed, 6 insertions(+) create mode 100644 docs/images/junifer_logo.png diff --git a/README.md b/README.md index 5ba79f77c..9f89a61c9 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +![Junifer logo](docs/images/junifer_logo.png) + # junifer - JUelich NeuroImaging FEature extractoR ![PyPI](https://img.shields.io/pypi/v/junifer?style=flat-square) diff --git a/docs/images/junifer_logo.png b/docs/images/junifer_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3810ebf98d6f1b99c97728650a0fbb9665ea7544 GIT binary patch literal 62081 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%0AHOTPdcO1e z;o3#@o_nvF#XT#>RUA}iY>cqN1S>?D>4N>Hvo7I%m_i}8O*6@(m8FJ?b5+=1>0!n0 z-i93!`Nlp`qJE1?-0jjck^Tu%xOK-LFCN#x4-Rj6dQovSLdz$TzjwH+gle$Z?TVCV zFmXxvl3eWhh~FDOS3|lk+I`+PA4Rzt&#*yk8*0&!esS_l1_zGebyiDVr(dhWzIb4Zggr!17=o1<&8U_D`ORS$-g_ z=&K#`)RYV64M`KwlciggIZ`in-KQd*yDL1P?P+=f;=G~u4a?spyaqhZag_+<0n#d) zv^^Alt?Zp849gOx9qN91b%9p2&y$~O7czL}g7G7EHu2~~}G z1%yF9<6lBAUEh0{j7$Fst6DyO5R}zm5=JL_w@uhosv^Z?Qrb1SveejRH-%b7LY3!i zrYV(dt;igDoUzXPlf2!(c!+Dx(GQp0)V8g*bnrCVygu>AxO;t@X~KmMJ7@fQG@rjA zhlQDyggm&YjvmpOxR%N}r2qGsQbn+;BA2ZZT7>T}67U!MKmGn;$x4IM zx7l@jJt?JZo-_oM{{Zao?|tDPA-DmH>dC{lp8`ikhXW1IJFkYcWS?pe;K)8THc(pb z>C{T0yPY1A&-aWMKZ@~mf57;qk_G?Eh+XJjE9f@ptlgQ*csv-E`f~9-z!iW*Lp}ir z9WdP#{iQt5KnpVM)*79;Rd3?IqIqFM3CZ*saSe5|n5MR?X1*UBpEo_c0&Ez`;tbl| zulWaS-YWrlq~Hss+1=sL`66mlX6pd1zC6h=bf<$U+w9~s;#5~$)`S8NzeG=tj`JSH zXS=Gc5*+Pfb=URas0Hfo=LSrgJ}&4*i;(URB-T#L5n$I96WO&;Cq3w~Up`{JjpLln zgRf@L#d@L(2A;H4tnPgC7s;1lYmIU1@LGCi-NQXuL~nR|F+EK7cCZCgk08WX(>=c| z+!{{{*)tN3&{MTdEJEIY!L=)^EfTHj9E`4Uy-A-%E0{VKvHSr1F_mSW1yJ3KSW}r- zwpv&0zIb6hKKEwcBYngv9Cvud!SFGeIP85ITGWNKDN4?_1yVcj@bbAvQ=H4~Dnd`n zr03}C%(GF709JH4UhOwe4cuIS?^f6?h7q+$mYRq3GyV#=6Rs>>_Qk+U&Lk(d zacV6r$1*%Q92?UPUf_D_OSai%-I)d^Lf9AbFav*aAt+^345q&kz*26wt`@BZJIk-9 zByg9x^`caR6KX)Ned!$0W&ZeX)5q}-#;3{0R)3_1{*XJdbhJUG^50A0#oj|hJ= z2Udpx$kyWWD>-*_>C7rGBW7@UMyd0 z8@eI;foe1xquXoEvNq&V`dUGab=kRI6JTvvW265*qt259|qw literal 0 HcmV?d00001 diff --git a/docs/index.rst b/docs/index.rst index cef0f0606..5aaa20d88 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,5 +1,9 @@ .. include:: links.inc +.. image:: images/junifer_logo.png + :width: 300px + :alt: junifer logo + Welcome to junifer's documentation! =================================== -- 2.52.0 From de4aebee13f940a26201b04bca949d00fb0c60c4 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Mon, 24 Oct 2022 15:13:41 +0200 Subject: [PATCH 02/18] docs: correct typo in builtin.rst --- docs/builtin.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/builtin.rst b/docs/builtin.rst index d1e04d007..e49cc6393 100644 --- a/docs/builtin.rst +++ b/docs/builtin.rst @@ -14,7 +14,7 @@ Data Grabbers - Open with registration - Restricted - Type/config: this should mention weather the class is built-in in the + Type/config: this should mention whether the class is built-in in the core of junifer or needs to be imported from a specific configuration in the `junifer.configs` module. -- 2.52.0 From 4b8f2633e7deb5f988d7f06062392b7d7eb68d06 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Mon, 24 Oct 2022 15:14:31 +0200 Subject: [PATCH 03/18] docs: fix class paths and config for available datagrabbers --- docs/builtin.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/builtin.rst b/docs/builtin.rst index e49cc6393..10649f5ce 100644 --- a/docs/builtin.rst +++ b/docs/builtin.rst @@ -47,7 +47,7 @@ Available - Built-in - In Progress - :gh:`4` - * - :class:`junifer.configs.juseless.JuselessDataladUKBVBM` + * - :class:`junifer.configs.juseless.datagrabbers.JuselessDataladUKBVBM` - UKB VBM dataset preprocessed with CAT. Available for Juseless only. - Restricted - ``junifer.configs.juseless`` @@ -56,7 +56,7 @@ Available * - :class:`junifer.configs.juseless.datagrabbers.JuselessDataladCamCANVBM` - CamCAN VBM dataset preprocessed with CAT. Available for Juseless only. - Restricted - - ``junifer.configs.juseless.datagrabbers`` + - ``junifer.configs.juseless`` - Done - 0.0.1 * - :class:`junifer.datagrabber.DataladAOMICID1000` @@ -77,7 +77,7 @@ Available - Built-in - Done - 0.0.1 - * - :class:`junifer.configs.juseless.JuselessDataladAOMICVBM` + * - :class:`junifer.configs.juseless.datagrabbers.JuselessDataladAOMICVBM` - AOMIC VBM dataset. Available for Juseless only. - Restricted - ``junifer.configs.juseless`` @@ -86,7 +86,7 @@ Available * - :class:`junifer.configs.juseless.datagrabbers.JuselessDataladIXIVBM` - `IXI VBM dataset `_. Available for Juseless only. - Restricted - - ``junifer.configs.juseless.datagrabbers`` + - ``junifer.configs.juseless`` - Done - 0.0.1 -- 2.52.0 From d4a6323c96cc7e556f190168df35e62a7590a4d3 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Mon, 24 Oct 2022 15:16:49 +0200 Subject: [PATCH 04/18] docs: add FunctionalConnectivitySpheres to available markers --- docs/builtin.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/builtin.rst b/docs/builtin.rst index 10649f5ce..19ef11d07 100644 --- a/docs/builtin.rst +++ b/docs/builtin.rst @@ -154,6 +154,10 @@ Available - Spherical aggregation using mean - Done - 0.0.1 + * - :class:`junifer.markers.FunctionalConnectivitySpheres` + - Perform spherical aggregation and compute functional connectivity + - Done + - 0.0.1 * - :class:`junifer.markers.RSSETSMarker` - Compute root sum of squares of edgewise timeseries - Done -- 2.52.0 From 9a066807bb20fbff77341badf2636212d62ee63d Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Mon, 24 Oct 2022 17:37:40 +0200 Subject: [PATCH 05/18] docs: improve data.rst --- docs/understanding/data.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/understanding/data.rst b/docs/understanding/data.rst index 1010720a8..59b7a283a 100644 --- a/docs/understanding/data.rst +++ b/docs/understanding/data.rst @@ -7,7 +7,7 @@ Description ^^^^^^^^^^^ This is the *object* that traverses the steps of the pipeline. It is indeed a -dictionary of dictionaries. The first level of keys are the :ref:`data_types` +dictionary of dictionaries. The first level of keys are the :ref:`data types ` and a special key named ``meta`` that contains all the information on the data object including source and previous transformation steps. @@ -16,8 +16,8 @@ The second level of keys are the actual data. So far, there are two keys used: - ``path``: path to the file containing the data. - ``data``: the data loaded in memory. -The :ref:`datagrabber` step will only fill the ``path`` value. -The ``data`` value will be filled by the :ref:`datareader` step, if it is one of the possible file types +The :ref:`DataGrabber ` step will only fill the ``path`` value. +The ``data`` value will be filled by the :ref:`DataReader ` step, if it is one of the possible file types that the datareader can read. .. _data_types: -- 2.52.0 From dd8025f81103e13c368b4d12c2a68251cb6e2100 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Mon, 24 Oct 2022 17:38:23 +0200 Subject: [PATCH 06/18] docs: add preprocess.rst --- docs/understanding/index.rst | 1 + docs/understanding/preprocess.rst | 4 ++++ 2 files changed, 5 insertions(+) create mode 100644 docs/understanding/preprocess.rst diff --git a/docs/understanding/index.rst b/docs/understanding/index.rst index e24c92883..b4a17108e 100644 --- a/docs/understanding/index.rst +++ b/docs/understanding/index.rst @@ -24,5 +24,6 @@ julearn_). data datagrabber datareader + preprocess marker storage diff --git a/docs/understanding/preprocess.rst b/docs/understanding/preprocess.rst new file mode 100644 index 000000000..39c1ba0fd --- /dev/null +++ b/docs/understanding/preprocess.rst @@ -0,0 +1,4 @@ +.. include:: ../links.inc + +Preprocess +========== -- 2.52.0 From d063f5d7609f7164024183b6880b2882468174ce Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Mon, 24 Oct 2022 17:39:17 +0200 Subject: [PATCH 07/18] docs: update title of datagrabber.rst and datareader.rst --- docs/understanding/datagrabber.rst | 4 ++-- docs/understanding/datareader.rst | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/understanding/datagrabber.rst b/docs/understanding/datagrabber.rst index ed27cc606..f5e2b7e04 100644 --- a/docs/understanding/datagrabber.rst +++ b/docs/understanding/datagrabber.rst @@ -2,8 +2,8 @@ .. _datagrabber: -Data Grabber -============ +DataGrabber +=========== Description diff --git a/docs/understanding/datareader.rst b/docs/understanding/datareader.rst index 8a3521efd..0aec04547 100644 --- a/docs/understanding/datareader.rst +++ b/docs/understanding/datareader.rst @@ -2,5 +2,5 @@ .. _datareader: -Data Reader -=========== +DataReader +========== -- 2.52.0 From 395401ef18b54a8dfd1149f7d6733ed820896f03 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Tue, 25 Oct 2022 08:50:46 +0200 Subject: [PATCH 08/18] docs: improve installation.rst --- docs/installation.rst | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index 90209b8e5..f52e13d1c 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -9,14 +9,14 @@ Requirements junifer is compatible with `Python`_ >= 3.8 and requires the following packages: -* click>=8.1.3,<8.2 -* numpy>=1.22,<1.23 -* datalad>=0.15.4,<0.18 -* pandas>=1.4.0,<1.5 -* nibabel>=3.2.0,<4.1 -* nilearn>=0.9.0,<1.0 -* sqlalchemy>=1.4.27,<= 1.5.0 -* pyyaml>=5.1.2,<7.0 +* ``click>=8.1.3,<8.2`` +* ``numpy>=1.22,<1.23`` +* ``datalad>=0.15.4,<0.18`` +* ``pandas>=1.4.0,<1.5`` +* ``nibabel>=3.2.0,<4.1`` +* ``nilearn>=0.9.0,<1.0`` +* ``sqlalchemy>=1.4.27,<= 1.5.0`` +* ``pyyaml>=5.1.2,<7.0`` Depending on the installation method, these packages might be installed automatically. -- 2.52.0 From dda62721175ef1d683c62af58d47b435f5243476 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Tue, 25 Oct 2022 09:06:17 +0200 Subject: [PATCH 09/18] docs: correct article in understanding/index.rst --- docs/understanding/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/understanding/index.rst b/docs/understanding/index.rst index b4a17108e..abc1a6e00 100644 --- a/docs/understanding/index.rst +++ b/docs/understanding/index.rst @@ -4,7 +4,7 @@ Understanding junifer ===================== Before you start, you should understand how junifer works. Junifer is a -tool conceived to extract features from neuroimaging data in a easy-to-use +tool conceived to extract features from neuroimaging data in an easy-to-use manner, with minimal coding and minimal user expertise in the internal aspects. Unlike other tools like FSL, SPM, AFNI, etc., junifer is not a toolbox to -- 2.52.0 From 9333b65bb00ebd3ef7b9b3fae8dd4cde430664a0 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Tue, 25 Oct 2022 09:09:09 +0200 Subject: [PATCH 10/18] docs: improve understanding/data.rst --- docs/understanding/data.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/understanding/data.rst b/docs/understanding/data.rst index 59b7a283a..5392ba3a5 100644 --- a/docs/understanding/data.rst +++ b/docs/understanding/data.rst @@ -20,13 +20,15 @@ The :ref:`DataGrabber ` step will only fill the ``path`` value. The ``data`` value will be filled by the :ref:`DataReader ` step, if it is one of the possible file types that the datareader can read. +A point to note is that you never directly interact with the *data object* but it's important to know where and how the object is being manipulated to reason about your pipeine. + .. _data_types: Data types ^^^^^^^^^^ -.. list-table:: Built-in data types - :widths: 30 80 40 +.. list-table:: + :widths: auto :header-rows: 1 * - Name -- 2.52.0 From 1e3f71af5b70540d98b5f2704e7ed7bc11748703 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Tue, 25 Oct 2022 10:49:53 +0200 Subject: [PATCH 11/18] docs: improve datagrabber.rst --- docs/understanding/data.rst | 2 + docs/understanding/datagrabber.rst | 74 +++++++++++++++--------------- 2 files changed, 40 insertions(+), 36 deletions(-) diff --git a/docs/understanding/data.rst b/docs/understanding/data.rst index 5392ba3a5..b119cd6ac 100644 --- a/docs/understanding/data.rst +++ b/docs/understanding/data.rst @@ -1,5 +1,7 @@ .. include:: ../links.inc +.. _data_object: + The Data Object =============== diff --git a/docs/understanding/datagrabber.rst b/docs/understanding/datagrabber.rst index f5e2b7e04..6377f3999 100644 --- a/docs/understanding/datagrabber.rst +++ b/docs/understanding/datagrabber.rst @@ -5,47 +5,49 @@ DataGrabber =========== - Description ^^^^^^^^^^^ -A datagrabber is an object that can provide datasets you want to junifer. -For example, a DataladDataGrabber can provide data from a Datalad dataset to junifer. -Of course, datagrabbers are not only possible for Datalad but any origin of a dataset. -It is intended to use them as context managers. -If you are interested in just using already provided datagrabbers please go to :doc:`../builtin`. -If you want to implement your own Data Grabbers you need to inherit from different types of -Data Grabbers we already provide. -Typical Data Grabbers -^^^^^^^^^^^^^^^^^^^^^ -In this section we will showcase different types of datagrabber classes you might want to use -to implement your own datagrabbers for your own data. +The ``DataGrabber`` is an object that can provide an interface to datasets you want to work with in junifer. +Every concrete implementation of a datagrabber is aware of a particular dataset's structure and thus allows +you to fetch specific elements of interest from the dataset. It adds the ``path`` key to each :ref:`data type ` +in the :ref:`Data object `. -.. list-table:: Data Grabbers Type - :widths: 25 35 +Datagrabbers are intended to be used as context managers. When used within a context, a datagrabber takes care +of any pre and post steps for interacting with the dataset, for example, downloading and cleaning up. As the interface +is consistent, you always use the same procedure to interact with the datagrabber. + +For example, a concrete implementation of :class:`junifer.datagrabber.DataladDataGrabber` can provide junifer +with data from a Datalad dataset. Of course, datagrabbers are not only meant to work with Datalad datasets but +any dataset. + +If you are interested in using already provided datagrabbers please go to :doc:`../builtin`. And, if you want +to implement your own datagrabber, you need to provide concrete implementations of base classes already +provided. + +Base classes +^^^^^^^^^^^^ +In this section, we showcase different abstract base classes you might want to use to implement your own datagrabber. + +.. list-table:: + :widths: auto :header-rows: 1 * - Name - Description - * - :py:class:`~junifer.datagrabber.base.BaseDataGrabber` - - | An abstract class providing you an interface to implement for you own datagrabber. - | This is not intedent to be used in general. - | Instead you should use the DataladDataGrabber or PatternDataGrabber if possible. - | You have to at least implement the ``get_elements`` method, but most of the time - | you should also overwrite other existing methods like ``__enter__`` and ``__exit__``. - * - :py:class:`~junifer.datagrabber.pattern.PatternDataGrabber` - - | Implements some functionality to help you to define the pattern of the dataset you want to get. - | E.g. you know that T1 images are found in a directory following this pattern - | inside of the dataset "{subject}/anat/{subject}_T1w.nii.gz". - | Now you can provide this to the PatternDataGrabber - | and it will be able to get the image to junifer. - * - :py:class:`~junifer.datagrabber.datalad_base.DataladDataGrabber` - - | Implements some functionality specific to basic usage of Datalad datasets. - | This mostly takes care of the ``__enter__`` and ``__exit__`` methods to clone your Datalad dataset - | and remove it on ``__exit__``. - | This means that even if your code fails inside of the context of the - | datagrabber the DataladDataGrabber cleans up the created Datalad directories. - * - :py:class:`~junifer.datagrabber.pattern_datalad.PatternDataladDataGrabber` - - | Combination of PatternDataGrabber and DataladDataGrabber. - | Probably the class you are looking for when using Datalad. - + * - :class:`junifer.datagrabber.BaseDataGrabber` + - | The abstract base class providing you an interface to implement your own datagrabber. + | You should try to avoid using this directly and instead use + | :class:`junifer.datagrabber.PatternDataGrabber` or :class:`junifer.datagrabber.DataladDataGrabber`. + | To build your own custom *low-level* datagrabber, you need to at least implement the ``get_elements`` method, + | but most of the time you should also override other existing methods like ``__enter__`` and ``__exit__``. + * - :class:`junifer.datagrabber.PatternDataGrabber` + - | It implements functionality to help you define the pattern of the dataset you want to get. For example, + | you know that T1 images are found in a directory following this pattern ``{subject}/anat/{subject}_T1w.nii.gz`` + | inside of the dataset. Now you can provide this to the **PatternDataGrabber** and it will be able to get the file. + * - :class:`junifer.datagrabber.DataladDataGrabber` + - | It implements functionality to deal with Datalad datasets. Specifically, the ``__enter__`` and ``__exit__`` methods + | take care of cloning and removing the Datalad dataset. + * - :class:`junifer.datagrabber.PatternDataladDataGrabber` + - | It is a combination of :class:`junifer.datagrabber.PatternPatternDataGrabber` and + | :class:`junifer.datagrabber.DataladDataGrabber`. This is probably the class you are looking for when using Datalad. -- 2.52.0 From f562d5de80a626f878db8d4480e5e202948d291b Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Tue, 25 Oct 2022 11:57:49 +0200 Subject: [PATCH 12/18] docs: add content in datareader.rst --- docs/understanding/datareader.rst | 40 +++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/docs/understanding/datareader.rst b/docs/understanding/datareader.rst index 0aec04547..774f402db 100644 --- a/docs/understanding/datareader.rst +++ b/docs/understanding/datareader.rst @@ -4,3 +4,43 @@ DataReader ========== + +Description +^^^^^^^^^^^ + +The ``DataReader`` is an object that is responsible for actually reading data files in junifer. +It reads the value of the key ``path`` for each :ref:`data type ` in the :ref:`Data object ` +and loads them to memory. After reading the data into memory, it adds the key ``data`` to the same level as ``path`` +and the value is the actual data in the memory. + +Datareaders are meant to be used inside the datagrabber context but you can operate on them outside the context as long +as the actual data is in the memory and the Python runtime has not garbage-collected it. + +For data formats not supported by junifer yet, you can either make your own ``DataReader`` or open an issue on +`junifer Github`_ and we can help you out. + +Currently supported file-formats +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +We already provide a concrete implementation :class:`junifer.datareader.DefaultDataReader` which knows how to +read the following file formats: + +.. list-table:: + :widths: auto + :header-rows: 1 + + * - File extension + - File type + - Description + * - ``.nii`` + - NIfTI (uncompressed) + - Uncompressed NIfTI + * - ``.nii.gz`` + - NIfTI (compressed) + - Compressed NIfTI + * - ``.csv`` + - CSV + - Comma-separated values file + * - ``.tsv`` + - TSV + - Tab-separated values file -- 2.52.0 From c1fc4c85437ce2eb12449c2cf8db874ab29a2a57 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Tue, 25 Oct 2022 13:00:23 +0200 Subject: [PATCH 13/18] docs: add missing comma in datagrabber.rst --- docs/understanding/datagrabber.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/understanding/datagrabber.rst b/docs/understanding/datagrabber.rst index 6377f3999..aa6cb7df5 100644 --- a/docs/understanding/datagrabber.rst +++ b/docs/understanding/datagrabber.rst @@ -21,7 +21,7 @@ For example, a concrete implementation of :class:`junifer.datagrabber.DataladDat with data from a Datalad dataset. Of course, datagrabbers are not only meant to work with Datalad datasets but any dataset. -If you are interested in using already provided datagrabbers please go to :doc:`../builtin`. And, if you want +If you are interested in using already provided datagrabbers, please go to :doc:`../builtin`. And, if you want to implement your own datagrabber, you need to provide concrete implementations of base classes already provided. -- 2.52.0 From 3d63a6a392c62f348789538aec978c35eb243938 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Tue, 25 Oct 2022 13:00:41 +0200 Subject: [PATCH 14/18] docs: add content in marker.rst --- docs/understanding/marker.rst | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/understanding/marker.rst b/docs/understanding/marker.rst index 3bf018ba7..915f8ed99 100644 --- a/docs/understanding/marker.rst +++ b/docs/understanding/marker.rst @@ -1,4 +1,23 @@ .. include:: ../links.inc +.. _marker: + Marker ====== + +Description +^^^^^^^^^^^ + +The ``Marker`` is an object that is responsible for feature extraction. It primarily operates on data loaded +in memory by :ref:`datareader ` and stored in the ``data`` key of each :ref:`data type ` +in the :ref:`Data object `. In some cases, it can also operate on pre-processed data as obtained +from the :ref:`Preprocess ` step of the pipeline. It is important to note that this pre-process is +not similar to pre-processing done by tools like FSL, SPM, AFNI, etc. . For example, one can perform confound +removal on loaded data and then perform feature extraction. + +Markers are meant to be used inside the datagrabber context but you can operate on them outside the context as long +as the actual data is in the memory and the Python runtime has not garbage-collected it. + +If you are interested in using already provided markers, please go to :doc:`../builtin`. And, if you want to implement +your own marker, you need to provide concrete implementation of :class:`junifer.markers.BaseMarker`. Specifically, you +need to override ``get_output_kind``, ``store`` and ``compute`` methods. -- 2.52.0 From 8f684e25885a77c4098cc64459fc7fa6061803ab Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Tue, 25 Oct 2022 13:00:56 +0200 Subject: [PATCH 15/18] docs: add preprocess link --- docs/understanding/preprocess.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/understanding/preprocess.rst b/docs/understanding/preprocess.rst index 39c1ba0fd..2e0ff2efa 100644 --- a/docs/understanding/preprocess.rst +++ b/docs/understanding/preprocess.rst @@ -1,4 +1,6 @@ .. include:: ../links.inc +.. _preprocess: + Preprocess ========== -- 2.52.0 From 61ed8bd40568efb8c08fe7cac7a0f563f7522d5e Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Tue, 25 Oct 2022 14:19:04 +0200 Subject: [PATCH 16/18] docs: add content in storage.rst --- docs/understanding/storage.rst | 37 ++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/docs/understanding/storage.rst b/docs/understanding/storage.rst index ef296e1d4..c409809b0 100644 --- a/docs/understanding/storage.rst +++ b/docs/understanding/storage.rst @@ -1,4 +1,41 @@ .. include:: ../links.inc +.. _storage: + Storage ======= + +Description +^^^^^^^^^^^ + +The ``Storage`` is an object that is responsible for storing extracted features as computed from :ref:`Marker ` +step of the pipeline. If the pipeline is provided with a ``storage-like`` object, the extracted features are stored via +that object else they are kept in memory. + +Storage is meant to be used inside the datagrabber context but you can operate on them outside the context as long +as the processed data is in the memory and the Python runtime has not garbage-collected it. + +The :ref:`Markers ` are responsible for defining what *storage kind* (``matrix``, ``table``, ``timeseries``) +they support for which :ref:`data type ` by overriding its ``store`` method. The storage object in turn +declares and provides implementation for specific *storage kind*. For example, :class:`junifer.storage.SQLiteFeatureStorage` +supports saving ``matrix``, ``table`` and ``timeseries`` via ``store_matrix``, ``store_table`` and ``store_timeseries`` +methods respectively. + +For storage interfaces not supported by junifer yet, you can either make your own ``Storage`` by providing a concrete +implementation of :class:`junifer.storage.BaseFeatureStorage` or open an issue on `junifer Github`_ and we can help you out. + +Currently supported storage interfaces +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. list-table:: + :widths: auto + :header-rows: 1 + + * - Storage class + - File extension + - File type + - Storage kinds + * - :class:`junifer.storage.SQLiteFeatureStorage` + - ``.db`` + - SQLite + - ``matrix``, ``table``, ``timeseries`` -- 2.52.0 From a377e342048623bfd65848b1158002b2505273a9 Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Tue, 25 Oct 2022 14:27:37 +0200 Subject: [PATCH 17/18] docs: add content in preprocess.rst --- docs/understanding/preprocess.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/understanding/preprocess.rst b/docs/understanding/preprocess.rst index 2e0ff2efa..eea630214 100644 --- a/docs/understanding/preprocess.rst +++ b/docs/understanding/preprocess.rst @@ -4,3 +4,12 @@ Preprocess ========== + +Description +^^^^^^^^^^^ + +The ``Preprocess`` step of the pipeline is meant for pre-processing before or after :ref:`Marker ` step +depending on the use-case. For example, you might want to perform confound removal on ``BOLD`` data before +feature extraction. + +This step is still under development and is an optional one for the pipeline to work. -- 2.52.0 From 3101f876365660f1f8bf49d1d7e73c667386b74e Mon Sep 17 00:00:00 2001 From: Synchon Mandal Date: Tue, 25 Oct 2022 14:34:20 +0200 Subject: [PATCH 18/18] docs: cleanup conf.py --- docs/conf.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index a6ba15330..fd12b8dcd 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -64,9 +64,19 @@ exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] # a list of builtin themes. # html_theme = "sphinx_rtd_theme" - -html_sidebars = {"**": ["globaltoc.html", "sourcelink.html", "searchbox.html"]} - +html_theme_options = { + "display_version": True, + "style_external_links": True, + "logo_only": True, +} +html_sidebars = { + "**": [ + "globaltoc.html", + "sourcelink.html", + "searchbox.html", + ] +} +html_logo = "./images/junifer_logo.png" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, -- 2.52.0