Guide for Beginner

Guide for Beginner#

Pipeline Parameters#

In the nextflow.config file, you can configure various pipeline parameters to customize your processing workflow:

nextflow.config

params {
dataset_dir = "/input" // Input data directory
output_dir = "/output" // Output logs directory
preproc_dir = "${params.output_dir}/preprocessed" // Output results directory
code_dir = "/program/megprep" // All code for preprocessing
do_fs = true // Enable FreeSurfer method
do_only_anatomy = false // if true, only anatomy preprocessing.
is_bids = true // Whether the data is in BIDS format
meg_visualize = true // for coregistration and source_recon

// MRI Parameters
anatomy_preprocess_method = "freesurfer" // "freesurfer" or "deepprep"
anatomy_select_tag = "" //"_run-02_T1w" // defalut:"", <subject_id>+<anatomy_tag> to select multiple runs T1.

// MRI Import datasets
mri_import_config = """
    # Filter out specific anatomy, only bids support.
    subject_id: '001' # str or null
    session_id: null # str or null
    task: null
    run_id: null
"""

//freesurfer method
t1_dir = "/input"               // T1 image directory
t1_input_type = "nifti"         // 'dicom' or 'nifti'

//deepprep method
deepprep_device = "cpu"
t1_bids_dir = "/input"
fs_license = "/data/liaopan/megprep/megprep/tools/DeepPrep/license.txt"

//[fixed params]
fs_subjects_dir = "/smri" // FREESURFER SUBJECTS_DIR in Container[fixed]
freesurfer_home = "/opt/freesurfer/7.4.1-1"


// MEG import datasets parameters
dataset_format = 'auto'           // Dataset format: 'auto', 'bids', or 'raw'
file_suffix = '.fif'              // File suffix for raw datasets
meg_import_config = """
    # Filter out specific megs, only bids support.
    subject_id: null # str or null
    session_id: null # str or null
    task: null
    run_id: null
    #subject_id:
    #    - '001'
    #session_id:
    #    - '006'
    #task:
    #    - compr
"""

// BEM model parameters
bem_config = """
    ico: 4
    conductivity:
        - 0.3
"""
// MEG Preprocessing Parameters
osl_random_seed = 2025
preproc_config = """
    preproc:
    #- set_channel_types:  {EEG061: eog, EEG062: eog, EEG063: ecg}
    - filter: {l_freq: 0.5, h_freq: 40, method: iir, iir_params: {order: 5, ftype: butter}}
    - notch_filter: {freqs: 50 100}
    - resample: {sfreq: 100}
    #- bad_segments: {segment_len: 500, picks: mag, significance_level: 0.1}
    #- bad_segments: {segment_len: 500, picks: mag, mode: diff, significance_level: 0.1}
"""


// MEG Artifacts Detection Parameters
artifact_config = """
    find_bad_channels:
        pyprep:
            deviation:
                deviation_threshold: 5.0
            snr: {}
            nan_flat: {}
            # hfnoise:
            #     HF_zscore_threshold: 5.0
          # ransac: # very slow
            #     n_samples: 50
            #     sample_prop: 0.25
            #     corr_thresh: 0.75
            #     frac_bad: 0.4
            #     corr_window_secs: 5.0
            #     channel_wise: true
            #     max_chunk_size: null
            # correlation:
            #     correlation_secs: 1.0
            #     correlation_threshold: 0.4
            #     frac_bad: 0.01
        psd:
            std_multiplier: 6
        osl:
            ref_meg: auto
            significance_level: 0.05
        mne:
            find_bad_channels_lof:
                n_neighbors: 20
                picks: mag
                metric: euclidean
                threshold: 1.5

    find_bad_segments:
        osl:
            segment_len: 1000 # detect_badsegments
        mne:
            annotate_muscle_zscore:
                ch_type: mag
                threshold: 12
            #annotate_amplitude:
            #    picks: meg
            # annotate_break:
            #     min_break_duration: 15.0
            #     t_start_after_previous: 5.0
            #     t_stop_before_next: 5.0
"""


// MEG ICA Parameters
num_IC = 60 // 0.99999
ICA_random_seed = 2025
ICA_output_dir = "ica_report" // relative path based on preproc dir

// MEG ICA Label Parameters
ic_label_config = """
    # detect artifact ICs
    ic_ecg: true
    ic_eog: true
    ic_outlier: true # detect artifact ICs by rules.

    find_bads_eog:
        ch_name: null # or the ch_name of EOG.
        threshold: auto
        l_freq: 1
        h_freq: 10
        start: null
        stop: null
        measure: zscore

    find_bads_ecg:
        ch_name: null # or the ch_name of ECG.
        threshold: auto
        method: ctps
        l_freq: 8
        h_freq: 16
        measure: zscore

    find_bads_muscle:
        threshold: 0.5
        start: null
        stop: null
        l_freq: 7
        h_freq: 45

    ICA_classify:
        meg_vendor: ctf # neuromag or ctf or quanmag_opm or quspin_opm
        explained_var:
            threshold: 0.1
            ch_type: mag
        find_ecg_ics:
            time_segment: 10 # seconds
            ts_ecg_num_max: 20 # Maximum number of heartbeats expected in the chosen time segment
            l_freq: 0.1
            h_freq: 10
            peak_threshod_coef: 0.4 #Indicates the threshold of the number of ecg signal peak interval (unit: index). (peak_threshod = 0.4 * fs) | # for 1 seconds
            peak_std_threshold_coef: 0.05 #Standard deviation threshold of ecg signal peak interval (unit: index). (peak_std_threshold = peak_std_threshold_coef * fs) | # for 1 seconds
        find_abnormal_psd_ics:
            attention_low_freq: 0
            attention_high_freq: 150
            le_low_freq: 0
            le_high_freq: 12
            low_freq_energy_threshold: 0.8 # Threshold above which the component is flagged by low-frequency energy ratio
"""

// MEG Epochs Parameters
epoch_output_dir = "epochs" // relative path based on preproc dir
epoch_config = """
task_type: 'task'   # or 'resting'

resting:
    fixed_length_duration: 2.0

event_source: 'find_events'  # 'event_file' or 'find_events'

autoreject: false  # true or false| automatic global_rejection_threshold, get the `reject` params.

#event_file:specific the event type of *_events.tsv | filter | the value of `null` means to get all events.
event_file:
    trial_type: null
    #type: # you can change `trial_type` to `type` or other type related.
    #    word_onset_01: 1
    #    phoneme_onset_01: 2
    # trial_type:
    #    - word_onset_01
    #    - phoneme_onset_01

# find events
find_events:
    #stim_channel: UPPT001 # for CTF Holmes
    stim_channel: null
    shortest_event: 1
    min_duration: 0.0
epochs:
    event_id: null
    tmin: -0.2
    tmax: 1
    reject_by_annotation: true
    picks: meg
    baseline: null
    #reject:
        #grad: 4000e-13
        #mag: 4e-12
    preload: true
    detrend: null
"""


// MEG-MRI coregistraion Parameters
trans_output_dir = "trans"
core_config = """
omit_head_shape_points: 1 # mm
grow_hair: 0.0 #mm
icp:
    n_iterations: 200
    lpa_weight: 1.0
    nasion_weight: 10.0
    rpa_weight: 1.0
    hsp_weight: 10.0
    eeg_weight: 0.0
    hpi_weight: 1.0
finetune_icp:
    n_iterations: 200
    lpa_weight: 0.0
    nasion_weight: 0.0
    rpa_weight: 0.0
    hsp_weight: 10.0
    eeg_weight: 0.0
    hpi_weight: 0.0
"""

// Covariance Parameters
covar_output_dir = "covariance"
covar_visualize = true // Whether to generate covariance graphs
covar_type = "epochs" // raw or epochs
raw_covariance_task_id = "resting" // task name
covar_config = """
    ## 1.Estimate noise covariance matrix from a continuous segment of raw data.
    compute_raw_covariance:
        tmin: 0
        tmax: null
        method: auto
        reject:
            grad: 4000e-13  # T / m (gradiometers)
            mag: 4e-12  # T (magnetometers)
        reject_by_annotation: true
        rank: info

    ## 2.Estimate noise covariance matrix from epochs.
    # find events
    events:
        stim_channel: null
        #stim_channel: UPPT001 # for CTF Holmes
        shortest_event: 1
        min_duration: 0.0

    # For baseline epochs
    epochs:
        event_id: null # baseline event id
        tmin: -0.2 # Start time (in seconds) for covariance calculation window
        tmax: 0.0 # End time (in seconds) for covariance calculation window
        picks: meg
        baseline: null
        #reject:
            #grad: 4000e-13
            #mag: 4e-12
        preload: true
        detrend: null
        reject_by_annotation: true

    covariance:
        tmin: null  #Start time for baseline. If null start at first sample.
        tmax: null  # End time for baseline. If null end at last sample.
        rank: null  # Rank used for covariance calculation| meg: 90
"""


// Forward Solution Parameters
fwd_output_dir = "forward_solution"
fwd_epoch_label = "wdonset"
fwd_config = """
    surface: white # pial
    spacing: ico4
"""

// Source Imaging Parameters
src_output_dir = "source_recon"
src_type = "epochs" // raw or epochs
src_config = """
    source_methods:
        - dSPM

    data_type: meg  # mag
    spacing: ico4
    epoch_label: wdonset

    dSPM:
        inverse_operator:
            loose: auto
            depth: 0.8
            fixed: auto
            rank: info
                #meg : 50
        apply_inverse:
            lambda2: 0.1111111111
            method: dSPM
            pick_ori: normal

    LCMV:
        n_rank: 50  # compute_covariance,meg's n_rank
        cov_tmin: 0.01
        cov_tmax: 0.4
        make_lcmv:
            reg: 0.05
            pick_ori: null
            rank:
                meg : 50
            weight_norm: unit-noise-gain-invariant

“””

Run MEGPrep#

docker run -it --rm \
    -v /data/datasets/SMN4Lang:/input \
    -v /data/datasets/SMN4Lang/preprocessed:/output \
    -v /data/datasets/SMN4Lang/smri:/smri \
    -v /data/megprep/license.txt:/fs_license.txt \
    -v /data/megprep/nextflow/nextflow.config:/program/nextflow/nextflow.config \
    megprep:0.0.3 \
    -i /input \
    -o /output \
    --fs_license_file /license.txt \
    --fs_subjects_dir /smri \
    --resume