Skip to content

HTFAResults Container Implementation #72

@jeremymanning

Description

@jeremymanning

Task 005: HTFAResults Container Implementation

Overview

Implement the HTFAResults container class that stores HTFA analysis results with comprehensive metadata tracking and NIfTI reconstruction capabilities. This class serves as the primary interface for accessing, manipulating, and exporting HTFA results.

Objectives

  • Create a comprehensive results storage container with rich metadata
  • Implement NIfTI reconstruction from factor loadings and weights
  • Provide clean API for accessing factors, weights, and metadata
  • Support BIDS derivatives export with proper metadata preservation
  • Enable seamless integration with visualization methods

Scope

In Scope

  • HTFAResults class with full metadata tracking
  • NIfTI reconstruction methods for factors and weights
  • BIDS derivatives export functionality
  • Results serialization/deserialization (pickle support)
  • Integration with TFA and HTFA algorithm outputs
  • Comprehensive docstring documentation

Out of Scope

  • Visualization methods (handled in Task 006)
  • Statistical analysis methods (future enhancement)
  • Interactive result exploration (future enhancement)
  • Custom file format support beyond NIfTI/BIDS

Technical Requirements

HTFAResults Class Design

class HTFAResults:
    """Container for HTFA analysis results with metadata and export capabilities."""
    
    def __init__(self, factors, weights, metadata, affine=None):
        # Core results storage
        # Metadata preservation
        # NIfTI reconstruction setup
        
    # Properties for easy access
    @property
    def n_factors(self) -> int
    @property  
    def n_timepoints(self) -> int
    @property
    def n_subjects(self) -> int
    
    # NIfTI reconstruction methods
    def factors_to_nifti(self) -> List[nib.Nifti1Image]
    def weights_to_nifti(self) -> List[nib.Nifti1Image]
    
    # Export functionality
    def save_derivatives(self, output_dir: Path, dataset_name: str)
    def to_pickle(self, filepath: Path)
    
    @classmethod
    def from_pickle(cls, filepath: Path) -> 'HTFAResults'

Core Data Structure

  • Spatial Factors: Stored as (n_voxels, n_factors) arrays
  • Temporal Weights: (n_subjects, n_timepoints, n_factors) arrays
  • Metadata Dictionary: Algorithm parameters, preprocessing info, timing
  • NIfTI Affine: Spatial transformation for reconstruction
  • BIDS Metadata: Preserved from input for derivatives export

NIfTI Reconstruction

  • Transform factor loadings back to 3D brain space using stored affine
  • Handle masked data with proper background value setting
  • Support both single-factor and multi-factor NIfTI export
  • Preserve original voxel spacing and orientation

BIDS Derivatives Export

  • Create BIDS-compliant derivatives directory structure
  • Generate dataset_description.json with HTFA metadata
  • Export factors as statistical maps with proper naming
  • Include comprehensive sidecar JSON files with analysis parameters

Implementation Details

Class Architecture

# Core attributes
self.factors: np.ndarray  # (n_voxels, n_factors)
self.weights: np.ndarray  # (n_subjects, n_timepoints, n_factors) 
self.metadata: Dict[str, Any]  # Algorithm params, timing, preprocessing
self.affine: np.ndarray  # NIfTI spatial transformation
self.mask: np.ndarray  # Brain mask for reconstruction

# Derived properties
self._factor_images: Optional[List[nib.Nifti1Image]] = None
self._weight_images: Optional[List[nib.Nifti1Image]] = None

NIfTI Reconstruction Logic

  1. Spatial Reconstruction: Map factor loadings from vectorized to 3D space
  2. Temporal Reconstruction: Create 4D images for temporal weights
  3. Background Handling: Set non-brain voxels to zero using stored mask
  4. Metadata Preservation: Transfer analysis parameters to NIfTI headers

Export Directory Structure

derivatives/htfa/
├── dataset_description.json
├── sub-{subject}/
│   └── func/
│       ├── sub-{subject}_task-{task}_space-{space}_desc-htfa_weights.nii.gz
│       └── sub-{subject}_task-{task}_space-{space}_desc-htfa_weights.json
└── group/
    ├── task-{task}_space-{space}_desc-htfa_factors.nii.gz
    └── task-{task}_space-{space}_desc-htfa_factors.json

Acceptance Criteria

Core Functionality

  • HTFAResults class instantiated with factors, weights, metadata
  • All properties (n_factors, n_subjects, etc.) return correct values
  • NIfTI reconstruction produces valid brain images in original space
  • BIDS derivatives export creates compliant directory structure
  • Pickle serialization preserves all data and metadata

Data Integrity

  • Factor loadings correctly mapped from vector to 3D brain space
  • Temporal weights maintain subject and time dimension ordering
  • NIfTI affine transformations preserve spatial accuracy
  • Metadata completeness validated against input parameters

BIDS Compliance

  • Derivatives directory follows BIDS specification
  • JSON sidecars contain all required analysis metadata
  • File naming follows BIDS entity conventions
  • dataset_description.json validates against BIDS schema

API Usability

  • Intuitive property access for common operations
  • Clear error messages for invalid operations
  • Comprehensive docstrings with usage examples
  • Type hints for all public methods

Testing Strategy

Unit Tests

  • Results container initialization with various input types
  • Property access and derived calculations
  • NIfTI reconstruction accuracy using synthetic data
  • BIDS export directory structure and metadata validation
  • Pickle serialization round-trip integrity

Integration Tests

  • End-to-end workflow from TFA/HTFA algorithms to results export
  • BIDS dataset processing with results reconstruction
  • Cross-validation with original data spatial accuracy
  • Multi-subject results handling and aggregation

Edge Case Testing

  • Empty or single-factor results handling
  • Missing metadata graceful degradation
  • Malformed affine transformation recovery
  • Large dataset memory efficiency validation

Dependencies

Required Components (from previous tasks)

  • Task 001: TFA algorithm implementation (factor loadings format)
  • Task 002: HTFA algorithm implementation (multi-subject results format)

External Dependencies

  • nibabel: NIfTI image creation and manipulation
  • numpy: Array operations and spatial transformations
  • pandas: Metadata handling and JSON export
  • pathlib: File system operations for BIDS export

Internal Dependencies

  • htfa.utils: Utility functions for spatial transformations
  • htfa.core: Integration with TFA/HTFA algorithm outputs

Risks and Mitigation

Technical Risks

  • Memory Usage: Large datasets may strain memory during reconstruction
    • Mitigation: Implement lazy loading and chunk-based processing
  • Spatial Accuracy: NIfTI reconstruction might introduce spatial errors
    • Mitigation: Comprehensive testing with known spatial coordinates
  • BIDS Compliance: Complex specification may lead to validation errors
    • Mitigation: Use bids-validator for automated compliance checking

Integration Risks

  • Algorithm Interface: Results format may not match algorithm outputs
    • Mitigation: Close coordination with Tasks 001/002 for API alignment
  • Metadata Completeness: Missing parameters may break export functionality
    • Mitigation: Required metadata validation in constructor

Effort Estimate

Size: Medium (M) - 1-2 days

Breakdown

  • Core Class Implementation: 6 hours
  • NIfTI Reconstruction Methods: 8 hours
  • BIDS Export Functionality: 6 hours
  • Testing and Validation: 4 hours
  • Documentation and Examples: 2 hours

Total: 26 hours (1.6 days)

Definition of Done

  • HTFAResults class implemented with all specified methods
  • Unit tests achieve >95% coverage for results container
  • NIfTI reconstruction validated against synthetic ground truth
  • BIDS derivatives export passes bids-validator compliance
  • Integration tests successful with TFA/HTFA algorithm outputs
  • Documentation complete with usage examples and API reference
  • Code passes all linting and type checking requirements

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions