[ENH]: Consistency of logging #239

Merged
synchon merged 20 commits from update/logging-consistency into main 2026-06-15 09:02:42 +00:00
80 changed files with 284 additions and 100 deletions

View file

@ -0,0 +1 @@
Improve logging consistency of components by `Synchon Mandal`_

View file

@ -23,6 +23,7 @@ DataGrabbers, Preprocessors, Markers, etc., following the *junifer* way.
:caption: Contents:
extension
logging
datagrabber
marker
preprocessor

View file

@ -0,0 +1,38 @@
.. include:: ../links.inc
.. _logging_in_extension:
Logging in a ``junifer`` extension
==================================
It is important to have proper logging in your code and ``junifer`` makes it trivial to do so for your extensions.
For DataGrabber:
.. code-block:: python
from junifer.datagrabber import logger
For Preprocessor:
.. code-block:: python
from junifer.preprocess import logger
For Marker:
.. code-block:: python
from junifer.marker import logger
For Storage:
.. code-block:: python
from junifer.storage import logger
Importing the correct logger will give you a properly set up logger which will fit right in with the rest of ``junifer``\'s log output.

View file

@ -10,6 +10,8 @@ import os
import shutil
from pathlib import Path
import structlog
from ..api.queue_context import GnuParallelLocalAdapter, HTCondorAdapter
from ..datagrabber import BaseDataGrabber
from ..markers import BaseMarker
@ -27,11 +29,14 @@ from ..typing import (
PreprocessorLike,
StorageLike,
)
from ..utils import logger, raise_error, warn_with_log, yaml
from ..utils import raise_error, warn_with_log, yaml
__all__ = ["collect", "list_elements", "queue", "reset", "run"]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="api")
def _get_datagrabber(datagrabber_config: dict) -> DataGrabberLike:
"""Get DataGrabber.

View file

@ -9,12 +9,13 @@ from pathlib import Path
from typing import Any
from ...typing import Elements
from ...utils import logger, make_executable, raise_error, run_ext_cmd
from ...utils import make_executable, raise_error, run_ext_cmd
from .queue_context_adapter import (
EnvKind,
EnvShell,
QueueContextAdapter,
QueueContextEnv,
logger,
)

View file

@ -10,12 +10,13 @@ from pathlib import Path
from typing import Any
from ...typing import Elements
from ...utils import logger, make_executable, raise_error, run_ext_cmd
from ...utils import make_executable, raise_error, run_ext_cmd
from .queue_context_adapter import (
EnvKind,
EnvShell,
QueueContextAdapter,
QueueContextEnv,
logger,
)

View file

@ -19,6 +19,7 @@ else:
from abc import ABC, abstractmethod
from enum import Enum
import structlog
from pydantic import BaseModel, ConfigDict
from ...utils import raise_error
@ -26,6 +27,9 @@ from ...utils import raise_error
__all__ = ["EnvKind", "EnvShell", "QueueContextAdapter", "QueueContextEnv"]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="api")
class EnvKind(str, Enum):
"""Accepted Python environment kind."""

View file

@ -10,13 +10,17 @@ import sys
from pathlib import Path
import pandas as pd
import structlog
from ..typing import Elements
from ..utils import logger, raise_error, warn_with_log, yaml
from ..utils import raise_error, warn_with_log, yaml
__all__ = ["parse_elements", "parse_yaml"]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="cli")
def parse_yaml(filepath: str | Path) -> dict: # noqa: C901
"""Parse YAML.

View file

@ -9,7 +9,7 @@ import numpy as np
from numpy.typing import ArrayLike
from ...pipeline import WorkDirManager
from ...utils import logger, run_ext_cmd
from ...utils import run_ext_cmd
__all__ = ["ANTsCoordinatesWarper"]
@ -46,6 +46,9 @@ class ANTsCoordinatesWarper:
The transformed coordinates.
"""
# Imported here to avoid circular import
from ._coordinates import logger
logger.debug("Using ANTs for coordinates transformation")
# Create element-specific tempdir for storing post-warping assets

View file

@ -9,10 +9,11 @@ from typing import Any
import numpy as np
import pandas as pd
import structlog
from junifer_data import get
from numpy.typing import ArrayLike
from ...utils import logger, raise_error
from ...utils import raise_error
from ..pipeline_data_registry_base import BasePipelineDataRegistry
from ..utils import JUNIFER_DATA_PARAMS, get_dataset_path, get_native_warper
from ._ants_coordinates_warper import ANTsCoordinatesWarper
@ -21,6 +22,9 @@ from ._fsl_coordinates_warper import FSLCoordinatesWarper
__all__ = ["CoordinatesRegistry"]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="data")
class CoordinatesRegistry(BasePipelineDataRegistry):
"""Class for coordinates data registry.

View file

@ -9,7 +9,7 @@ import numpy as np
from numpy.typing import ArrayLike
from ...pipeline import WorkDirManager
from ...utils import logger, run_ext_cmd
from ...utils import run_ext_cmd
__all__ = ["FSLCoordinatesWarper"]
@ -46,6 +46,9 @@ class FSLCoordinatesWarper:
The transformed coordinates.
"""
# Imported here to avoid circular import
from ._coordinates import logger
logger.debug("Using FSL for coordinates transformation")
# Create element-specific tempdir for storing post-warping assets

View file

@ -9,7 +9,7 @@ from typing import TYPE_CHECKING, Any
import nibabel as nib
from ...pipeline import WorkDirManager
from ...utils import logger, raise_error, run_ext_cmd
from ...utils import raise_error, run_ext_cmd
from ..template_spaces import get_template, get_xfm
@ -71,6 +71,9 @@ class ANTsMapsWarper:
If ``warp_data`` is None when ``dst="T1w"``.
"""
# Imported here to avoid circular import
from ._maps import logger
# Create element-scoped tempdir so that warped maps is
# available later as nibabel stores file path reference for
# loading on computation

View file

@ -9,7 +9,7 @@ from typing import TYPE_CHECKING, Any
import nibabel as nib
from ...pipeline import WorkDirManager
from ...utils import logger, run_ext_cmd
from ...utils import run_ext_cmd
if TYPE_CHECKING:
@ -53,6 +53,9 @@ class FSLMapsWarper:
The transformed maps image.
"""
# Imported here to avoid circular import
from ._maps import logger
logger.debug("Using FSL for maps transformation")
# Create element-scoped tempdir so that warped maps is

View file

@ -9,9 +9,10 @@ from typing import TYPE_CHECKING, Any, Optional
import nibabel as nib
import nilearn.image as nimg
import numpy as np
import structlog
from junifer_data import get
from ...utils import logger, raise_error
from ...utils import raise_error
from ..pipeline_data_registry_base import BasePipelineDataRegistry
from ..utils import (
JUNIFER_DATA_PARAMS,
@ -29,6 +30,9 @@ if TYPE_CHECKING:
__all__ = ["MapsRegistry"]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="data")
class MapsRegistry(BasePipelineDataRegistry):
"""Class for maps data registry.

View file

@ -10,7 +10,7 @@ import nibabel as nib
import numpy as np
from ...pipeline import WorkDirManager
from ...utils import logger, raise_error, run_ext_cmd
from ...utils import raise_error, run_ext_cmd
from ..template_spaces import get_template, get_xfm
@ -92,6 +92,9 @@ class ANTsMaskWarper:
If ``warp_data`` is None when ``dst="T1w"``.
"""
# Imported here to avoid circular import
from ._masks import logger
# Create element-scoped tempdir so that warped mask is
# available later as nibabel stores file path reference for
# loading on computation

View file

@ -10,7 +10,7 @@ import nibabel as nib
import numpy as np
from ...pipeline import WorkDirManager
from ...utils import logger, run_ext_cmd
from ...utils import run_ext_cmd
if TYPE_CHECKING:
@ -74,6 +74,9 @@ class FSLMaskWarper:
The transformed mask image.
"""
# Imported here to avoid circular import
from ._masks import logger
logger.debug("Using FSL for mask transformation")
# Create element-scoped tempdir so that warped mask is

View file

@ -15,6 +15,7 @@ from typing import (
import nibabel as nib
import nilearn.image as nimg
import numpy as np
import structlog
from junifer_data import get
from nilearn.masking import (
compute_background_mask,
@ -22,7 +23,7 @@ from nilearn.masking import (
intersect_masks,
)
from ...utils import logger, raise_error
from ...utils import raise_error
from ..pipeline_data_registry_base import BasePipelineDataRegistry
from ..template_spaces import get_template
from ..utils import (
@ -41,6 +42,9 @@ if TYPE_CHECKING:
__all__ = ["MaskRegistry", "compute_brain_mask"]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="data")
def compute_brain_mask(
target_data: dict[str, Any],

View file

@ -9,7 +9,7 @@ from typing import TYPE_CHECKING, Any
import nibabel as nib
from ...pipeline import WorkDirManager
from ...utils import logger, raise_error, run_ext_cmd
from ...utils import raise_error, run_ext_cmd
from ..template_spaces import get_template, get_xfm
@ -71,6 +71,9 @@ class ANTsParcellationWarper:
If ``warp_data`` is None when ``dst="T1w"``.
"""
# Imported here to avoid circular import
from ._parcellations import logger
# Create element-scoped tempdir so that warped parcellation is
# available later as nibabel stores file path reference for
# loading on computation

View file

@ -9,7 +9,7 @@ from typing import TYPE_CHECKING, Any
import nibabel as nib
from ...pipeline import WorkDirManager
from ...utils import logger, run_ext_cmd
from ...utils import run_ext_cmd
if TYPE_CHECKING:
@ -53,6 +53,9 @@ class FSLParcellationWarper:
The transformed parcellation image.
"""
# Imported here to avoid circular import
from ._parcellations import logger
logger.debug("Using FSL for parcellation transformation")
# Create element-scoped tempdir so that warped parcellation is

View file

@ -13,9 +13,10 @@ import nibabel as nib
import nilearn.image as nimg
import numpy as np
import pandas as pd
import structlog
from junifer_data import get
from ...utils import logger, raise_error, warn_with_log
from ...utils import raise_error, warn_with_log
from ..pipeline_data_registry_base import BasePipelineDataRegistry
from ..utils import (
JUNIFER_DATA_PARAMS,
@ -36,6 +37,9 @@ __all__ = [
"merge_parcellations",
]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="data")
class ParcellationRegistry(BasePipelineDataRegistry):
"""Class for parcellation data registry.
@ -58,8 +62,12 @@ class ParcellationRegistry(BasePipelineDataRegistry):
# The built-in parcellations are files that are shipped with the
# junifer-data dataset.
# Make built-in and external dictionaries for validation later
self._builtin = {}
self._external = {}
self._builtin: dict[
str, dict[str, str | int | Path | list[str] | list[int]]
] = {}
self._external: dict[
str, dict[str, str | int | Path | list[str] | list[int]]
] = {}
# Add SUIT
self._builtin.update(

View file

@ -8,15 +8,19 @@ from typing import Any, Union
import nibabel as nib
import numpy as np
import structlog
from junifer_data import get
from templateflow import api as tflow
from ..utils import logger, raise_error
from ..utils import raise_error
from .utils import JUNIFER_DATA_PARAMS, closest_resolution, get_dataset_path
__all__ = ["get_template", "get_xfm"]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="data")
def get_xfm(src: str, dst: str) -> Path: # pragma: no cover
"""Fetch warp files to convert from ``src`` to ``dst``.

View file

@ -8,8 +8,9 @@ from collections.abc import MutableMapping
from pathlib import Path
import numpy as np
import structlog
from ..utils import config, logger, raise_error
from ..utils import config, raise_error
__all__ = [
@ -21,6 +22,8 @@ __all__ = [
"get_native_warper",
]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="data")
# junifer-data version constant
JUNIFER_DATA_VERSION = "7"

View file

@ -26,10 +26,11 @@ __all__ = [
"DataType",
"ConfoundsFormat",
"register_confounds_format",
"logger",
]
# These 4 need to be in this order, otherwise it is a circular import
from .base import BaseDataGrabber, DataType
from .base import BaseDataGrabber, DataType, logger
from .datalad_base import DataladDataGrabber
from .pattern import (
PatternDataGrabber,

View file

@ -11,16 +11,20 @@ from enum import Enum
from pathlib import Path
from typing import Annotated, Any
import structlog
from aenum import Enum as AEnum
from pydantic import BaseModel, BeforeValidator, ConfigDict, Field
from ..pipeline import UpdateMetaMixin
from ..typing import Element, Elements
from ..utils import ensure_list, logger, raise_error
from ..utils import ensure_list, raise_error
__all__ = ["BaseDataGrabber", "DataType"]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="datagrabber", step="datagrabber")
class DataType(str, AEnum):
"""Accepted data type."""
@ -64,11 +68,16 @@ class BaseDataGrabber(BaseModel, ABC, UpdateMetaMixin):
datadir: Path
def model_post_init(self, context: Any): # noqa: D102
logger.debug("Initializing BaseDataGrabber")
logger.debug(f"\tdatadir = {self.datadir}")
logger.debug(f"\ttypes = {self.types}")
# Run extra validation for datagrabbers and fail early if needed
self.validate_datagrabber_params()
# Convert to correct data type
self.types = [
DataType(t) if isinstance(t, str) else t for t in self.types
]
logger.info(
f"Parameters: {self.model_dump(mode='json')}",
component=self.__class__.__name__,
)
def validate_datagrabber_params(self) -> None:
"""Run extra logical validation for datagrabber.

View file

@ -20,8 +20,8 @@ from pydantic import AnyUrl, Field, field_validator
from ..api.decorators import register_datagrabber
from ..pipeline import WorkDirManager
from ..typing import Element
from ..utils import config, logger, raise_error, warn_with_log
from .base import BaseDataGrabber
from ..utils import config, raise_error, warn_with_log
from .base import BaseDataGrabber, logger
__all__ = ["DataladDataGrabber"]

View file

@ -16,8 +16,8 @@ from pydantic import Field
from ..api.decorators import register_datagrabber
from ..typing import DataGrabberPatterns, Elements
from ..utils import logger, raise_error
from .base import BaseDataGrabber
from ..utils import raise_error
from .base import BaseDataGrabber, logger
from .pattern_validation_mixin import PatternValidationMixin

View file

@ -8,7 +8,7 @@
from pydantic import ConfigDict
from ..api.decorators import register_datagrabber
from ..utils import logger
from .base import logger
from .datalad_base import DataladDataGrabber
from .pattern import PatternDataGrabber

View file

@ -16,9 +16,9 @@ from collections.abc import Iterator, MutableMapping
from aenum import extend_enum
from ..datagrabber import DataType
from ..typing import DataGrabberPatterns
from ..utils import logger, raise_error, warn_with_log
from ..utils import raise_error, warn_with_log
from .base import DataType, logger
__all__ = [

View file

@ -8,15 +8,18 @@ from pathlib import Path
import nibabel as nib
import pandas as pd
import structlog
from pydantic import BaseModel
from ..api.decorators import register_datareader
from ..pipeline import PipelineStepMixin, UpdateMetaMixin
from ..utils.logging import logger, warn_with_log
from ..utils.logging import warn_with_log
__all__ = ["DefaultDataReader"]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="datareader", step="datareader")
# Map each file extension to a type
_extensions = {

View file

@ -23,9 +23,10 @@ __all__ = [
"TemporalSNRParcels",
"TemporalSNRSpheres",
"BrainPrint",
"logger",
]
from .base import BaseMarker
from .base import BaseMarker, logger
from .ets_rss import RSSETSMarker
from .maps_aggregation import MapsAggregation
from .parcel_aggregation import ParcelAggregation

View file

@ -8,17 +8,21 @@ from abc import ABC, abstractmethod
from copy import deepcopy
from typing import Any, ClassVar
import structlog
from pydantic import BaseModel, ConfigDict
from ..datagrabber import DataType
from ..pipeline import PipelineStepMixin, UpdateMetaMixin
from ..storage import StorageType
from ..typing import MarkerInOutMappings, StorageLike
from ..utils import logger, raise_error
from ..utils import raise_error
__all__ = ["BaseMarker"]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="markers", step="marker")
class BaseMarker(BaseModel, ABC, PipelineStepMixin, UpdateMetaMixin):
"""Abstract base class for marker.
@ -84,6 +88,9 @@ class BaseMarker(BaseModel, ABC, PipelineStepMixin, UpdateMetaMixin):
self.validate_marker_params()
# Set default name if not provided
self.name = self.__class__.__name__ if self.name is None else self.name
logger.info(
f"Parameters: {self.model_dump(mode='json')}", component=self.name
)
@property
def valid_inputs(self) -> list[DataType]:

View file

@ -24,8 +24,8 @@ from ..external.BrainPrint.brainprint.surfaces import surf_to_vtk
from ..pipeline import ExtDep, WorkDirManager
from ..storage import StorageType
from ..typing import Dependencies, ExternalDependencies, MarkerInOutMappings
from ..utils import logger, run_ext_cmd
from .base import BaseMarker
from ..utils import run_ext_cmd
from .base import BaseMarker, logger
__all__ = ["BrainPrint"]

View file

@ -9,7 +9,8 @@ import neurokit2 as nk
import numpy as np
from ...api.decorators import register_marker
from ...utils import logger, warn_with_log
from ...utils import warn_with_log
from ..base import logger
from .complexity_base import ComplexityBase

View file

@ -9,7 +9,8 @@ import neurokit2 as nk
import numpy as np
from ...api.decorators import register_marker
from ...utils import logger, warn_with_log
from ...utils import warn_with_log
from ..base import logger
from .complexity_base import ComplexityBase

View file

@ -9,7 +9,8 @@ import neurokit2 as nk
import numpy as np
from ...api.decorators import register_marker
from ...utils import logger, warn_with_log
from ...utils import warn_with_log
from ..base import logger
from .complexity_base import ComplexityBase

View file

@ -9,7 +9,8 @@ import neurokit2 as nk
import numpy as np
from ...api.decorators import register_marker
from ...utils import logger, warn_with_log
from ...utils import warn_with_log
from ..base import logger
from .complexity_base import ComplexityBase

View file

@ -9,7 +9,8 @@ import neurokit2 as nk
import numpy as np
from ...api.decorators import register_marker
from ...utils import logger, warn_with_log
from ...utils import warn_with_log
from ..base import logger
from .complexity_base import ComplexityBase

View file

@ -9,7 +9,8 @@ import neurokit2 as nk
import numpy as np
from ...api.decorators import register_marker
from ...utils import logger, warn_with_log
from ...utils import warn_with_log
from ..base import logger
from .complexity_base import ComplexityBase

View file

@ -9,7 +9,8 @@ import neurokit2 as nk
import numpy as np
from ...api.decorators import register_marker
from ...utils import logger, warn_with_log
from ...utils import warn_with_log
from ..base import logger
from .complexity_base import ComplexityBase

View file

@ -15,8 +15,8 @@ from ..api.decorators import register_marker
from ..datagrabber import DataType
from ..storage import StorageType
from ..typing import Dependencies, MarkerInOutMappings
from ..utils import ensure_list, ensure_list_or_none, logger
from .base import BaseMarker
from ..utils import ensure_list, ensure_list_or_none
from .base import BaseMarker, logger
from .parcel_aggregation import ParcelAggregation
from .utils import _ets

View file

@ -15,8 +15,9 @@ import nibabel as nib
from ...pipeline import ExtDep, WorkDirManager
from ...typing import ExternalDependencies
from ...utils import logger, run_ext_cmd
from ...utils import run_ext_cmd
from ...utils.singleton import Singleton
from ..base import logger
if TYPE_CHECKING:

View file

@ -17,8 +17,8 @@ from nilearn import image as nimg
from ...pipeline import WorkDirManager
from ...typing import Dependencies
from ...utils import logger
from ...utils.singleton import Singleton
from ..base import logger
if TYPE_CHECKING:

View file

@ -20,8 +20,8 @@ from pydantic import BeforeValidator, PositiveFloat
from ...datagrabber import DataType
from ...storage import StorageType
from ...typing import ConditionalDependencies, MarkerInOutMappings
from ...utils import ensure_list_or_none, logger
from ..base import BaseMarker
from ...utils import ensure_list_or_none
from ..base import BaseMarker, logger
from ._afni_falff import AFNIALFF
from ._junifer_falff import JuniferALFF

View file

@ -7,7 +7,7 @@ from typing import Any
from ...api.decorators import register_marker
from ...datagrabber import DataType
from ...utils import logger
from ..base import logger
from ..maps_aggregation import MapsAggregation
from .falff_base import ALFFBase

View file

@ -12,7 +12,8 @@ from pydantic import BeforeValidator
from ...api.decorators import register_marker
from ...datagrabber import DataType
from ...utils import ensure_list, logger
from ...utils import ensure_list
from ..base import logger
from ..parcel_aggregation import ParcelAggregation
from .falff_base import ALFFBase

View file

@ -12,7 +12,7 @@ from pydantic import PositiveFloat
from ...api.decorators import register_marker
from ...datagrabber import DataType
from ...utils import logger
from ..base import logger
from ..sphere_aggregation import SphereAggregation
from .falff_base import ALFFBase

View file

@ -13,8 +13,8 @@ from ...api.decorators import register_marker
from ...datagrabber import DataType
from ...storage import StorageType
from ...typing import Dependencies, MarkerInOutMappings
from ...utils import ensure_list_or_none, logger, raise_error
from ..base import BaseMarker
from ...utils import ensure_list_or_none, raise_error
from ..base import BaseMarker, logger
from ..parcel_aggregation import ParcelAggregation
from ..utils import _correlate_dataframes

View file

@ -14,8 +14,8 @@ from ..datagrabber import DataType
from ..stats import get_aggfunc_by_name
from ..storage import StorageType
from ..typing import Dependencies, MarkerInOutMappings
from ..utils import ensure_list_or_none, logger, raise_error, warn_with_log
from .base import BaseMarker
from ..utils import ensure_list_or_none, raise_error, warn_with_log
from .base import BaseMarker, logger
__all__ = ["MapsAggregation"]

View file

@ -20,11 +20,10 @@ from ..typing import Dependencies, MarkerInOutMappings
from ..utils import (
ensure_list,
ensure_list_or_none,
logger,
raise_error,
warn_with_log,
)
from .base import BaseMarker
from .base import BaseMarker, logger
__all__ = ["ParcelAggregation"]

View file

@ -15,8 +15,9 @@ import nibabel as nib
from ...pipeline import ExtDep, WorkDirManager
from ...typing import ExternalDependencies
from ...utils import logger, run_ext_cmd
from ...utils import run_ext_cmd
from ...utils.singleton import Singleton
from ..base import logger
if TYPE_CHECKING:

View file

@ -19,8 +19,9 @@ from nilearn import masking as nmask
from ...pipeline import WorkDirManager
from ...typing import Dependencies
from ...utils import logger, raise_error
from ...utils import raise_error
from ...utils.singleton import Singleton
from ..base import logger
if TYPE_CHECKING:

View file

@ -17,8 +17,8 @@ from pydantic import BeforeValidator
from ...datagrabber import DataType
from ...storage import StorageType
from ...typing import ConditionalDependencies, MarkerInOutMappings
from ...utils import ensure_list_or_none, logger
from ..base import BaseMarker
from ...utils import ensure_list_or_none
from ..base import BaseMarker, logger
from ._afni_reho import AFNIReHo
from ._junifer_reho import JuniferReHo

View file

@ -9,7 +9,7 @@ import numpy as np
from ...api.decorators import register_marker
from ...datagrabber import DataType
from ...utils import logger
from ..base import logger
from ..maps_aggregation import MapsAggregation
from .reho_base import ReHoBase

View file

@ -10,7 +10,8 @@ from pydantic import BeforeValidator
from ...api.decorators import register_marker
from ...datagrabber import DataType
from ...utils import ensure_list, logger
from ...utils import ensure_list
from ..base import logger
from ..parcel_aggregation import ParcelAggregation
from .reho_base import ReHoBase

View file

@ -10,7 +10,7 @@ from pydantic import PositiveFloat
from ...api.decorators import register_marker
from ...datagrabber import DataType
from ...utils import logger
from ..base import logger
from ..sphere_aggregation import SphereAggregation
from .reho_base import ReHoBase

View file

@ -15,8 +15,8 @@ from ..external.nilearn import JuniferNiftiSpheresMasker
from ..stats import get_aggfunc_by_name
from ..storage import StorageType
from ..typing import Dependencies, MarkerInOutMappings
from ..utils import ensure_list_or_none, logger, raise_error, warn_with_log
from .base import BaseMarker
from ..utils import ensure_list_or_none, raise_error, warn_with_log
from .base import BaseMarker, logger
__all__ = ["SphereAggregation"]

View file

@ -5,13 +5,17 @@
import numpy as np
import pandas as pd
import structlog
from ..typing import StorageLike
from ..utils import logger, raise_error, warn_with_log
from ..utils import raise_error, warn_with_log
__all__ = ["read_transform"]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="onthefly")
def read_transform(
storage: StorageLike,

View file

@ -7,14 +7,19 @@
from collections import Counter
from pathlib import Path
import structlog
from ..datareader import DefaultDataReader
from ..pipeline import DataObjectDumper, PipelineStepMixin, WorkDirManager
from ..typing import DataGrabberLike, MarkerLike, PreprocessorLike, StorageLike
from ..utils import config, logger, raise_error
from ..utils import config, raise_error
__all__ = ["MarkerCollection"]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="pipeline")
class MarkerCollection:
"""Class for marker collection.

View file

@ -8,13 +8,18 @@
import importlib
from collections.abc import Mapping
import structlog
from ..typing import DataGrabberLike, MarkerLike, PreprocessorLike, StorageLike
from ..utils import logger, raise_error
from ..utils import raise_error
from ..utils.singleton import Singleton
__all__ = ["PipelineComponentRegistry"]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="pipeline")
class PipelineComponentRegistry(metaclass=Singleton):
"""Class for pipeline component registry.

View file

@ -10,7 +10,7 @@ from typing import Any
from pydantic import validate_call
from ..utils.logging import raise_error, warn_with_log
from ..utils import raise_error, warn_with_log
__all__ = ["ExtDep", "check_ext_dependencies"]

View file

@ -8,12 +8,16 @@ import shutil
import tempfile
from pathlib import Path
from ..utils import logger
import structlog
from ..utils.singleton import Singleton
__all__ = ["WorkDirManager"]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="pipeline")
class WorkDirManager(metaclass=Singleton):
"""Class for working directory manager.

View file

@ -9,9 +9,10 @@ __all__ = [
"SmoothingImpl",
"TemporalSlicer",
"TemporalFilter",
"logger",
]
from .base import BasePreprocessor
from .base import BasePreprocessor, logger
from .confounds import fMRIPrepConfoundRemover, Confounds, Strategy
from .warping import SpaceWarper, SpaceWarpingImpl
from .smoothing import Smoothing, SmoothingImpl

View file

@ -22,8 +22,8 @@ from ..data import get_data
from ..datagrabber import DataType
from ..pipeline import WorkDirManager
from ..typing import Dependencies
from ..utils import ensure_list_or_none, logger
from .base import BasePreprocessor
from ..utils import ensure_list_or_none
from .base import BasePreprocessor, logger
__all__ = ["TemporalFilter"]

View file

@ -14,8 +14,8 @@ from ..api.decorators import register_preprocessor
from ..datagrabber import DataType
from ..pipeline import WorkDirManager
from ..typing import Dependencies
from ..utils import logger, raise_error
from .base import BasePreprocessor
from ..utils import raise_error
from .base import BasePreprocessor, logger
__all__ = ["TemporalSlicer"]

View file

@ -8,15 +8,19 @@ from abc import ABC, abstractmethod
from collections.abc import Sequence
from typing import Annotated, Any, ClassVar
import structlog
from pydantic import BaseModel, BeforeValidator, ConfigDict
from ..datagrabber import DataType
from ..pipeline import PipelineStepMixin, UpdateMetaMixin
from ..utils import ensure_list_or_none, logger, raise_error
from ..utils import ensure_list_or_none, raise_error
__all__ = ["BasePreprocessor"]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="preprocess", step="preprocessing")
class BasePreprocessor(BaseModel, ABC, PipelineStepMixin, UpdateMetaMixin):
"""Abstract base class for preprocessor.
@ -97,6 +101,10 @@ class BasePreprocessor(BaseModel, ABC, PipelineStepMixin, UpdateMetaMixin):
DataType(t) if isinstance(t, str) else t
for t in self.required_data_types
]
logger.info(
f"Parameters: {self.model_dump(mode='json')}",
component=self.__class__.__name__,
)
@property
def valid_inputs(self) -> list[DataType]:

View file

@ -35,8 +35,8 @@ from ...data import get_data
from ...datagrabber import DataType
from ...pipeline import WorkDirManager
from ...typing import Dependencies
from ...utils import ensure_list_or_none, logger, raise_error
from ..base import BasePreprocessor
from ...utils import ensure_list_or_none, raise_error
from ..base import BasePreprocessor, logger
__all__ = ["Confounds", "Strategy", "fMRIPrepConfoundRemover"]

View file

@ -12,7 +12,8 @@ import nibabel as nib
from ...pipeline import ExtDep, WorkDirManager
from ...typing import Dependencies, ExternalDependencies
from ...utils import logger, run_ext_cmd
from ...utils import run_ext_cmd
from ..base import logger
__all__ = ["AFNISmoothing"]

View file

@ -12,7 +12,8 @@ import nibabel as nib
from ...pipeline import ExtDep, WorkDirManager
from ...typing import Dependencies, ExternalDependencies
from ...utils import logger, run_ext_cmd
from ...utils import run_ext_cmd
from ..base import logger
__all__ = ["FSLSmoothing"]

View file

@ -15,7 +15,7 @@ from numpy.typing import ArrayLike
from ...pipeline import WorkDirManager
from ...typing import Dependencies
from ...utils import logger
from ..base import logger
__all__ = ["NilearnSmoothing"]

View file

@ -17,8 +17,8 @@ from pydantic import BeforeValidator
from ...api.decorators import register_preprocessor
from ...datagrabber import DataType
from ...typing import ConditionalDependencies
from ...utils import ensure_list_or_none, logger
from ..base import BasePreprocessor
from ...utils import ensure_list_or_none
from ..base import BasePreprocessor, logger
from ._afni_smoothing import AFNISmoothing
from ._fsl_smoothing import FSLSmoothing
from ._nilearn_smoothing import NilearnSmoothing

View file

@ -14,7 +14,8 @@ import numpy as np
from ...data import get_template, get_xfm
from ...pipeline import ExtDep, WorkDirManager
from ...typing import Dependencies, ExternalDependencies
from ...utils import logger, raise_error, run_ext_cmd
from ...utils import raise_error, run_ext_cmd
from ..base import logger
__all__ = ["ANTsWarper"]

View file

@ -13,7 +13,8 @@ import numpy as np
from ...pipeline import ExtDep, WorkDirManager
from ...typing import Dependencies, ExternalDependencies
from ...utils import logger, raise_error, run_ext_cmd
from ...utils import raise_error, run_ext_cmd
from ..base import logger
__all__ = ["FSLWarper"]

View file

@ -13,8 +13,8 @@ from templateflow import api as tflow
from ...api.decorators import register_preprocessor
from ...datagrabber import DataType
from ...typing import ConditionalDependencies
from ...utils import ensure_list_or_none, logger, raise_error
from ..base import BasePreprocessor
from ...utils import ensure_list_or_none, raise_error
from ..base import BasePreprocessor, logger
from ._ants_warper import ANTsWarper
from ._fsl_warper import FSLWarper

View file

@ -9,11 +9,12 @@ from enum import Enum
from typing import Any
import numpy as np
import structlog
from pydantic import validate_call
from scipy.stats import mode, trim_mean
from scipy.stats.mstats import winsorize
from .utils import logger, raise_error
from .utils import raise_error
__all__ = [
@ -24,6 +25,9 @@ __all__ = [
"winsorized_mean",
]
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="stats")
class AggFunc(str, Enum):
"""Accepted aggregation function names.

View file

@ -6,9 +6,10 @@ __all__ = [
"PandasBaseFeatureStorage",
"SQLiteFeatureStorage",
"Upsert",
"logger",
]
from .base import BaseFeatureStorage, MatrixKind, StorageType
from .base import BaseFeatureStorage, MatrixKind, StorageType, logger
from .hdf5 import HDF5FeatureStorage
from .pandas_base import PandasBaseFeatureStorage
from .sqlite import SQLiteFeatureStorage, Upsert

View file

@ -12,9 +12,10 @@ from typing import Any, ClassVar
import numpy as np
import pandas as pd
import structlog
from pydantic import BaseModel, ConfigDict
from ..utils import logger, raise_error
from ..utils import raise_error
__all__ = ["BaseFeatureStorage", "MatrixKind", "StorageType"]
@ -28,6 +29,10 @@ class MatrixKind(str, Enum):
Full = "full"
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="storage", step="storage")
class StorageType(str, Enum):
"""Accepted storage type."""
@ -79,6 +84,10 @@ class BaseFeatureStorage(BaseModel, ABC):
"does not exist, creating now"
)
self.uri.parent.mkdir(parents=True, exist_ok=True)
logger.info(
f"Parameters: {self.model_dump(mode='json')}",
component=self.__class__.__name__,
)
def validate_input(self, input_: list[str]) -> None:
"""Validate the input to the pipeline step.

View file

@ -22,8 +22,8 @@ from ..external.h5io.h5io import (
read_hdf5,
write_hdf5,
)
from ..utils import logger, raise_error
from .base import BaseFeatureStorage, MatrixKind, StorageType
from ..utils import raise_error
from .base import BaseFeatureStorage, MatrixKind, StorageType, logger
from .utils import (
element_to_prefix,
matrix_to_vector,

View file

@ -16,8 +16,8 @@ from sqlalchemy import create_engine, inspect
from tqdm import tqdm
from ..api.decorators import register_storage
from ..utils import logger, raise_error, warn_with_log
from .base import MatrixKind
from ..utils import raise_error, warn_with_log
from .base import MatrixKind, logger
from .pandas_base import PandasBaseFeatureStorage
from .utils import (
element_to_prefix,

View file

@ -12,8 +12,8 @@ from importlib.metadata import PackageNotFoundError, version
import numpy as np
from pydantic import validate_call
from ..utils import logger, raise_error
from .base import MatrixKind
from ..utils import raise_error
from .base import MatrixKind, logger
__all__ = [

View file

@ -111,7 +111,8 @@ structlog.configure(
cache_logger_on_first_use=True,
)
logger = logging.getLogger("junifer")
_log = structlog.get_logger("junifer")
logger = _log.bind(pkg="utils")
# Remove datalad logger handlers to avoid duplicate logging
_datalad_lgr_hdlrs = datalad.log.lgr.handlers