@brainpilot/skills 0.0.6 → 0.0.7
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,231 @@
|
|
|
1
|
+
"""MNE-EEG Pipeline Reference - Core EEG processing functions.
|
|
2
|
+
|
|
3
|
+
Distilled from the NeuroClaw mne-eeg-tool SKILL.md.
|
|
4
|
+
Agent should consult this script instead of copying from SKILL.md directly.
|
|
5
|
+
|
|
6
|
+
Functions:
|
|
7
|
+
load_eeg() - Load .set/.edf/.bdf/.fif + validation
|
|
8
|
+
detect_and_interpolate_bad_channels() - Auto-detect + interpolate noisy channels
|
|
9
|
+
preprocess_filtering() - Resample + high-pass + notch + bandpass
|
|
10
|
+
remove_artifacts() - ICA + AutoReject + EOG/ECG regression
|
|
11
|
+
continuous_data_cleaning() - Resting-state pipeline (no events)
|
|
12
|
+
rereference_and_epoch() - Average reference + epoching + baseline
|
|
13
|
+
extract_frequency_bands() - Split into delta/theta/alpha/beta/gamma
|
|
14
|
+
extract_features() - Band power, CSP, Hjorth, sample entropy
|
|
15
|
+
compute_connectivity() - PLV, coherence, wPLI
|
|
16
|
+
extract_erp_features() - Peak amplitude, latency, AUC
|
|
17
|
+
compute_alpha_asymmetry() - Frontal alpha asymmetry (emotion studies)
|
|
18
|
+
run_microstate_analysis() - EEG microstates (resting-state)
|
|
19
|
+
full_eeg_pipeline() - One-click end-to-end pipeline
|
|
20
|
+
|
|
21
|
+
Usage:
|
|
22
|
+
python skills/mne-eeg-tool/scripts/eeg_pipeline_reference.py --input data.set
|
|
23
|
+
python skills/mne-eeg-tool/scripts/eeg_pipeline_reference.py --input data.set --resting
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
import argparse
|
|
27
|
+
|
|
28
|
+
import mne
|
|
29
|
+
import numpy as np
|
|
30
|
+
import pandas as pd
|
|
31
|
+
from mne.preprocessing import ICA, find_bad_channels, AutoReject
|
|
32
|
+
from mne.decoding import CSP
|
|
33
|
+
from mne_connectivity import spectral_connectivity_epochs
|
|
34
|
+
import pyentrp.entropy as entropy
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def load_eeg(raw_path: str):
|
|
38
|
+
"""Load EEG data in any supported format + basic validation."""
|
|
39
|
+
if raw_path.endswith('.set'):
|
|
40
|
+
raw = mne.io.read_raw_eeglab(raw_path, preload=True)
|
|
41
|
+
elif raw_path.endswith(('.edf', '.bdf')):
|
|
42
|
+
raw = mne.io.read_raw_edf(raw_path, preload=True)
|
|
43
|
+
elif raw_path.endswith('.fif'):
|
|
44
|
+
raw = mne.io.read_raw_fif(raw_path, preload=True)
|
|
45
|
+
else:
|
|
46
|
+
raw = mne.io.read_raw(raw_path, preload=True)
|
|
47
|
+
print(f"Loaded: {len(raw.ch_names)} channels, {raw.n_times} samples, SFREQ={raw.info['sfreq']} Hz")
|
|
48
|
+
return raw
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def detect_and_interpolate_bad_channels(raw: mne.io.Raw):
|
|
52
|
+
"""Explicit bad-channel detection + interpolation."""
|
|
53
|
+
bads = find_bad_channels(raw, method='correlation', threshold=0.8)
|
|
54
|
+
raw.info['bads'] = bads
|
|
55
|
+
raw.interpolate_bads(reset_bads=True)
|
|
56
|
+
print(f"Interpolated {len(bads)} bad channels")
|
|
57
|
+
return raw
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def preprocess_filtering(raw: mne.io.Raw, target_sfreq: int = 256):
|
|
61
|
+
"""Resample + full filtering pipeline."""
|
|
62
|
+
raw = raw.copy().resample(target_sfreq)
|
|
63
|
+
raw.filter(l_freq=0.5, h_freq=40, fir_design='firwin')
|
|
64
|
+
raw.notch_filter(freqs=50, notch_widths=1)
|
|
65
|
+
return raw
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def remove_artifacts(raw: mne.io.Raw):
|
|
69
|
+
"""ICA + AutoReject + EOG/ECG regression (if channels exist)."""
|
|
70
|
+
ica = ICA(n_components=20, random_state=42, method='fastica')
|
|
71
|
+
ica.fit(raw)
|
|
72
|
+
eog_inds, _ = ica.find_bads_eog(raw)
|
|
73
|
+
muscle_inds, _ = ica.find_bads_muscle(raw)
|
|
74
|
+
ica.exclude = eog_inds + muscle_inds
|
|
75
|
+
raw_clean = ica.apply(raw.copy())
|
|
76
|
+
|
|
77
|
+
ar = AutoReject()
|
|
78
|
+
events = mne.make_fixed_length_events(raw_clean, duration=2.0)
|
|
79
|
+
epochs = mne.Epochs(raw_clean, events, tmin=0, tmax=2.0, preload=True, reject_by_annotation=False)
|
|
80
|
+
ar.fit(epochs)
|
|
81
|
+
raw_clean = ar.transform(raw_clean)
|
|
82
|
+
|
|
83
|
+
print("Artifact removal (ICA + AutoReject) completed")
|
|
84
|
+
return raw_clean
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def continuous_data_cleaning(raw: mne.io.Raw):
|
|
88
|
+
"""Resting-state continuous pipeline (no epoching)."""
|
|
89
|
+
raw = preprocess_filtering(raw)
|
|
90
|
+
raw = remove_artifacts(raw)
|
|
91
|
+
raw = raw.set_eeg_reference('average')
|
|
92
|
+
print("Continuous resting-state cleaning completed")
|
|
93
|
+
return raw
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def rereference_and_epoch(raw_clean: mne.io.Raw, events=None):
|
|
97
|
+
"""Re-reference + epoching + baseline correction."""
|
|
98
|
+
raw_ref = raw_clean.copy().set_eeg_reference('average')
|
|
99
|
+
if events is None:
|
|
100
|
+
events = mne.find_events(raw_ref, stim_channel='STI 014')
|
|
101
|
+
epochs = mne.Epochs(raw_ref, events, tmin=-0.2, tmax=0.8,
|
|
102
|
+
baseline=(None, 0), preload=True,
|
|
103
|
+
reject=dict(eeg=150e-6))
|
|
104
|
+
epochs.save("eeg_output/epoched-epo.fif", overwrite=True)
|
|
105
|
+
return epochs
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def extract_frequency_bands(raw: mne.io.Raw, output_dir: str = "eeg_output"):
|
|
109
|
+
"""Extract classic bands and save power."""
|
|
110
|
+
bands = {'delta': (0.5, 4), 'theta': (4, 8), 'alpha': (8, 13),
|
|
111
|
+
'beta': (13, 30), 'gamma': (30, 40)}
|
|
112
|
+
power_dict = {}
|
|
113
|
+
for name, (l, h) in bands.items():
|
|
114
|
+
band_raw = raw.copy().filter(l_freq=l, h_freq=h)
|
|
115
|
+
psd, freqs = mne.time_frequency.psd_array_welch(
|
|
116
|
+
band_raw.get_data(), sfreq=band_raw.info['sfreq'],
|
|
117
|
+
fmin=l, fmax=h, n_fft=1024)
|
|
118
|
+
power = np.mean(psd, axis=1)
|
|
119
|
+
power_dict[name] = power
|
|
120
|
+
band_raw.save(f"{output_dir}/band_{name}.fif", overwrite=True)
|
|
121
|
+
df_power = pd.DataFrame(power_dict, index=raw.ch_names)
|
|
122
|
+
df_power.to_csv(f"{output_dir}/band_power.csv")
|
|
123
|
+
return df_power
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def compute_connectivity(epochs: mne.Epochs, output_dir: str = "eeg_output"):
|
|
127
|
+
"""Functional connectivity (PLV, coherence, wPLI)."""
|
|
128
|
+
conn = spectral_connectivity_epochs(
|
|
129
|
+
epochs, method=['plv', 'coh', 'wpli'], mode='multitaper',
|
|
130
|
+
sfreq=epochs.info['sfreq'], fmin=8, fmax=13, faverage=True)
|
|
131
|
+
np.savez(f"{output_dir}/connectivity.npz", plv=conn[0], coh=conn[1], wpli=conn[2])
|
|
132
|
+
print("Connectivity matrices saved")
|
|
133
|
+
return conn
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def extract_erp_features(epochs: mne.Epochs, output_dir: str = "eeg_output"):
|
|
137
|
+
"""ERP peak amplitude, latency, AUC."""
|
|
138
|
+
evokeds = epochs.average()
|
|
139
|
+
peaks = {}
|
|
140
|
+
for ch in evokeds.ch_names:
|
|
141
|
+
data = evokeds.get_data(picks=ch).squeeze()
|
|
142
|
+
peak_idx = np.argmax(np.abs(data))
|
|
143
|
+
peaks[ch] = {
|
|
144
|
+
'peak_amp': data[peak_idx],
|
|
145
|
+
'peak_latency': evokeds.times[peak_idx],
|
|
146
|
+
'auc': np.trapz(np.abs(data))
|
|
147
|
+
}
|
|
148
|
+
df_erp = pd.DataFrame(peaks).T
|
|
149
|
+
df_erp.to_csv(f"{output_dir}/erp_features.csv")
|
|
150
|
+
return df_erp
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def compute_alpha_asymmetry(raw: mne.io.Raw, output_dir: str = "eeg_output"):
|
|
154
|
+
"""Frontal alpha asymmetry (F4-F3)."""
|
|
155
|
+
raw_alpha = raw.copy().filter(8, 13)
|
|
156
|
+
epochs = mne.make_fixed_length_epochs(raw_alpha, duration=2.0, preload=True)
|
|
157
|
+
left = epochs.get_data(picks=['F3']).mean(axis=2)
|
|
158
|
+
right = epochs.get_data(picks=['F4']).mean(axis=2)
|
|
159
|
+
asymmetry = (left - right) / (left + right)
|
|
160
|
+
np.save(f"{output_dir}/alpha_asymmetry.npy", asymmetry)
|
|
161
|
+
print("Frontal alpha asymmetry computed")
|
|
162
|
+
return asymmetry
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def run_microstate_analysis(raw: mne.io.Raw, output_dir: str = "eeg_output"):
|
|
166
|
+
"""EEG microstate analysis (resting-state)."""
|
|
167
|
+
from mne_microstates import Microstates
|
|
168
|
+
ms = Microstates(n_states=4)
|
|
169
|
+
ms.fit(raw)
|
|
170
|
+
ms.save(f"{output_dir}/microstates.fif")
|
|
171
|
+
print("Microstate analysis completed (4 states)")
|
|
172
|
+
return ms
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def extract_features(epochs: mne.Epochs, output_dir: str = "eeg_output"):
|
|
176
|
+
"""Core + advanced features: band power, CSP, Hjorth, sample entropy."""
|
|
177
|
+
psds, freqs = mne.time_frequency.psd_array_multitaper(
|
|
178
|
+
epochs.get_data(), sfreq=epochs.info['sfreq'])
|
|
179
|
+
band_power = np.mean(psds[:, :, (freqs >= 8) & (freqs <= 13)], axis=2)
|
|
180
|
+
|
|
181
|
+
csp = CSP(n_components=4)
|
|
182
|
+
csp_features = csp.fit_transform(epochs.get_data(), epochs.events[:, -1])
|
|
183
|
+
|
|
184
|
+
hjorth = []
|
|
185
|
+
sample_entropy = []
|
|
186
|
+
for trial in epochs.get_data():
|
|
187
|
+
mobility = np.std(np.diff(trial, axis=1), axis=1) / np.std(trial, axis=1)
|
|
188
|
+
hjorth.append(mobility)
|
|
189
|
+
sample_entropy.append([entropy.sample_entropy(ch, 2, 0.2)[0] for ch in trial])
|
|
190
|
+
|
|
191
|
+
features = {
|
|
192
|
+
'band_power': band_power,
|
|
193
|
+
'csp': csp_features,
|
|
194
|
+
'hjorth': np.array(hjorth),
|
|
195
|
+
'sample_entropy': np.array(sample_entropy)
|
|
196
|
+
}
|
|
197
|
+
np.savez(f"{output_dir}/features.npz", **features)
|
|
198
|
+
return features
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def full_eeg_pipeline(raw_path: str, is_resting_state: bool = False, output_dir: str = "eeg_output"):
|
|
202
|
+
"""One-click full EEG pipeline (supports resting-state flag)."""
|
|
203
|
+
from pathlib import Path
|
|
204
|
+
Path(output_dir).mkdir(parents=True, exist_ok=True)
|
|
205
|
+
|
|
206
|
+
raw = load_eeg(raw_path)
|
|
207
|
+
raw = detect_and_interpolate_bad_channels(raw)
|
|
208
|
+
|
|
209
|
+
if is_resting_state:
|
|
210
|
+
raw_clean = continuous_data_cleaning(raw)
|
|
211
|
+
compute_connectivity(mne.make_fixed_length_epochs(raw_clean, duration=2.0, preload=True), output_dir)
|
|
212
|
+
run_microstate_analysis(raw_clean, output_dir)
|
|
213
|
+
compute_alpha_asymmetry(raw_clean, output_dir)
|
|
214
|
+
else:
|
|
215
|
+
raw_clean = remove_artifacts(preprocess_filtering(raw))
|
|
216
|
+
epochs = rereference_and_epoch(raw_clean)
|
|
217
|
+
extract_features(epochs, output_dir)
|
|
218
|
+
extract_erp_features(epochs, output_dir)
|
|
219
|
+
|
|
220
|
+
extract_frequency_bands(raw_clean, output_dir)
|
|
221
|
+
print(f"Full EEG Pipeline completed! Outputs in: {output_dir}/")
|
|
222
|
+
return "Pipeline finished"
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
if __name__ == "__main__":
|
|
226
|
+
parser = argparse.ArgumentParser(description="MNE-EEG Pipeline Reference")
|
|
227
|
+
parser.add_argument("--input", required=True, help="Path to EEG file (.set/.edf/.bdf/.fif)")
|
|
228
|
+
parser.add_argument("--resting", action="store_true", help="Use resting-state pipeline")
|
|
229
|
+
parser.add_argument("--output-dir", default="eeg_output", help="Output directory")
|
|
230
|
+
args = parser.parse_args()
|
|
231
|
+
full_eeg_pipeline(args.input, is_resting_state=args.resting, output_dir=args.output_dir)
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: seed-iv-skill
|
|
3
|
+
description: "Use this skill whenever the user wants an end-to-end workflow for the SEED-IV (SJTU Emotion EEG Dataset - 4 emotions) dataset, including EEG validation, preprocessing, feature extraction, and emotion classification. Triggers include: 'SEED-IV', 'SEED4', 'emotion EEG', 'EEG emotion recognition', 'process SEED-IV', or any request to run the SEED-IV pipeline."
|
|
4
|
+
license: MIT License (NeuroClaw custom skill - freely modifiable within the project)
|
|
5
|
+
layer: subagent
|
|
6
|
+
skill_type: dataset
|
|
7
|
+
dependencies:
|
|
8
|
+
- eeg-skill
|
|
9
|
+
- bids-organizer
|
|
10
|
+
- claw-shell
|
|
11
|
+
complementary_skills:
|
|
12
|
+
- brain-visualization
|
|
13
|
+
---
|
|
14
|
+
# SEED-IV Skill (Dataset-Orchestration Layer)
|
|
15
|
+
|
|
16
|
+
## Overview
|
|
17
|
+
|
|
18
|
+
`seed-iv-skill` is the NeuroClaw orchestration skill for the **SEED-IV (SJTU Emotion EEG Dataset - 4 emotions)** dataset, developed by the BCMI Lab at Shanghai Jiao Tong University.
|
|
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 existing base/tool skills via `claw-shell`.
|
|
24
|
+
- Companion scripts in `scripts/` provide reference implementations for EEG validation, feature extraction, and classification.
|
|
25
|
+
|
|
26
|
+
**Core workflow (never bypassed):**
|
|
27
|
+
1. Identify input SEED-IV data and target analysis.
|
|
28
|
+
2. Generate a **numbered execution plan** clearly stating WHAT needs to be done and which tool skill will handle each step.
|
|
29
|
+
3. Present the full plan, estimated runtime, resource requirements, and risks to the user and wait for explicit confirmation ("YES" / "execute" / "proceed").
|
|
30
|
+
4. On confirmation, delegate every step to the appropriate skill via `claw-shell`.
|
|
31
|
+
5. After execution, save all outputs in a clean directory structure (`seed_iv_output/`).
|
|
32
|
+
|
|
33
|
+
**Research use only.**
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Quick Reference
|
|
38
|
+
|
|
39
|
+
| Task | What needs to be done | Delegate to | Expected output |
|
|
40
|
+
|---|---|---|---|
|
|
41
|
+
| EEG validation | Validate SEED-IV BIDS structure | `scripts/validate_seed_iv.py` | Validation report |
|
|
42
|
+
| EEG preprocessing | Filtering, artifact removal, epoching | `eeg-skill` | `eeg_output/` preprocessed EEG |
|
|
43
|
+
| Feature extraction | DE, PSD, connectivity features | `scripts/extract_seed_iv_features.py` | Feature matrices |
|
|
44
|
+
| Emotion classification | 4-class emotion recognition | `scripts/classify_seed_iv.py` | Classification results + accuracy |
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Dataset Characteristics
|
|
49
|
+
|
|
50
|
+
- **Cohort**: 15 healthy subjects
|
|
51
|
+
- **Sessions**: 3 sessions per subject (different days)
|
|
52
|
+
- **Emotions**: 4 classes — happy, sad, fear, neutral
|
|
53
|
+
- **Trials**: 24 trials per session (6 per emotion)
|
|
54
|
+
- **Stimuli**: Short film clips designed to elicit specific emotions
|
|
55
|
+
- **EEG System**: ESI NeuroScan System, 62 channels
|
|
56
|
+
- **Sampling rate**: 1000 Hz (downsampled to 200 Hz commonly)
|
|
57
|
+
- **Reference**: Linked mastoids (M1/M2)
|
|
58
|
+
- **Access**: BCMI Lab (bcmi.sjtu.edu.cn/~seed/)
|
|
59
|
+
- **Format**: MATLAB .mat files (community BIDS conversion available)
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Supported Modalities
|
|
64
|
+
|
|
65
|
+
| Modality | Description | Details |
|
|
66
|
+
|---|---|---|
|
|
67
|
+
| EEG | 62-channel EEG | ESI NeuroScan, 1000 Hz |
|
|
68
|
+
| Eye tracking | Eye movement data | Gaze position, blinks |
|
|
69
|
+
| Physiological | GSR (galvanic skin response) | Skin conductance |
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## SEED-IV Emotion Labels
|
|
74
|
+
|
|
75
|
+
| Label | Emotion | Trials per Session |
|
|
76
|
+
|---|---|---|
|
|
77
|
+
| 0 | Neutral | 6 |
|
|
78
|
+
| 1 | Sad | 6 |
|
|
79
|
+
| 2 | Fear | 6 |
|
|
80
|
+
| 3 | Happy | 6 |
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## BIDS Preparation
|
|
85
|
+
|
|
86
|
+
### Script: `scripts/validate_seed_iv.py`
|
|
87
|
+
|
|
88
|
+
Validates SEED-IV BIDS structure and generates a compliance report.
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
python skills/seed-iv-skill/scripts/validate_seed_iv.py \
|
|
92
|
+
--input /path/to/SEED-IV/bids \
|
|
93
|
+
--output /path/to/seed_iv_output/qc/bids_validation.csv
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Features:
|
|
97
|
+
- BIDS directory structure validation
|
|
98
|
+
- Subject/session completeness check (15 subjects × 3 sessions)
|
|
99
|
+
- EEG file presence verification
|
|
100
|
+
- Event file validation (emotion labels)
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Core Workflow (Never Bypassed)
|
|
105
|
+
|
|
106
|
+
1. Identify user target: full SEED-IV pipeline, feature extraction only, or classification only.
|
|
107
|
+
2. Generate a numbered plan with tools, outputs, runtime, storage, and risks.
|
|
108
|
+
3. Wait for explicit confirmation (`YES` / `execute` / `proceed`).
|
|
109
|
+
4. On confirmation, run BIDS validation using `scripts/validate_seed_iv.py`.
|
|
110
|
+
5. Delegate to `eeg-skill` for EEG preprocessing (filtering, artifact removal).
|
|
111
|
+
6. Run `scripts/extract_seed_iv_features.py` for feature extraction (DE, PSD).
|
|
112
|
+
7. Run `scripts/classify_seed_iv.py` for emotion classification.
|
|
113
|
+
8. Save outputs into `seed_iv_output/`.
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Standard Output Layout
|
|
118
|
+
|
|
119
|
+
```
|
|
120
|
+
seed_iv_output/
|
|
121
|
+
├── bids/ # BIDS-staged data (or validation report)
|
|
122
|
+
├── eeg/ # Preprocessed EEG derivatives
|
|
123
|
+
├── features/ # Extracted features (DE, PSD, connectivity)
|
|
124
|
+
├── classification/ # Classification results and accuracies
|
|
125
|
+
├── qc/ # QC summaries
|
|
126
|
+
└── logs/ # Processing logs
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Benchmark Adapter Guidance
|
|
132
|
+
|
|
133
|
+
For benchmark-style prompts, do not force the full orchestration when the task only asks for local SEED-IV data validation.
|
|
134
|
+
|
|
135
|
+
- If the task starts from SEED-IV data already present on disk and only asks for BIDS validation:
|
|
136
|
+
- Skip the download stage
|
|
137
|
+
- Default to the narrow path `local SEED-IV discovery -> BIDS validation -> report`
|
|
138
|
+
- In benchmark mode, do not require explicit confirmation before presenting the validation solution.
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## Safety and Execution Policy
|
|
143
|
+
- No execution before explicit plan confirmation.
|
|
144
|
+
- All execution must be routed via `claw-shell`.
|
|
145
|
+
- Missing dependencies must be resolved by `dependency-planner` before running.
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## Important Notes and Limitations
|
|
150
|
+
- SEED-IV is a relatively small dataset (15 subjects); cross-subject generalization is challenging.
|
|
151
|
+
- 62-channel EEG provides rich spatial information for source localization.
|
|
152
|
+
- Differential Entropy (DE) features are the most commonly used for SEED-IV classification.
|
|
153
|
+
- Session-level normalization is recommended to handle inter-session variability.
|
|
154
|
+
- `seed-iv-skill` is orchestration-only; detailed preprocessing logic remains in modality skills.
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## When to Call This Skill
|
|
159
|
+
- User asks for end-to-end SEED-IV workflow.
|
|
160
|
+
- User asks to process SEED-IV EEG data.
|
|
161
|
+
- User needs BIDS validation for SEED-IV data.
|
|
162
|
+
- User asks for EEG-based emotion recognition analysis.
|
|
163
|
+
- User asks to extract DE or PSD features from SEED-IV.
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## Complementary / Related Skills
|
|
168
|
+
- `eeg-skill` → EEG preprocessing and feature extraction
|
|
169
|
+
- `bids-organizer` → BIDS validation and organization
|
|
170
|
+
- `brain-visualization` → visualization of derivatives
|
|
171
|
+
- `dependency-planner` → dependency resolution
|
|
172
|
+
- `conda-env-manager` → environment management
|
|
173
|
+
- `claw-shell` → command execution
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## Reference
|
|
178
|
+
- SEED-IV: https://bcmi.sjtu.edu.cn/~seed/
|
|
179
|
+
- BCMI Lab, Shanghai Jiao Tong University
|
|
180
|
+
- Zheng & Lu (2015): Investigating Critical Frequency Bands and Channels for EEG-based Emotion Recognition with Deep Neural Networks. IEEE Trans. Autonomous Mental Development.
|
|
181
|
+
|
|
182
|
+
Created At: 2026-05-06 14:21 HKT
|
|
183
|
+
Last Updated At: 2026-05-06 14:21 HKT
|
|
184
|
+
Author: chengwang96
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Classify emotions from SEED-IV features.
|
|
3
|
+
|
|
4
|
+
Supports SVM, Random Forest, and Leave-One-Subject-Out cross-validation.
|
|
5
|
+
"""
|
|
6
|
+
import argparse
|
|
7
|
+
import csv
|
|
8
|
+
import sys
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import Dict, List, Tuple
|
|
11
|
+
|
|
12
|
+
import numpy as np
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def load_features(features_path: Path) -> Tuple[np.ndarray, np.ndarray, List[str]]:
|
|
16
|
+
"""Load features and labels from CSV."""
|
|
17
|
+
import pandas as pd
|
|
18
|
+
df = pd.read_csv(features_path)
|
|
19
|
+
|
|
20
|
+
# Find label column
|
|
21
|
+
label_col = None
|
|
22
|
+
for col in ["emotion", "label", "emotion_label"]:
|
|
23
|
+
if col in df.columns:
|
|
24
|
+
label_col = col
|
|
25
|
+
break
|
|
26
|
+
|
|
27
|
+
if label_col is None:
|
|
28
|
+
raise ValueError("No emotion label column found")
|
|
29
|
+
|
|
30
|
+
# Find feature columns
|
|
31
|
+
feature_cols = [c for c in df.columns if c.startswith("ch") and "_" in c]
|
|
32
|
+
|
|
33
|
+
X = df[feature_cols].values.astype(float)
|
|
34
|
+
y = df[label_col].values.astype(int)
|
|
35
|
+
subjects = df["subject"].tolist() if "subject" in df.columns else [f"sub-{i}" for i in range(len(y))]
|
|
36
|
+
|
|
37
|
+
return X, y, subjects
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def classify_svm(X: np.ndarray, y: np.ndarray, subjects: List[str]) -> Dict:
|
|
41
|
+
"""SVM classification with Leave-One-Subject-Out CV."""
|
|
42
|
+
from sklearn.svm import SVC
|
|
43
|
+
from sklearn.preprocessing import StandardScaler
|
|
44
|
+
from sklearn.model_selection import LeaveOneGroupOut
|
|
45
|
+
|
|
46
|
+
scaler = StandardScaler()
|
|
47
|
+
logo = LeaveOneGroupOut()
|
|
48
|
+
y_pred_all = []
|
|
49
|
+
y_true_all = []
|
|
50
|
+
|
|
51
|
+
for train_idx, test_idx in logo.split(X, y, subjects):
|
|
52
|
+
X_train = scaler.fit_transform(X[train_idx])
|
|
53
|
+
X_test = scaler.transform(X[test_idx])
|
|
54
|
+
svm = SVC(kernel="rbf", C=1.0, gamma="scale")
|
|
55
|
+
svm.fit(X_train, y[train_idx])
|
|
56
|
+
y_pred_all.extend(svm.predict(X_test))
|
|
57
|
+
y_true_all.extend(y[test_idx])
|
|
58
|
+
|
|
59
|
+
y_pred_all = np.array(y_pred_all)
|
|
60
|
+
y_true_all = np.array(y_true_all)
|
|
61
|
+
accuracy = np.mean(y_pred_all == y_true_all)
|
|
62
|
+
|
|
63
|
+
# Per-class metrics
|
|
64
|
+
classes = np.unique(y_true_all)
|
|
65
|
+
per_class = {}
|
|
66
|
+
for cls in classes:
|
|
67
|
+
mask = y_true_all == cls
|
|
68
|
+
per_class[int(cls)] = {
|
|
69
|
+
"accuracy": float(np.mean(y_pred_all[mask] == cls)),
|
|
70
|
+
"n_samples": int(mask.sum()),
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return {
|
|
74
|
+
"method": "SVM (RBF)",
|
|
75
|
+
"cv": "Leave-One-Subject-Out",
|
|
76
|
+
"accuracy": float(accuracy),
|
|
77
|
+
"n_subjects": len(set(subjects)),
|
|
78
|
+
"n_samples": len(y_true_all),
|
|
79
|
+
"per_class": per_class,
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def classify_rf(X: np.ndarray, y: np.ndarray, subjects: List[str]) -> Dict:
|
|
84
|
+
"""Random Forest classification with Leave-One-Subject-Out CV."""
|
|
85
|
+
from sklearn.ensemble import RandomForestClassifier
|
|
86
|
+
from sklearn.preprocessing import StandardScaler
|
|
87
|
+
from sklearn.model_selection import LeaveOneGroupOut
|
|
88
|
+
|
|
89
|
+
scaler = StandardScaler()
|
|
90
|
+
logo = LeaveOneGroupOut()
|
|
91
|
+
y_pred_all = []
|
|
92
|
+
y_true_all = []
|
|
93
|
+
|
|
94
|
+
for train_idx, test_idx in logo.split(X, y, subjects):
|
|
95
|
+
X_train = scaler.fit_transform(X[train_idx])
|
|
96
|
+
X_test = scaler.transform(X[test_idx])
|
|
97
|
+
rf = RandomForestClassifier(n_estimators=100, random_state=42)
|
|
98
|
+
rf.fit(X_train, y[train_idx])
|
|
99
|
+
y_pred_all.extend(rf.predict(X_test))
|
|
100
|
+
y_true_all.extend(y[test_idx])
|
|
101
|
+
|
|
102
|
+
y_pred_all = np.array(y_pred_all)
|
|
103
|
+
y_true_all = np.array(y_true_all)
|
|
104
|
+
accuracy = np.mean(y_pred_all == y_true_all)
|
|
105
|
+
|
|
106
|
+
return {
|
|
107
|
+
"method": "Random Forest (100 trees)",
|
|
108
|
+
"cv": "Leave-One-Subject-Out",
|
|
109
|
+
"accuracy": float(accuracy),
|
|
110
|
+
"n_subjects": len(set(subjects)),
|
|
111
|
+
"n_samples": len(y_true_all),
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def main() -> int:
|
|
116
|
+
parser = argparse.ArgumentParser(description="Classify SEED-IV emotions.")
|
|
117
|
+
parser.add_argument("--input", required=True, help="Path to features CSV")
|
|
118
|
+
parser.add_argument("--output", required=True, help="Output path for results")
|
|
119
|
+
parser.add_argument("--method", choices=["svm", "rf", "both"], default="both",
|
|
120
|
+
help="Classification method")
|
|
121
|
+
args = parser.parse_args()
|
|
122
|
+
|
|
123
|
+
input_path = Path(args.input).resolve()
|
|
124
|
+
if not input_path.exists():
|
|
125
|
+
print(f"Input file not found: {input_path}", file=sys.stderr)
|
|
126
|
+
return 1
|
|
127
|
+
|
|
128
|
+
X, y, subjects = load_features(input_path)
|
|
129
|
+
print(f"Loaded {len(y)} samples, {len(set(y))} classes, {len(set(subjects))} subjects")
|
|
130
|
+
|
|
131
|
+
results = []
|
|
132
|
+
if args.method in ("svm", "both"):
|
|
133
|
+
svm_result = classify_svm(X, y, subjects)
|
|
134
|
+
results.append(svm_result)
|
|
135
|
+
print(f"SVM accuracy: {svm_result['accuracy']:.4f}")
|
|
136
|
+
|
|
137
|
+
if args.method in ("rf", "both"):
|
|
138
|
+
rf_result = classify_rf(X, y, subjects)
|
|
139
|
+
results.append(rf_result)
|
|
140
|
+
print(f"RF accuracy: {rf_result['accuracy']:.4f}")
|
|
141
|
+
|
|
142
|
+
output_path = Path(args.output).resolve()
|
|
143
|
+
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
144
|
+
|
|
145
|
+
with open(output_path, "w", encoding="utf-8") as f:
|
|
146
|
+
import json
|
|
147
|
+
json.dump(results, f, indent=2, default=str)
|
|
148
|
+
|
|
149
|
+
print(f"Results saved to {output_path}")
|
|
150
|
+
return 0
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
if __name__ == "__main__":
|
|
154
|
+
sys.exit(main())
|