@brainpilot/skills 0.0.6 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/skills/01_Meta-Skills/academic-research-hub/SKILL.md +108 -0
- package/skills/01_Meta-Skills/academic-research-hub/scripts/requirements.txt +17 -0
- package/skills/01_Meta-Skills/academic-research-hub/scripts/research.py +781 -0
- package/skills/01_Meta-Skills/beautiful-log/SKILL.md +64 -0
- package/skills/01_Meta-Skills/beautiful-log/scripts/beautiful_log.py +274 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/SKILL.md +130 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/assets/config.template.yaml +54 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/assets/top5_digest_template.md +5 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/build_top5_digest.py +300 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/common.py +137 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/merge_results.py +106 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/run_pipeline.py +177 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/search_arxiv.py +162 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/search_pubmed.py +202 -0
- package/skills/01_Meta-Skills/ethoclaw-normalize-tabular/SKILL.md +173 -0
- package/skills/01_Meta-Skills/ethoclaw-normalize-tabular/scripts/normalize_data.py +874 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/SKILL.md +134 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/references/confirmation-prompts.md +31 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/references/output-patterns.md +45 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/build_markdown_deliverables.py +41 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/build_research_log.py +84 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/build_summary_md.py +63 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/extract_pdf_bundle.py +140 -0
- package/skills/01_Meta-Skills/experiment-controller/SKILL.md +140 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/SKILL.md +366 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/entity_resolution.py +120 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/extraction_prompt_template.txt +19 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/graph_query.py +106 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/hypothesis_cli_reference.py +42 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/new_data_source_template.py +116 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/requirements.txt +15 -0
- package/skills/01_Meta-Skills/method-design/SKILL.md +61 -0
- package/skills/01_Meta-Skills/multi-search-engine/SKILL.md +119 -0
- package/skills/01_Meta-Skills/research-idea/SKILL.md +65 -0
- package/skills/05_EEG_ERP/eeg-skill/SKILL.md +197 -0
- package/skills/05_EEG_ERP/meg-skill/SKILL.md +188 -0
- package/skills/05_EEG_ERP/meg-skill/scripts/time_frequency.py +223 -0
- package/skills/05_EEG_ERP/mne-eeg-tool/SKILL.md +165 -0
- package/skills/05_EEG_ERP/mne-eeg-tool/scripts/eeg_pipeline_reference.py +231 -0
- package/skills/05_EEG_ERP/seed-iv-skill/SKILL.md +184 -0
- package/skills/05_EEG_ERP/seed-iv-skill/scripts/classify_seed_iv.py +154 -0
- package/skills/05_EEG_ERP/seed-iv-skill/scripts/extract_seed_iv_features.py +190 -0
- package/skills/05_EEG_ERP/seed-iv-skill/scripts/validate_seed_iv.py +102 -0
- package/skills/05_EEG_ERP/seed-vig-skill/SKILL.md +182 -0
- package/skills/05_EEG_ERP/seed-vig-skill/scripts/classify_seed_vig.py +165 -0
- package/skills/05_EEG_ERP/seed-vig-skill/scripts/extract_seed_vig_features.py +185 -0
- package/skills/05_EEG_ERP/seed-vig-skill/scripts/validate_seed_vig.py +88 -0
- package/skills/06_fMRI_Neuroimaging/abcd-skill/SKILL.md +308 -0
- package/skills/06_fMRI_Neuroimaging/abcd-skill/scripts/abcd_qc_summary.py +449 -0
- package/skills/06_fMRI_Neuroimaging/abcd-skill/scripts/extract_abcd_phenotype.py +292 -0
- package/skills/06_fMRI_Neuroimaging/abcd-skill/scripts/reorganize_abcd.py +387 -0
- package/skills/06_fMRI_Neuroimaging/abide-skill/SKILL.md +302 -0
- package/skills/06_fMRI_Neuroimaging/abide-skill/scripts/abide_qc_summary.py +317 -0
- package/skills/06_fMRI_Neuroimaging/abide-skill/scripts/extract_abide_phenotype.py +267 -0
- package/skills/06_fMRI_Neuroimaging/abide-skill/scripts/reorganize_abide.py +387 -0
- package/skills/06_fMRI_Neuroimaging/adhd200-skill/SKILL.md +244 -0
- package/skills/06_fMRI_Neuroimaging/adhd200-skill/scripts/adhd200_qc_summary.py +98 -0
- package/skills/06_fMRI_Neuroimaging/adhd200-skill/scripts/extract_adhd200_phenotype.py +134 -0
- package/skills/06_fMRI_Neuroimaging/adhd200-skill/scripts/reorganize_adhd200.py +206 -0
- package/skills/06_fMRI_Neuroimaging/adni-skill/SKILL.md +358 -0
- package/skills/06_fMRI_Neuroimaging/adni-skill/scripts/generate_adni_task_files.py +1305 -0
- package/skills/06_fMRI_Neuroimaging/adni-skill/scripts/generate_vqa_from_tasks.py +766 -0
- package/skills/06_fMRI_Neuroimaging/adni-skill/scripts/reorganize_adni.py +491 -0
- package/skills/06_fMRI_Neuroimaging/aibl-skill/SKILL.md +295 -0
- package/skills/06_fMRI_Neuroimaging/aibl-skill/scripts/aibl_qc_summary.py +260 -0
- package/skills/06_fMRI_Neuroimaging/aibl-skill/scripts/extract_aibl_phenotype.py +365 -0
- package/skills/06_fMRI_Neuroimaging/aibl-skill/scripts/reorganize_aibl.py +394 -0
- package/skills/06_fMRI_Neuroimaging/aomic-skill/SKILL.md +292 -0
- package/skills/06_fMRI_Neuroimaging/aomic-skill/scripts/aomic_qc_summary.py +258 -0
- package/skills/06_fMRI_Neuroimaging/aomic-skill/scripts/extract_aomic_phenotype.py +284 -0
- package/skills/06_fMRI_Neuroimaging/aomic-skill/scripts/reorganize_aomic.py +322 -0
- package/skills/06_fMRI_Neuroimaging/asl-skill/SKILL.md +168 -0
- package/skills/06_fMRI_Neuroimaging/asl-skill/scripts/compute_cbf.py +224 -0
- package/skills/06_fMRI_Neuroimaging/bids-organizer/SKILL.md +241 -0
- package/skills/06_fMRI_Neuroimaging/bold5000-skill/SKILL.md +186 -0
- package/skills/06_fMRI_Neuroimaging/bold5000-skill/scripts/bold5000_qc_summary.py +96 -0
- package/skills/06_fMRI_Neuroimaging/bold5000-skill/scripts/extract_bold5000_stimulus.py +125 -0
- package/skills/06_fMRI_Neuroimaging/bold5000-skill/scripts/reorganize_bold5000.py +102 -0
- package/skills/06_fMRI_Neuroimaging/camcan-skill/SKILL.md +213 -0
- package/skills/06_fMRI_Neuroimaging/camcan-skill/scripts/camcan_qc_summary.py +131 -0
- package/skills/06_fMRI_Neuroimaging/camcan-skill/scripts/extract_camcan_phenotype.py +145 -0
- package/skills/06_fMRI_Neuroimaging/camcan-skill/scripts/validate_camcan.py +141 -0
- package/skills/06_fMRI_Neuroimaging/cobre-skill/SKILL.md +201 -0
- package/skills/06_fMRI_Neuroimaging/cobre-skill/scripts/cobre_qc_summary.py +95 -0
- package/skills/06_fMRI_Neuroimaging/cobre-skill/scripts/extract_cobre_phenotype.py +104 -0
- package/skills/06_fMRI_Neuroimaging/cobre-skill/scripts/reorganize_cobre.py +140 -0
- package/skills/06_fMRI_Neuroimaging/conn-tool/SKILL.md +180 -0
- package/skills/06_fMRI_Neuroimaging/dcm2nii/SKILL.md +189 -0
- package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/SKILL.md +183 -0
- package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/scripts/dmt_har_med_qc_summary.py +96 -0
- package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/scripts/extract_dmt_har_med_phenotype.py +121 -0
- package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/scripts/reorganize_dmt_har_med.py +125 -0
- package/skills/06_fMRI_Neuroimaging/dwi-skill/SKILL.md +359 -0
- package/skills/06_fMRI_Neuroimaging/fmri-skill/SKILL.md +371 -0
- package/skills/06_fMRI_Neuroimaging/fmriprep-tool/SKILL.md +228 -0
- package/skills/06_fMRI_Neuroimaging/freesurfer-tool/SKILL.md +286 -0
- package/skills/06_fMRI_Neuroimaging/freesurfer-tool/scripts/freesurfer_processor.py +145 -0
- package/skills/06_fMRI_Neuroimaging/fsl-tool/SKILL.md +208 -0
- package/skills/06_fMRI_Neuroimaging/hbn-skill/SKILL.md +271 -0
- package/skills/06_fMRI_Neuroimaging/hbn-skill/scripts/extract_hbn_phenotype.py +107 -0
- package/skills/06_fMRI_Neuroimaging/hbn-skill/scripts/hbn_qc_summary.py +96 -0
- package/skills/06_fMRI_Neuroimaging/hbn-skill/scripts/reorganize_hbn.py +150 -0
- package/skills/06_fMRI_Neuroimaging/hcpa-skill/SKILL.md +210 -0
- package/skills/06_fMRI_Neuroimaging/hcpa-skill/scripts/extract_hcpa_phenotype.py +146 -0
- package/skills/06_fMRI_Neuroimaging/hcpa-skill/scripts/hcpa_qc_summary.py +120 -0
- package/skills/06_fMRI_Neuroimaging/hcpa-skill/scripts/reorganize_hcpa.py +155 -0
- package/skills/06_fMRI_Neuroimaging/hcpd-skill/SKILL.md +210 -0
- package/skills/06_fMRI_Neuroimaging/hcpd-skill/scripts/extract_hcpd_phenotype.py +148 -0
- package/skills/06_fMRI_Neuroimaging/hcpd-skill/scripts/hcpd_qc_summary.py +125 -0
- package/skills/06_fMRI_Neuroimaging/hcpd-skill/scripts/reorganize_hcpd.py +146 -0
- package/skills/06_fMRI_Neuroimaging/hcpep-skill/SKILL.md +215 -0
- package/skills/06_fMRI_Neuroimaging/hcpep-skill/scripts/extract_hcpep_phenotype.py +157 -0
- package/skills/06_fMRI_Neuroimaging/hcpep-skill/scripts/hcpep_qc_summary.py +143 -0
- package/skills/06_fMRI_Neuroimaging/hcpep-skill/scripts/reorganize_hcpep.py +146 -0
- package/skills/06_fMRI_Neuroimaging/hcppipeline-tool/SKILL.md +217 -0
- package/skills/06_fMRI_Neuroimaging/hcpya-skill/SKILL.md +214 -0
- package/skills/06_fMRI_Neuroimaging/hcpya-skill/scripts/extract_hcpya_phenotype.py +190 -0
- package/skills/06_fMRI_Neuroimaging/hcpya-skill/scripts/hcpya_qc_summary.py +152 -0
- package/skills/06_fMRI_Neuroimaging/hcpya-skill/scripts/reorganize_hcpya.py +203 -0
- package/skills/06_fMRI_Neuroimaging/ixi-skill/SKILL.md +198 -0
- package/skills/06_fMRI_Neuroimaging/ixi-skill/scripts/ixi_qc_summary.py +137 -0
- package/skills/06_fMRI_Neuroimaging/ixi-skill/scripts/reorganize_ixi.py +190 -0
- package/skills/06_fMRI_Neuroimaging/mnd-skill/SKILL.md +191 -0
- package/skills/06_fMRI_Neuroimaging/mnd-skill/scripts/extract_mnd_phenotype.py +143 -0
- package/skills/06_fMRI_Neuroimaging/mnd-skill/scripts/mnd_qc_summary.py +120 -0
- package/skills/06_fMRI_Neuroimaging/mnd-skill/scripts/validate_mnd.py +107 -0
- package/skills/06_fMRI_Neuroimaging/mschallenge-skill/SKILL.md +203 -0
- package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/analyze_lesions.py +119 -0
- package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/longitudinal_lesion.py +148 -0
- package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/mschallenge_qc_summary.py +132 -0
- package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/validate_mschallenge.py +116 -0
- package/skills/06_fMRI_Neuroimaging/nibabel-skill/SKILL.md +184 -0
- package/skills/06_fMRI_Neuroimaging/nibabel-skill/scripts/atlas_coordinate_reference.py +61 -0
- package/skills/06_fMRI_Neuroimaging/nibabel-skill/scripts/freesurfer_io_reference.py +34 -0
- package/skills/06_fMRI_Neuroimaging/nibabel-skill/scripts/nifti_inspection_reference.py +35 -0
- package/skills/06_fMRI_Neuroimaging/nifd-skill/SKILL.md +205 -0
- package/skills/06_fMRI_Neuroimaging/nifd-skill/scripts/extract_nifd_phenotype.py +132 -0
- package/skills/06_fMRI_Neuroimaging/nifd-skill/scripts/nifd_qc_summary.py +111 -0
- package/skills/06_fMRI_Neuroimaging/nifd-skill/scripts/validate_nifd.py +111 -0
- package/skills/06_fMRI_Neuroimaging/nii2dcm/SKILL.md +143 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/SKILL.md +266 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/connectome_reference.py +65 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/denoise_timeseries_reference.py +58 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/hierarchical_parcellation_reference.py +53 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/kmeans_parcellation_reference.py +53 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/preprocess_bold_reference.py +76 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/rest_dictlearning_reference.py +56 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/rest_ica_reference.py +59 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/second_level_glm_reference.py +58 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/spacenet_classifier_reference.py +59 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/svm_classifier_reference.py +60 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/task_glm_reference.py +63 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/zalff_summary_reference.py +109 -0
- package/skills/06_fMRI_Neuroimaging/nsd-skill/SKILL.md +210 -0
- package/skills/06_fMRI_Neuroimaging/nsd-skill/scripts/extract_nsd_stimulus.py +171 -0
- package/skills/06_fMRI_Neuroimaging/nsd-skill/scripts/nsd_qc_summary.py +142 -0
- package/skills/06_fMRI_Neuroimaging/nsd-skill/scripts/validate_nsd.py +142 -0
- package/skills/06_fMRI_Neuroimaging/oasis-skill/SKILL.md +205 -0
- package/skills/06_fMRI_Neuroimaging/oasis-skill/scripts/extract_oasis_phenotype.py +126 -0
- package/skills/06_fMRI_Neuroimaging/oasis-skill/scripts/oasis_qc_summary.py +115 -0
- package/skills/06_fMRI_Neuroimaging/oasis-skill/scripts/validate_oasis.py +119 -0
- package/skills/06_fMRI_Neuroimaging/pet-skill/SKILL.md +173 -0
- package/skills/06_fMRI_Neuroimaging/pet-skill/scripts/compute_suvr.py +202 -0
- package/skills/06_fMRI_Neuroimaging/pnc-skill/SKILL.md +206 -0
- package/skills/06_fMRI_Neuroimaging/pnc-skill/scripts/extract_pnc_phenotype.py +136 -0
- package/skills/06_fMRI_Neuroimaging/pnc-skill/scripts/pnc_qc_summary.py +116 -0
- package/skills/06_fMRI_Neuroimaging/pnc-skill/scripts/validate_pnc.py +120 -0
- package/skills/06_fMRI_Neuroimaging/ppmi-skill/SKILL.md +209 -0
- package/skills/06_fMRI_Neuroimaging/ppmi-skill/scripts/extract_ppmi_phenotype.py +138 -0
- package/skills/06_fMRI_Neuroimaging/ppmi-skill/scripts/ppmi_qc_summary.py +111 -0
- package/skills/06_fMRI_Neuroimaging/ppmi-skill/scripts/validate_ppmi.py +117 -0
- package/skills/06_fMRI_Neuroimaging/qsiprep-tool/SKILL.md +320 -0
- package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/SKILL.md +215 -0
- package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/extract_rest_mdd_phenotype.py +132 -0
- package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/harmonize_sites.py +152 -0
- package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/rest_mdd_qc_summary.py +124 -0
- package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/validate_rest_mdd.py +103 -0
- package/skills/06_fMRI_Neuroimaging/smri-skill/SKILL.md +302 -0
- package/skills/06_fMRI_Neuroimaging/tcp-skill/SKILL.md +204 -0
- package/skills/06_fMRI_Neuroimaging/tcp-skill/scripts/extract_tcp_phenotype.py +139 -0
- package/skills/06_fMRI_Neuroimaging/tcp-skill/scripts/tcp_qc_summary.py +111 -0
- package/skills/06_fMRI_Neuroimaging/tcp-skill/scripts/validate_tcp.py +99 -0
- package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/SKILL.md +217 -0
- package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/scripts/extract_ucla_cnp_phenotype.py +145 -0
- package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/scripts/ucla_cnp_qc_summary.py +111 -0
- package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/scripts/validate_ucla_cnp.py +113 -0
- package/skills/06_fMRI_Neuroimaging/ukb-skill/SKILL.md +310 -0
- package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/build_ukb_survival.py +210 -0
- package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/extract_ukb_cases.py +308 -0
- package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/extract_ukb_phenotype.py +232 -0
- package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/ukb_qc_summary.py +158 -0
- package/skills/06_fMRI_Neuroimaging/wmh-segmentation/SKILL.md +133 -0
- package/skills/07_Computational_Modeling/detrending/SKILL.md +118 -0
- package/skills/07_Computational_Modeling/dictlearning/SKILL.md +122 -0
- package/skills/07_Computational_Modeling/filtering/SKILL.md +121 -0
- package/skills/07_Computational_Modeling/glm/SKILL.md +153 -0
- package/skills/07_Computational_Modeling/hierarchical/SKILL.md +121 -0
- package/skills/07_Computational_Modeling/ica/SKILL.md +122 -0
- package/skills/07_Computational_Modeling/kmeans/SKILL.md +119 -0
- package/skills/07_Computational_Modeling/run_models/SKILL.md +427 -0
- package/skills/07_Computational_Modeling/spacenet/SKILL.md +122 -0
- package/skills/07_Computational_Modeling/svm/SKILL.md +120 -0
- package/skills/08_Computational_Neuroscience/brain_gnn/SKILL.md +183 -0
- package/skills/08_Computational_Neuroscience/dipy-tool/SKILL.md +239 -0
- package/skills/08_Computational_Neuroscience/dipy-tool/scripts/dti_metrics_reference.py +70 -0
- package/skills/08_Computational_Neuroscience/dipy-tool/scripts/load_and_mask_reference.py +76 -0
- package/skills/08_Computational_Neuroscience/dipy-tool/scripts/roi_stats_reference.py +59 -0
- package/skills/08_Computational_Neuroscience/fm_app/SKILL.md +195 -0
- package/skills/08_Computational_Neuroscience/neurostorm/SKILL.md +151 -0
- package/skills/13_Visualization/brain-visualization/SKILL.md +191 -0
- package/skills/13_Visualization/brain-visualization/scripts/connectome_reference.py +108 -0
- package/skills/13_Visualization/brain-visualization/scripts/freesurfer_ply_reference.py +54 -0
- package/skills/13_Visualization/brain-visualization/scripts/zalff_summary_reference.py +116 -0
- package/skills/13_Visualization/ethoclaw-paper-figure-layout/SKILL.md +78 -0
- package/skills/13_Visualization/ethoclaw-paper-figure-layout/assets/naturecomm_figures.tex +74 -0
- package/skills/13_Visualization/ethoclaw-paper-figure-layout/scripts/layout_results_foldered.py +579 -0
- package/skills/14_Writing/overleaf-skill/SKILL.md +184 -0
- package/skills/14_Writing/overleaf-skill/scripts/install.sh +30 -0
- package/skills/14_Writing/paper-writing/SKILL.md +146 -0
- package/skills/14_Writing/paper-writing/scripts/data_statement_templates.py +164 -0
- package/skills/14_Writing/paper-writing/scripts/figure_templates.py +315 -0
- package/skills/14_Writing/paper-writing/scripts/nature_figure_style.py +214 -0
- package/skills/14_Writing/paper-writing/scripts/section_phrasebank.py +246 -0
- package/skills/16_Animal_Behavior/deeplabcut/SKILL.md +154 -0
- package/skills/16_Animal_Behavior/deeplabcut/references/3d-pose.md +89 -0
- package/skills/16_Animal_Behavior/deeplabcut/references/maDLC.md +123 -0
- package/skills/16_Animal_Behavior/deeplabcut/references/modelzoo.md +98 -0
- package/skills/16_Animal_Behavior/deeplabcut/references/standard-pipeline.md +165 -0
- package/skills/16_Animal_Behavior/deeplabcut/references/utilities.md +146 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/SKILL.md +274 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/report_template_en.html +112 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/report_template_en.md +21 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/cluster-section.md +5 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/heatmap-section.md +5 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/integrated-interpretation.md +3 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/overview.md +3 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/project-summary.md +3 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/radar-section.md +5 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/raw-trajectory.md +3 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/sample-check.md +3 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/single-subject-section.md +3 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/stats-section.md +5 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/epm.md +52 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/fst.md +37 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/nor.md +39 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/oft.md +43 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/tcst.md +45 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/tst.md +36 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/input-types.md +59 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/interpretation-guardrails.md +45 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/metadata-schema.md +57 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/report-sections.md +86 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/section-selection-rules.md +169 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/scripts/build_report_manifest.py +27 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/scripts/render_report.py +34 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/scripts/report_utils.py +1121 -0
- package/skills/16_Animal_Behavior/ethoclaw-animal-grounding/SKILL.md +390 -0
- package/skills/16_Animal_Behavior/ethoclaw-animal-grounding/reference_code.py +98 -0
- package/skills/16_Animal_Behavior/ethoclaw-animal-pose-estimation/SKILL.md +336 -0
- package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/README.md +21 -0
- package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/SKILL.md +41 -0
- package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/batch_kinematic_generator.py +663 -0
- package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/config.json +19 -0
- package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/generate_kinematic_parameter.py +401 -0
- package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/kinematic_generator.py +265 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/SKILL.md +72 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/references/config.example.toml +56 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/scripts/cluster_all_params.py +232 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/scripts/cluster_all_params_from_config.py +236 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-radar-generate/SKILL.md +68 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-radar-generate/references/notes.md +5 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-radar-generate/scripts/plot_h5_radar.py +513 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/SKILL.md +52 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/config.toml +81 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/references/stats-rule.md +18 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/scripts/h5_inspect.py +79 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/scripts/h5_violin_batch.py +624 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/scripts/h5_violin_stats.py +438 -0
- package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/SKILL.md +280 -0
- package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/core_scripts/heatmap_trajectory.py +790 -0
- package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/core_scripts/heatmap_velocity.py +855 -0
- package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/reference_data/reference_2d.csv +101 -0
- package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/reference_data/reference_2d.h5 +0 -0
- package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/reference_data/reference_data_readme.md +126 -0
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: meg-skill
|
|
3
|
+
description: "Use this skill whenever the user wants to process MEG (magnetoencephalography) data including source localization, time-frequency analysis, connectivity analysis, sensor-level preprocessing, or MEG-specific feature extraction. Triggers include: 'MEG', 'MEG processing', 'MEG source localization', 'MEG connectivity', 'magnetoencephalography', 'beamformer', 'time-frequency', 'MEG preprocessing', or any request involving MEG data files (.fif, .con, .ds)."
|
|
4
|
+
license: MIT License (NeuroClaw custom skill – freely modifiable within the project)
|
|
5
|
+
layer: subagent
|
|
6
|
+
skill_type: modality
|
|
7
|
+
dependencies:
|
|
8
|
+
- claw-shell
|
|
9
|
+
complementary_skills:
|
|
10
|
+
- eeg-skill
|
|
11
|
+
- smri-skill
|
|
12
|
+
- brain-visualization
|
|
13
|
+
---
|
|
14
|
+
# MEG Skill (Modality Layer)
|
|
15
|
+
|
|
16
|
+
## Overview
|
|
17
|
+
|
|
18
|
+
`meg-skill` is the NeuroClaw **modality-layer** interface skill responsible for all MEG (magnetoencephalography) data processing tasks.
|
|
19
|
+
|
|
20
|
+
It strictly follows the NeuroClaw hierarchical design principles:
|
|
21
|
+
- This skill **only describes WHAT needs to be done** and **which tool skill to delegate to**.
|
|
22
|
+
- It contains **no implementation code or concrete commands**.
|
|
23
|
+
- All concrete execution is delegated to MNE-Python (via `claw-shell`) and companion scripts.
|
|
24
|
+
- Companion scripts in `scripts/` provide reference implementations for time-frequency analysis and source localization.
|
|
25
|
+
|
|
26
|
+
**Core workflow (never bypassed):**
|
|
27
|
+
1. Identify input MEG data format (.fif Elekta/Neuromag, .ds CTF, .con KIT/Yokogawa).
|
|
28
|
+
2. Ensure T1w structural MRI is available for source localization (via `smri-skill` if not yet processed).
|
|
29
|
+
3. Generate a **numbered execution plan** clearly stating WHAT needs to be done.
|
|
30
|
+
4. Present the full plan, estimated runtime, resource requirements, and risks to the user and wait for explicit confirmation ("YES" / "execute" / "proceed").
|
|
31
|
+
5. On confirmation, delegate every step via `claw-shell`.
|
|
32
|
+
6. After execution, save all outputs in a clean directory structure (`meg_output/`).
|
|
33
|
+
|
|
34
|
+
**Research use only.**
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Quick Reference (Common MEG Tasks)
|
|
39
|
+
|
|
40
|
+
| Task | What needs to be done | Implementation via | Expected output |
|
|
41
|
+
|---|---|---|---|
|
|
42
|
+
| Load & validation | Read raw MEG, check channel types, info metadata | MNE-Python (`mne.io`) | Raw object + validation report |
|
|
43
|
+
| Maxwell filtering | Signal-space separation (SSS) for Elekta systems | MNE-Python (`mne.preprocessing.maxwell_filter`) | Cleaned raw MEG |
|
|
44
|
+
| Filtering | Band-pass, notch (line noise removal at 50/60 Hz) | MNE-Python (`raw.filter`, `raw.notch_filter`) | Filtered raw data |
|
|
45
|
+
| Epoching | Segment continuous data around events | MNE-Python (`mne.Epochs`) | Epoched data |
|
|
46
|
+
| ICA artifact removal | Remove cardiac, ocular, environmental artifacts | MNE-Python (`mne.preprocessing.ICA`) | Cleaned epochs |
|
|
47
|
+
| Time-frequency analysis | Morlet wavelet multitaper, Hilbert transform | `scripts/time_frequency.py` | TFR maps (power, ITC) |
|
|
48
|
+
| Source localization | Forward/inverse modeling (MNE, dSPM, beamformer) | MNE-Python + FreeSurfer | Source estimates in brain space |
|
|
49
|
+
| Source-space connectivity | Coherence, PLV, dPLI between source parcels | MNE-Python (`mne_connectivity`) | Connectivity matrices |
|
|
50
|
+
| Sensor-level connectivity | Coherence, PLV between sensor pairs | MNE-Python | Sensor connectivity |
|
|
51
|
+
| Evoked responses | Average epochs, compute ERPs/ERFs | MNE-Python (`epochs.average`) | Evoked NIfTI/fif files |
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Supported MEG File Formats
|
|
56
|
+
|
|
57
|
+
| Format | System | Extension | Reader |
|
|
58
|
+
|---|---|---|---|
|
|
59
|
+
| Elekta/Neuromag | VectorView, TRIUX | `.fif` | `mne.io.read_raw_fif` |
|
|
60
|
+
| CTF | CTF MEG systems | `.ds` | `mne.io.read_raw_ctf` |
|
|
61
|
+
| KIT/Yokogawa | KIT, Ricoh | `.con`, `.mrk` | `mne.io.read_raw_kit` |
|
|
62
|
+
| BIDS MEG | Any (BIDS format) | `.meg.fif` | `mne.io.read_raw_fif` |
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Core Processing Pipeline
|
|
67
|
+
|
|
68
|
+
### Stage 1: Data Loading & Validation
|
|
69
|
+
- Load raw MEG data and validate channel types (magnetometers, gradiometers, EEG, EOG, ECG, STIM)
|
|
70
|
+
- Check sampling rate, duration, and channel count
|
|
71
|
+
- Report bad channels if annotated
|
|
72
|
+
|
|
73
|
+
### Stage 2: Preprocessing
|
|
74
|
+
- **Maxwell filtering** (SSS/tSSS): for Elekta systems, remove environmental noise
|
|
75
|
+
- **Band-pass filtering**: typically 1–100 Hz for sensor-level analysis
|
|
76
|
+
- **Notch filter**: remove power line noise (50 Hz or 60 Hz)
|
|
77
|
+
- **Downsampling**: optional, to reduce computation (e.g., 1000 Hz → 250 Hz)
|
|
78
|
+
|
|
79
|
+
### Stage 3: Artifact Removal (ICA)
|
|
80
|
+
- Run ICA (FastICA, Infomax, or Picard)
|
|
81
|
+
- Auto-detect and remove cardiac (ECG), ocular (EOG), and muscle artifacts
|
|
82
|
+
- Correlate ICA components with ECG/EOG channels
|
|
83
|
+
|
|
84
|
+
### Stage 4: Epoching & Averaging
|
|
85
|
+
- Segment around events of interest
|
|
86
|
+
- Baseline correction
|
|
87
|
+
- Reject bad epochs (amplitude threshold, autoreject)
|
|
88
|
+
- Compute evoked responses (ERFs)
|
|
89
|
+
|
|
90
|
+
### Stage 5: Time-Frequency Analysis (via `scripts/time_frequency.py`)
|
|
91
|
+
- Morlet wavelet or multitaper spectral analysis
|
|
92
|
+
- Compute power spectral density per frequency band (δ/θ/α/β/γ)
|
|
93
|
+
- Inter-trial coherence (ITC)
|
|
94
|
+
|
|
95
|
+
### Stage 6 (Optional): Source Localization
|
|
96
|
+
- Requires T1w MRI from `smri-skill` and FreeSurfer cortical reconstruction
|
|
97
|
+
- Compute forward model (BEM or sphere)
|
|
98
|
+
- Apply inverse solution (MNE, dSPM, sLORETA, or LCMV beamformer)
|
|
99
|
+
- Output source estimates on cortical surface
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## Scripts
|
|
104
|
+
|
|
105
|
+
### `scripts/time_frequency.py`
|
|
106
|
+
Computes time-frequency representations from MEG epochs.
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
python skills/meg-skill/scripts/time_frequency.py \
|
|
110
|
+
--epochs /path/to/epochs.fif \
|
|
111
|
+
--output /path/to/meg_output/tfr/ \
|
|
112
|
+
--freq-min 1 --freq-max 100 --freq-steps 40 \
|
|
113
|
+
--method morlet \
|
|
114
|
+
--baseline -0.2 0.0
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## Standard Output Layout
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
meg_output/
|
|
123
|
+
├── preprocessed/ # Filtered, cleaned raw MEG
|
|
124
|
+
├── epochs/ # Epoched data (.fif)
|
|
125
|
+
├── evoked/ # Averaged evoked responses (.fif, .nii.gz)
|
|
126
|
+
├── tfr/ # Time-frequency results
|
|
127
|
+
│ ├── power_*.nii.gz
|
|
128
|
+
│ └── itc_*.nii.gz
|
|
129
|
+
├── source/ # Source estimates (if source localization run)
|
|
130
|
+
│ ├── stc_*.lh.stc
|
|
131
|
+
│ └── stc_*.rh.stc
|
|
132
|
+
├── connectivity/ # Connectivity matrices (if requested)
|
|
133
|
+
├── qc/ # Quality control reports
|
|
134
|
+
└── logs/
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## Installation (Handled by dependency-planner)
|
|
140
|
+
|
|
141
|
+
No manual installation required at this layer.
|
|
142
|
+
When first used, `meg-skill` automatically calls `dependency-planner` to install MNE-Python and dependencies via conda.
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## Important Notes & Limitations
|
|
147
|
+
|
|
148
|
+
- MEG data is large (hundreds of MB to GB per recording); ensure sufficient disk space.
|
|
149
|
+
- Maxwell filtering (SSS) is specific to Elekta/Neuromag systems; CTF and KIT systems use different approaches.
|
|
150
|
+
- Source localization requires co-registered T1w MRI and MEG sensor positions (head position indicator coils or digitized head shape).
|
|
151
|
+
- MNE-Python is the primary backend; all MEG processing is built on MNE.
|
|
152
|
+
- MEG has millisecond temporal resolution but lower spatial resolution than fMRI.
|
|
153
|
+
- BIDS-MEG format follows the BIDS extension for MEG: https://bids-specification.readthedocs.io/en/stable/04-modality-specific-files/02-magnetoencephalography.html
|
|
154
|
+
- This skill is for research workflows; not for clinical decision-making.
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## When to Call This Skill
|
|
159
|
+
|
|
160
|
+
- When the user provides MEG data (.fif, .ds, .con) and requests preprocessing, artifact removal, or analysis.
|
|
161
|
+
- When time-frequency analysis or source localization is needed for MEG data.
|
|
162
|
+
- When MEG connectivity analysis (sensor-level or source-level) is requested.
|
|
163
|
+
- When `eeg-skill` handles EEG but the data also includes MEG channels.
|
|
164
|
+
- When dataset skills (e.g., `Cam-CAN`) delegate MEG processing.
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## Complementary / Related Skills
|
|
169
|
+
|
|
170
|
+
- `eeg-skill` → EEG processing (MEG and EEG share many MNE-Python tools)
|
|
171
|
+
- `smri-skill` → T1w structural preprocessing (required for source localization)
|
|
172
|
+
- `freesurfer-tool` → cortical reconstruction for source-space analysis
|
|
173
|
+
- `nibabel-skill` → NIfTI I/O for surface/volume data
|
|
174
|
+
- `brain-visualization` → MEG source overlay visualization
|
|
175
|
+
- `nilearn-tool` → post-hoc statistical analysis on source estimates
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## Reference
|
|
180
|
+
- MNE-Python: https://mne.tools/
|
|
181
|
+
- Gramfort et al. (2013): MEG and EEG data analysis with MNE-Python
|
|
182
|
+
- Taulu & Simola (2006): Spatiotemporal signal space separation (SSS)
|
|
183
|
+
- BIDS MEG: https://bids-specification.readthedocs.io/en/stable/04-modality-specific-files/02-magnetoencephalography.html
|
|
184
|
+
- Cam-CAN dataset: https://www.cam-can.org/
|
|
185
|
+
|
|
186
|
+
Created At: 2026-05-06 12:19 HKT
|
|
187
|
+
Last Updated At: 2026-05-06 12:19 HKT
|
|
188
|
+
Author: chengwang96
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Compute time-frequency representations from MEG/EEG epochs.
|
|
3
|
+
|
|
4
|
+
Uses MNE-Python for Morlet wavelet or multitaper spectral analysis.
|
|
5
|
+
Outputs power and inter-trial coherence (ITC) maps.
|
|
6
|
+
"""
|
|
7
|
+
import argparse
|
|
8
|
+
import sys
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
try:
|
|
12
|
+
import numpy as np
|
|
13
|
+
except ImportError:
|
|
14
|
+
print("Error: numpy is required.", file=sys.stderr)
|
|
15
|
+
sys.exit(1)
|
|
16
|
+
|
|
17
|
+
try:
|
|
18
|
+
import mne
|
|
19
|
+
except ImportError:
|
|
20
|
+
print("Error: mne is required. Install with: pip install mne", file=sys.stderr)
|
|
21
|
+
sys.exit(1)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def compute_tfr_morlet(
|
|
25
|
+
epochs: mne.Epochs,
|
|
26
|
+
freqs: np.ndarray,
|
|
27
|
+
n_cycles: float,
|
|
28
|
+
baseline: tuple = None,
|
|
29
|
+
return_itc: bool = True,
|
|
30
|
+
) -> tuple:
|
|
31
|
+
"""Compute time-frequency representation using Morlet wavelets.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
epochs: MNE Epochs object.
|
|
35
|
+
freqs: Array of frequencies of interest.
|
|
36
|
+
n_cycles: Number of cycles in the Morlet wavelet.
|
|
37
|
+
baseline: Tuple (tmin, tmax) for baseline correction.
|
|
38
|
+
return_itc: Whether to compute inter-trial coherence.
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
power: Average TFR power (EvokedArray).
|
|
42
|
+
itc: Inter-trial coherence (EvokedArray) or None.
|
|
43
|
+
"""
|
|
44
|
+
# Compute TFR for each epoch
|
|
45
|
+
tfr = epochs.compute_tfr(
|
|
46
|
+
method="morlet",
|
|
47
|
+
freqs=freqs,
|
|
48
|
+
n_cycles=n_cycles,
|
|
49
|
+
return_itc=False,
|
|
50
|
+
average=False,
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
# Average power across epochs
|
|
54
|
+
power = tfr.copy().average()
|
|
55
|
+
|
|
56
|
+
# Apply baseline correction
|
|
57
|
+
if baseline is not None:
|
|
58
|
+
power.apply_baseline(baseline=baseline)
|
|
59
|
+
|
|
60
|
+
itc = None
|
|
61
|
+
if return_itc:
|
|
62
|
+
# ITC = |mean(exp(j * phase))| across epochs
|
|
63
|
+
data = tfr.data # (n_epochs, n_channels, n_freqs, n_times)
|
|
64
|
+
itc_data = np.abs(np.mean(np.exp(1j * np.angle(data)), axis=0))
|
|
65
|
+
itc = power.copy()
|
|
66
|
+
itc.data = itc_data
|
|
67
|
+
|
|
68
|
+
return power, itc
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def compute_tfr_multitaper(
|
|
72
|
+
epochs: mne.Epochs,
|
|
73
|
+
freqs: np.ndarray,
|
|
74
|
+
bandwidth: float,
|
|
75
|
+
baseline: tuple = None,
|
|
76
|
+
) -> "mne.time_frequency.AverageTFR":
|
|
77
|
+
"""Compute time-frequency representation using multitaper method.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
epochs: MNE Epochs object.
|
|
81
|
+
freqs: Array of frequencies of interest.
|
|
82
|
+
bandwidth: Frequency bandwidth of the multitaper windows.
|
|
83
|
+
baseline: Tuple (tmin, tmax) for baseline correction.
|
|
84
|
+
|
|
85
|
+
Returns:
|
|
86
|
+
power: Average TFR power.
|
|
87
|
+
"""
|
|
88
|
+
tfr = epochs.compute_tfr(
|
|
89
|
+
method="multitaper",
|
|
90
|
+
freqs=freqs,
|
|
91
|
+
bandwidth=bandwidth,
|
|
92
|
+
return_itc=False,
|
|
93
|
+
average=False,
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
power = tfr.copy().average()
|
|
97
|
+
|
|
98
|
+
if baseline is not None:
|
|
99
|
+
power.apply_baseline(baseline=baseline)
|
|
100
|
+
|
|
101
|
+
return power
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def main() -> int:
|
|
105
|
+
parser = argparse.ArgumentParser(
|
|
106
|
+
description="Compute time-frequency representations from MEG/EEG epochs."
|
|
107
|
+
)
|
|
108
|
+
parser.add_argument("--epochs", required=True, help="Path to epochs .fif file")
|
|
109
|
+
parser.add_argument("--output", required=True, help="Output directory for TFR results")
|
|
110
|
+
parser.add_argument("--method", default="morlet", choices=["morlet", "multitaper"],
|
|
111
|
+
help="TFR method (default: morlet)")
|
|
112
|
+
parser.add_argument("--freq-min", type=float, default=1.0, help="Minimum frequency in Hz (default: 1)")
|
|
113
|
+
parser.add_argument("--freq-max", type=float, default=100.0, help="Maximum frequency in Hz (default: 100)")
|
|
114
|
+
parser.add_argument("--freq-steps", type=int, default=40, help="Number of frequency steps (default: 40)")
|
|
115
|
+
parser.add_argument("--n-cycles", type=float, default=7.0, help="Number of Morlet wavelet cycles (default: 7)")
|
|
116
|
+
parser.add_argument("--bandwidth", type=float, default=4.0, help="Multitaper bandwidth in Hz (default: 4)")
|
|
117
|
+
parser.add_argument("--baseline", nargs=2, type=float, metavar=("TMIN", "TMAX"),
|
|
118
|
+
help="Baseline correction window in seconds (e.g., -0.2 0.0)")
|
|
119
|
+
parser.add_argument("--channels", help="Comma-separated channel names to include (default: all MEG channels)")
|
|
120
|
+
parser.add_argument("--picks", default="meg", help="Channel types to include: meg, eeg, mag, grad (default: meg)")
|
|
121
|
+
parser.add_argument("--no-itc", action="store_true", help="Skip ITC computation")
|
|
122
|
+
parser.add_argument("--format", default="nifti", choices=["nifti", "numpy", "fif"],
|
|
123
|
+
help="Output format (default: nifti)")
|
|
124
|
+
args = parser.parse_args()
|
|
125
|
+
|
|
126
|
+
epochs_path = Path(args.epochs).resolve()
|
|
127
|
+
if not epochs_path.exists():
|
|
128
|
+
print(f"Epochs file not found: {epochs_path}", file=sys.stderr)
|
|
129
|
+
return 1
|
|
130
|
+
|
|
131
|
+
# Load epochs
|
|
132
|
+
print(f"Loading epochs: {epochs_path}")
|
|
133
|
+
epochs = mne.read_epochs(str(epochs_path), preload=True)
|
|
134
|
+
print(f" {len(epochs)} epochs, {len(epochs.ch_names)} channels, {epochs.info['sfreq']} Hz")
|
|
135
|
+
|
|
136
|
+
# Select channels
|
|
137
|
+
if args.channels:
|
|
138
|
+
ch_names = [c.strip() for c in args.channels.split(",")]
|
|
139
|
+
epochs.pick(ch_names)
|
|
140
|
+
print(f" Selected channels: {ch_names}")
|
|
141
|
+
else:
|
|
142
|
+
epochs.pick(args.picks)
|
|
143
|
+
|
|
144
|
+
# Build frequency array
|
|
145
|
+
freqs = np.linspace(args.freq_min, args.freq_max, args.freq_steps)
|
|
146
|
+
print(f" Frequencies: {freqs[0]:.1f} - {freqs[-1]:.1f} Hz ({len(freqs)} steps)")
|
|
147
|
+
|
|
148
|
+
# Parse baseline
|
|
149
|
+
baseline = None
|
|
150
|
+
if args.baseline:
|
|
151
|
+
baseline = (args.baseline[0], args.baseline[1])
|
|
152
|
+
print(f" Baseline: [{baseline[0]}, {baseline[1]}] s")
|
|
153
|
+
|
|
154
|
+
# Compute TFR
|
|
155
|
+
output_dir = Path(args.output).resolve()
|
|
156
|
+
output_dir.mkdir(parents=True, exist_ok=True)
|
|
157
|
+
|
|
158
|
+
print(f"\nComputing TFR ({args.method})...")
|
|
159
|
+
if args.method == "morlet":
|
|
160
|
+
power, itc = compute_tfr_morlet(
|
|
161
|
+
epochs, freqs, n_cycles=args.n_cycles, baseline=baseline, return_itc=not args.no_itc,
|
|
162
|
+
)
|
|
163
|
+
else:
|
|
164
|
+
power = compute_tfr_multitaper(
|
|
165
|
+
epochs, freqs, bandwidth=args.bandwidth, baseline=baseline,
|
|
166
|
+
)
|
|
167
|
+
itc = None
|
|
168
|
+
|
|
169
|
+
# Save results
|
|
170
|
+
power_path = output_dir / "tfr_power"
|
|
171
|
+
if args.format == "fif":
|
|
172
|
+
power.save(str(power_path.with_suffix(".fif")), overwrite=True)
|
|
173
|
+
print(f" Power saved: {power_path.with_suffix('.fif')}")
|
|
174
|
+
elif args.format == "numpy":
|
|
175
|
+
np.save(str(power_path.with_suffix(".npy")), power.data)
|
|
176
|
+
print(f" Power saved: {power_path.with_suffix('.npy')} (shape: {power.data.shape})")
|
|
177
|
+
else:
|
|
178
|
+
# Save as NIfTI (convert 4D data: channels x freqs x times)
|
|
179
|
+
try:
|
|
180
|
+
import nibabel as nib
|
|
181
|
+
data = power.data # (n_channels, n_freqs, n_times)
|
|
182
|
+
# Create a 4D NIfTI with singleton spatial dimensions
|
|
183
|
+
nii_data = data.reshape(1, 1, data.shape[0], data.shape[1] * data.shape[2]) if data.ndim == 3 else data
|
|
184
|
+
affine = np.eye(4)
|
|
185
|
+
img = nib.Nifti1Image(nii_data, affine)
|
|
186
|
+
nii_path = power_path.with_suffix(".nii.gz")
|
|
187
|
+
nib.save(img, str(nii_path))
|
|
188
|
+
print(f" Power saved: {nii_path} (shape: {data.shape})")
|
|
189
|
+
except ImportError:
|
|
190
|
+
# Fallback to numpy
|
|
191
|
+
np.save(str(power_path.with_suffix(".npy")), power.data)
|
|
192
|
+
print(f" Power saved (numpy fallback): {power_path.with_suffix('.npy')}")
|
|
193
|
+
|
|
194
|
+
if itc is not None:
|
|
195
|
+
itc_path = output_dir / "tfr_itc"
|
|
196
|
+
if args.format == "fif":
|
|
197
|
+
itc.save(str(itc_path.with_suffix(".fif")), overwrite=True)
|
|
198
|
+
elif args.format == "numpy":
|
|
199
|
+
np.save(str(itc_path.with_suffix(".npy")), itc.data)
|
|
200
|
+
else:
|
|
201
|
+
try:
|
|
202
|
+
import nibabel as nib
|
|
203
|
+
data = itc.data
|
|
204
|
+
nii_data = data.reshape(1, 1, data.shape[0], data.shape[1] * data.shape[2]) if data.ndim == 3 else data
|
|
205
|
+
img = nib.Nifti1Image(nii_data, np.eye(4))
|
|
206
|
+
nib.save(img, str(itc_path.with_suffix(".nii.gz")))
|
|
207
|
+
except ImportError:
|
|
208
|
+
np.save(str(itc_path.with_suffix(".npy")), itc.data)
|
|
209
|
+
print(f" ITC saved: {itc_path}")
|
|
210
|
+
|
|
211
|
+
# Print summary
|
|
212
|
+
print(f"\nTFR Summary:")
|
|
213
|
+
print(f" Method: {args.method}")
|
|
214
|
+
print(f" Frequency range: {freqs[0]:.1f} - {freqs[-1]:.1f} Hz")
|
|
215
|
+
print(f" Time range: {power.times[0]:.3f} - {power.times[-1]:.3f} s")
|
|
216
|
+
print(f" Channels: {power.data.shape[0]}")
|
|
217
|
+
print(f" Power range: [{power.data.min():.2e}, {power.data.max():.2e}]")
|
|
218
|
+
|
|
219
|
+
return 0
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
if __name__ == "__main__":
|
|
223
|
+
sys.exit(main())
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mne-eeg-tool
|
|
3
|
+
description: "Use this skill whenever any NeuroClaw modality skill (especially eeg-skill) needs to execute concrete MNE-Python operations for EEG loading, preprocessing, filtering, artifact removal, epoching, frequency-band analysis, or feature extraction. This is the dedicated base/tool skill that contains all specific MNE-Python code and usage patterns."
|
|
4
|
+
license: MIT License (NeuroClaw custom skill – freely modifiable within the project)
|
|
5
|
+
layer: base
|
|
6
|
+
skill_type: tool
|
|
7
|
+
dependencies:
|
|
8
|
+
- claw-shell
|
|
9
|
+
---
|
|
10
|
+
# MNE-EEG Tool (Base/Tool Layer)
|
|
11
|
+
|
|
12
|
+
## Overview
|
|
13
|
+
`mne-eeg-tool` is the **NeuroClaw base/tool skill** that provides all concrete MNE-Python implementation for EEG processing.
|
|
14
|
+
|
|
15
|
+
It is **never called directly by the user**. It is exclusively delegated to by the modality-layer skill `eeg-skill` (and any future EEG-related modality skills).
|
|
16
|
+
|
|
17
|
+
This skill:
|
|
18
|
+
- Contains the complete, ready-to-run MNE-Python code (covers all standard preprocessing and feature extraction tasks).
|
|
19
|
+
- Handles environment setup verification.
|
|
20
|
+
- Provides a single, well-documented wrapper script (`eeg_pipeline.py`) that implements **all** common EEG tasks, including the newly added continuous-data branch, functional connectivity, ERP features, frontal alpha asymmetry, and microstate analysis.
|
|
21
|
+
- Routes every execution through `claw-shell` for safety and logging.
|
|
22
|
+
|
|
23
|
+
**Research use only** — outputs are for scientific analysis.
|
|
24
|
+
|
|
25
|
+
## Agent Reference Rule
|
|
26
|
+
|
|
27
|
+
When the agent needs MNE-EEG implementation code, it should first consult the curated snippet in `skills/mne-eeg-tool/scripts/` instead of copying from the embedded wrapper below.
|
|
28
|
+
|
|
29
|
+
Reference snippet available:
|
|
30
|
+
- `scripts/eeg_pipeline_reference.py` -> full EEG pipeline: load, bad-channel detection, filtering, ICA, epoching, frequency bands, connectivity, ERP features, alpha asymmetry, microstates
|
|
31
|
+
|
|
32
|
+
Example:
|
|
33
|
+
```bash
|
|
34
|
+
python skills/mne-eeg-tool/scripts/eeg_pipeline_reference.py \
|
|
35
|
+
--input path/to/data.set \
|
|
36
|
+
--resting \
|
|
37
|
+
--output-dir eeg_output/
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Quick Reference (Core Functions)
|
|
41
|
+
|
|
42
|
+
| Function | Purpose | New in this update? |
|
|
43
|
+
|---------------------------------------|-------------------------------------------------------------------------|---------------------|
|
|
44
|
+
| `load_eeg()` | Load .set / .edf / .bdf / .fif / BIDS + validation | — |
|
|
45
|
+
| `detect_and_interpolate_bad_channels()` | Auto-detect + interpolate noisy channels | **Yes** |
|
|
46
|
+
| `preprocess_filtering()` | Resample + high-pass + notch + bandpass | — |
|
|
47
|
+
| `remove_artifacts()` | ICA + AutoReject + EOG/ECG regression | **Yes** |
|
|
48
|
+
| `continuous_data_cleaning()` | Resting-state pipeline (no events) | **Yes** |
|
|
49
|
+
| `rereference_and_epoch()` | Average reference + epoching + baseline correction | — |
|
|
50
|
+
| `extract_frequency_bands()` | Split into δ/θ/α/β/γ bands + power matrices | — |
|
|
51
|
+
| `extract_features()` | Band power, CSP, Hjorth, sample entropy, etc. | — |
|
|
52
|
+
| `compute_connectivity()` | PLV, coherence, wPLI, imaginary coherence | **Yes** |
|
|
53
|
+
| `extract_erp_features()` | Peak amplitude, latency, area under curve | **Yes** |
|
|
54
|
+
| `compute_alpha_asymmetry()` | Frontal alpha asymmetry (emotion studies) | **Yes** |
|
|
55
|
+
| `run_microstate_analysis()` | EEG microstates (resting-state) | **Yes** |
|
|
56
|
+
| `full_eeg_pipeline()` | One-click end-to-end pipeline (any combination) | — |
|
|
57
|
+
|
|
58
|
+
## Installation (Handled by dependency-planner)
|
|
59
|
+
This skill is automatically installed when `eeg-skill` is used:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
# Executed via dependency-planner + conda-env-manager
|
|
63
|
+
conda create -n neuroclaw-eeg python=3.11 -y
|
|
64
|
+
conda activate neuroclaw-eeg
|
|
65
|
+
conda install -c conda-forge mne pyentrp scikit-learn pandas numpy matplotlib -y
|
|
66
|
+
pip install mne[full] # optional: full extras
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## NeuroClaw recommended wrapper script
|
|
70
|
+
|
|
71
|
+
The full EEG pipeline implementation is in `scripts/eeg_pipeline_reference.py` (see Agent Reference Rule above).
|
|
72
|
+
|
|
73
|
+
Example:
|
|
74
|
+
```bash
|
|
75
|
+
python skills/mne-eeg-tool/scripts/eeg_pipeline_reference.py \
|
|
76
|
+
--input path/to/data.set \
|
|
77
|
+
--resting \
|
|
78
|
+
--output-dir eeg_output/
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Functions: `load_eeg`, `detect_and_interpolate_bad_channels`, `preprocess_filtering`, `remove_artifacts`, `continuous_data_cleaning`, `rereference_and_epoch`, `extract_frequency_bands`, `extract_features`, `compute_connectivity`, `extract_erp_features`, `compute_alpha_asymmetry`, `run_microstate_analysis`, `full_eeg_pipeline`.
|
|
82
|
+
|
|
83
|
+
## Important Notes & Limitations
|
|
84
|
+
- Requires the `neuroclaw-eeg` conda environment (auto-created by `dependency-planner`).
|
|
85
|
+
- Long-running steps (ICA, connectivity, microstates) run safely in `claw` tmux session.
|
|
86
|
+
- Outputs are always written to `./eeg_output/` with clear subfolders.
|
|
87
|
+
- Fully extensible: new functions can be added to `eeg_pipeline.py` without touching `eeg-skill`.
|
|
88
|
+
|
|
89
|
+
## Complementary / Related Skills
|
|
90
|
+
- `claw-shell` → executes this skill’s wrapper
|
|
91
|
+
- `dependency-planner` + `conda-env-manager` → creates `neuroclaw-eeg` environment
|
|
92
|
+
|
|
93
|
+
## Reference
|
|
94
|
+
Official MNE-Python documentation (https://mne.tools) + MNE-Connectivity + mne-microstates.
|
|
95
|
+
Aligned with NeuroClaw base/tool skill pattern (freesurfer-tool, dcm2nii, etc.).
|
|
96
|
+
|
|
97
|
+
Curated reference snippet in this skill:
|
|
98
|
+
- `skills/mne-eeg-tool/scripts/eeg_pipeline_reference.py`
|
|
99
|
+
|
|
100
|
+
## Post-Execution Verification (Harness Integration)
|
|
101
|
+
|
|
102
|
+
After MNE-EEG processing completes, this skill **automatically invokes harness-core's VerificationRunner** to validate output integrity:
|
|
103
|
+
|
|
104
|
+
**Integrated verification checks**:
|
|
105
|
+
|
|
106
|
+
```python
|
|
107
|
+
from skills.harness_core import VerificationRunner, AuditLogger
|
|
108
|
+
|
|
109
|
+
verifier = VerificationRunner(task_type="eeg_processing")
|
|
110
|
+
|
|
111
|
+
# 1. EEG file loading success
|
|
112
|
+
verifier.add_check("eeg_loading",
|
|
113
|
+
checker=lambda: verify_eeg_loaded(output_dir),
|
|
114
|
+
severity="error"
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
# 2. Channel count and data shape
|
|
118
|
+
verifier.add_check("channel_integrity",
|
|
119
|
+
checker=lambda: verify_channel_count(output_dir),
|
|
120
|
+
severity="error"
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
# 3. Artifact removal success (ICA, AutoReject)
|
|
124
|
+
verifier.add_check("artifact_removal",
|
|
125
|
+
checker=lambda: verify_artifact_removal_rate(output_dir, min_rate=0.85),
|
|
126
|
+
severity="warning"
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
# 4. Frequency spectrum sanity (not all zeros, reasonable power)
|
|
130
|
+
verifier.add_check("frequency_spectrum",
|
|
131
|
+
checker=lambda: verify_frequency_spectrum(output_dir),
|
|
132
|
+
severity="warning"
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
# 5. Data range and NaN/Inf checks
|
|
136
|
+
verifier.add_check("data_integrity",
|
|
137
|
+
checker=lambda: verify_no_nan_inf(output_dir),
|
|
138
|
+
severity="error"
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
# 6. Connectivity/Features output shape
|
|
142
|
+
verifier.add_check("feature_extraction",
|
|
143
|
+
checker=lambda: verify_feature_dimensions(output_dir),
|
|
144
|
+
severity="warning"
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
report = verifier.run(output_dir)
|
|
148
|
+
|
|
149
|
+
# Log verification results
|
|
150
|
+
logger = AuditLogger(log_file=f"{output_dir}/eeg_verification.jsonl")
|
|
151
|
+
logger.log_validation(
|
|
152
|
+
task_name="eeg_processing",
|
|
153
|
+
checks_passed=len([r for r in report.results if r.passed]),
|
|
154
|
+
total_checks=len(report.results),
|
|
155
|
+
output_path=output_dir
|
|
156
|
+
)
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
**Output**: `eeg_output/eeg_verification.jsonl` (structured audit log with JSONL format)
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
Created At: 2026-03-25 14:00 HKT
|
|
164
|
+
Last Updated At: 2026-04-05 02:03 HKT
|
|
165
|
+
Author: chengwang96
|