@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.
Files changed (285) hide show
  1. package/package.json +2 -2
  2. package/skills/01_Meta-Skills/academic-research-hub/SKILL.md +108 -0
  3. package/skills/01_Meta-Skills/academic-research-hub/scripts/requirements.txt +17 -0
  4. package/skills/01_Meta-Skills/academic-research-hub/scripts/research.py +781 -0
  5. package/skills/01_Meta-Skills/beautiful-log/SKILL.md +64 -0
  6. package/skills/01_Meta-Skills/beautiful-log/scripts/beautiful_log.py +274 -0
  7. package/skills/01_Meta-Skills/ethoclaw-daily-paper/SKILL.md +130 -0
  8. package/skills/01_Meta-Skills/ethoclaw-daily-paper/assets/config.template.yaml +54 -0
  9. package/skills/01_Meta-Skills/ethoclaw-daily-paper/assets/top5_digest_template.md +5 -0
  10. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/build_top5_digest.py +300 -0
  11. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/common.py +137 -0
  12. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/merge_results.py +106 -0
  13. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/run_pipeline.py +177 -0
  14. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/search_arxiv.py +162 -0
  15. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/search_pubmed.py +202 -0
  16. package/skills/01_Meta-Skills/ethoclaw-normalize-tabular/SKILL.md +173 -0
  17. package/skills/01_Meta-Skills/ethoclaw-normalize-tabular/scripts/normalize_data.py +874 -0
  18. package/skills/01_Meta-Skills/ethoclaw-pdf-research/SKILL.md +134 -0
  19. package/skills/01_Meta-Skills/ethoclaw-pdf-research/references/confirmation-prompts.md +31 -0
  20. package/skills/01_Meta-Skills/ethoclaw-pdf-research/references/output-patterns.md +45 -0
  21. package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/build_markdown_deliverables.py +41 -0
  22. package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/build_research_log.py +84 -0
  23. package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/build_summary_md.py +63 -0
  24. package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/extract_pdf_bundle.py +140 -0
  25. package/skills/01_Meta-Skills/experiment-controller/SKILL.md +140 -0
  26. package/skills/01_Meta-Skills/knowledge-graph-builder/SKILL.md +366 -0
  27. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/entity_resolution.py +120 -0
  28. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/extraction_prompt_template.txt +19 -0
  29. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/graph_query.py +106 -0
  30. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/hypothesis_cli_reference.py +42 -0
  31. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/new_data_source_template.py +116 -0
  32. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/requirements.txt +15 -0
  33. package/skills/01_Meta-Skills/method-design/SKILL.md +61 -0
  34. package/skills/01_Meta-Skills/multi-search-engine/SKILL.md +119 -0
  35. package/skills/01_Meta-Skills/research-idea/SKILL.md +65 -0
  36. package/skills/05_EEG_ERP/eeg-skill/SKILL.md +197 -0
  37. package/skills/05_EEG_ERP/meg-skill/SKILL.md +188 -0
  38. package/skills/05_EEG_ERP/meg-skill/scripts/time_frequency.py +223 -0
  39. package/skills/05_EEG_ERP/mne-eeg-tool/SKILL.md +165 -0
  40. package/skills/05_EEG_ERP/mne-eeg-tool/scripts/eeg_pipeline_reference.py +231 -0
  41. package/skills/05_EEG_ERP/seed-iv-skill/SKILL.md +184 -0
  42. package/skills/05_EEG_ERP/seed-iv-skill/scripts/classify_seed_iv.py +154 -0
  43. package/skills/05_EEG_ERP/seed-iv-skill/scripts/extract_seed_iv_features.py +190 -0
  44. package/skills/05_EEG_ERP/seed-iv-skill/scripts/validate_seed_iv.py +102 -0
  45. package/skills/05_EEG_ERP/seed-vig-skill/SKILL.md +182 -0
  46. package/skills/05_EEG_ERP/seed-vig-skill/scripts/classify_seed_vig.py +165 -0
  47. package/skills/05_EEG_ERP/seed-vig-skill/scripts/extract_seed_vig_features.py +185 -0
  48. package/skills/05_EEG_ERP/seed-vig-skill/scripts/validate_seed_vig.py +88 -0
  49. package/skills/06_fMRI_Neuroimaging/abcd-skill/SKILL.md +308 -0
  50. package/skills/06_fMRI_Neuroimaging/abcd-skill/scripts/abcd_qc_summary.py +449 -0
  51. package/skills/06_fMRI_Neuroimaging/abcd-skill/scripts/extract_abcd_phenotype.py +292 -0
  52. package/skills/06_fMRI_Neuroimaging/abcd-skill/scripts/reorganize_abcd.py +387 -0
  53. package/skills/06_fMRI_Neuroimaging/abide-skill/SKILL.md +302 -0
  54. package/skills/06_fMRI_Neuroimaging/abide-skill/scripts/abide_qc_summary.py +317 -0
  55. package/skills/06_fMRI_Neuroimaging/abide-skill/scripts/extract_abide_phenotype.py +267 -0
  56. package/skills/06_fMRI_Neuroimaging/abide-skill/scripts/reorganize_abide.py +387 -0
  57. package/skills/06_fMRI_Neuroimaging/adhd200-skill/SKILL.md +244 -0
  58. package/skills/06_fMRI_Neuroimaging/adhd200-skill/scripts/adhd200_qc_summary.py +98 -0
  59. package/skills/06_fMRI_Neuroimaging/adhd200-skill/scripts/extract_adhd200_phenotype.py +134 -0
  60. package/skills/06_fMRI_Neuroimaging/adhd200-skill/scripts/reorganize_adhd200.py +206 -0
  61. package/skills/06_fMRI_Neuroimaging/adni-skill/SKILL.md +358 -0
  62. package/skills/06_fMRI_Neuroimaging/adni-skill/scripts/generate_adni_task_files.py +1305 -0
  63. package/skills/06_fMRI_Neuroimaging/adni-skill/scripts/generate_vqa_from_tasks.py +766 -0
  64. package/skills/06_fMRI_Neuroimaging/adni-skill/scripts/reorganize_adni.py +491 -0
  65. package/skills/06_fMRI_Neuroimaging/aibl-skill/SKILL.md +295 -0
  66. package/skills/06_fMRI_Neuroimaging/aibl-skill/scripts/aibl_qc_summary.py +260 -0
  67. package/skills/06_fMRI_Neuroimaging/aibl-skill/scripts/extract_aibl_phenotype.py +365 -0
  68. package/skills/06_fMRI_Neuroimaging/aibl-skill/scripts/reorganize_aibl.py +394 -0
  69. package/skills/06_fMRI_Neuroimaging/aomic-skill/SKILL.md +292 -0
  70. package/skills/06_fMRI_Neuroimaging/aomic-skill/scripts/aomic_qc_summary.py +258 -0
  71. package/skills/06_fMRI_Neuroimaging/aomic-skill/scripts/extract_aomic_phenotype.py +284 -0
  72. package/skills/06_fMRI_Neuroimaging/aomic-skill/scripts/reorganize_aomic.py +322 -0
  73. package/skills/06_fMRI_Neuroimaging/asl-skill/SKILL.md +168 -0
  74. package/skills/06_fMRI_Neuroimaging/asl-skill/scripts/compute_cbf.py +224 -0
  75. package/skills/06_fMRI_Neuroimaging/bids-organizer/SKILL.md +241 -0
  76. package/skills/06_fMRI_Neuroimaging/bold5000-skill/SKILL.md +186 -0
  77. package/skills/06_fMRI_Neuroimaging/bold5000-skill/scripts/bold5000_qc_summary.py +96 -0
  78. package/skills/06_fMRI_Neuroimaging/bold5000-skill/scripts/extract_bold5000_stimulus.py +125 -0
  79. package/skills/06_fMRI_Neuroimaging/bold5000-skill/scripts/reorganize_bold5000.py +102 -0
  80. package/skills/06_fMRI_Neuroimaging/camcan-skill/SKILL.md +213 -0
  81. package/skills/06_fMRI_Neuroimaging/camcan-skill/scripts/camcan_qc_summary.py +131 -0
  82. package/skills/06_fMRI_Neuroimaging/camcan-skill/scripts/extract_camcan_phenotype.py +145 -0
  83. package/skills/06_fMRI_Neuroimaging/camcan-skill/scripts/validate_camcan.py +141 -0
  84. package/skills/06_fMRI_Neuroimaging/cobre-skill/SKILL.md +201 -0
  85. package/skills/06_fMRI_Neuroimaging/cobre-skill/scripts/cobre_qc_summary.py +95 -0
  86. package/skills/06_fMRI_Neuroimaging/cobre-skill/scripts/extract_cobre_phenotype.py +104 -0
  87. package/skills/06_fMRI_Neuroimaging/cobre-skill/scripts/reorganize_cobre.py +140 -0
  88. package/skills/06_fMRI_Neuroimaging/conn-tool/SKILL.md +180 -0
  89. package/skills/06_fMRI_Neuroimaging/dcm2nii/SKILL.md +189 -0
  90. package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/SKILL.md +183 -0
  91. package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/scripts/dmt_har_med_qc_summary.py +96 -0
  92. package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/scripts/extract_dmt_har_med_phenotype.py +121 -0
  93. package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/scripts/reorganize_dmt_har_med.py +125 -0
  94. package/skills/06_fMRI_Neuroimaging/dwi-skill/SKILL.md +359 -0
  95. package/skills/06_fMRI_Neuroimaging/fmri-skill/SKILL.md +371 -0
  96. package/skills/06_fMRI_Neuroimaging/fmriprep-tool/SKILL.md +228 -0
  97. package/skills/06_fMRI_Neuroimaging/freesurfer-tool/SKILL.md +286 -0
  98. package/skills/06_fMRI_Neuroimaging/freesurfer-tool/scripts/freesurfer_processor.py +145 -0
  99. package/skills/06_fMRI_Neuroimaging/fsl-tool/SKILL.md +208 -0
  100. package/skills/06_fMRI_Neuroimaging/hbn-skill/SKILL.md +271 -0
  101. package/skills/06_fMRI_Neuroimaging/hbn-skill/scripts/extract_hbn_phenotype.py +107 -0
  102. package/skills/06_fMRI_Neuroimaging/hbn-skill/scripts/hbn_qc_summary.py +96 -0
  103. package/skills/06_fMRI_Neuroimaging/hbn-skill/scripts/reorganize_hbn.py +150 -0
  104. package/skills/06_fMRI_Neuroimaging/hcpa-skill/SKILL.md +210 -0
  105. package/skills/06_fMRI_Neuroimaging/hcpa-skill/scripts/extract_hcpa_phenotype.py +146 -0
  106. package/skills/06_fMRI_Neuroimaging/hcpa-skill/scripts/hcpa_qc_summary.py +120 -0
  107. package/skills/06_fMRI_Neuroimaging/hcpa-skill/scripts/reorganize_hcpa.py +155 -0
  108. package/skills/06_fMRI_Neuroimaging/hcpd-skill/SKILL.md +210 -0
  109. package/skills/06_fMRI_Neuroimaging/hcpd-skill/scripts/extract_hcpd_phenotype.py +148 -0
  110. package/skills/06_fMRI_Neuroimaging/hcpd-skill/scripts/hcpd_qc_summary.py +125 -0
  111. package/skills/06_fMRI_Neuroimaging/hcpd-skill/scripts/reorganize_hcpd.py +146 -0
  112. package/skills/06_fMRI_Neuroimaging/hcpep-skill/SKILL.md +215 -0
  113. package/skills/06_fMRI_Neuroimaging/hcpep-skill/scripts/extract_hcpep_phenotype.py +157 -0
  114. package/skills/06_fMRI_Neuroimaging/hcpep-skill/scripts/hcpep_qc_summary.py +143 -0
  115. package/skills/06_fMRI_Neuroimaging/hcpep-skill/scripts/reorganize_hcpep.py +146 -0
  116. package/skills/06_fMRI_Neuroimaging/hcppipeline-tool/SKILL.md +217 -0
  117. package/skills/06_fMRI_Neuroimaging/hcpya-skill/SKILL.md +214 -0
  118. package/skills/06_fMRI_Neuroimaging/hcpya-skill/scripts/extract_hcpya_phenotype.py +190 -0
  119. package/skills/06_fMRI_Neuroimaging/hcpya-skill/scripts/hcpya_qc_summary.py +152 -0
  120. package/skills/06_fMRI_Neuroimaging/hcpya-skill/scripts/reorganize_hcpya.py +203 -0
  121. package/skills/06_fMRI_Neuroimaging/ixi-skill/SKILL.md +198 -0
  122. package/skills/06_fMRI_Neuroimaging/ixi-skill/scripts/ixi_qc_summary.py +137 -0
  123. package/skills/06_fMRI_Neuroimaging/ixi-skill/scripts/reorganize_ixi.py +190 -0
  124. package/skills/06_fMRI_Neuroimaging/mnd-skill/SKILL.md +191 -0
  125. package/skills/06_fMRI_Neuroimaging/mnd-skill/scripts/extract_mnd_phenotype.py +143 -0
  126. package/skills/06_fMRI_Neuroimaging/mnd-skill/scripts/mnd_qc_summary.py +120 -0
  127. package/skills/06_fMRI_Neuroimaging/mnd-skill/scripts/validate_mnd.py +107 -0
  128. package/skills/06_fMRI_Neuroimaging/mschallenge-skill/SKILL.md +203 -0
  129. package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/analyze_lesions.py +119 -0
  130. package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/longitudinal_lesion.py +148 -0
  131. package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/mschallenge_qc_summary.py +132 -0
  132. package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/validate_mschallenge.py +116 -0
  133. package/skills/06_fMRI_Neuroimaging/nibabel-skill/SKILL.md +184 -0
  134. package/skills/06_fMRI_Neuroimaging/nibabel-skill/scripts/atlas_coordinate_reference.py +61 -0
  135. package/skills/06_fMRI_Neuroimaging/nibabel-skill/scripts/freesurfer_io_reference.py +34 -0
  136. package/skills/06_fMRI_Neuroimaging/nibabel-skill/scripts/nifti_inspection_reference.py +35 -0
  137. package/skills/06_fMRI_Neuroimaging/nifd-skill/SKILL.md +205 -0
  138. package/skills/06_fMRI_Neuroimaging/nifd-skill/scripts/extract_nifd_phenotype.py +132 -0
  139. package/skills/06_fMRI_Neuroimaging/nifd-skill/scripts/nifd_qc_summary.py +111 -0
  140. package/skills/06_fMRI_Neuroimaging/nifd-skill/scripts/validate_nifd.py +111 -0
  141. package/skills/06_fMRI_Neuroimaging/nii2dcm/SKILL.md +143 -0
  142. package/skills/06_fMRI_Neuroimaging/nilearn-tool/SKILL.md +266 -0
  143. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/connectome_reference.py +65 -0
  144. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/denoise_timeseries_reference.py +58 -0
  145. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/hierarchical_parcellation_reference.py +53 -0
  146. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/kmeans_parcellation_reference.py +53 -0
  147. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/preprocess_bold_reference.py +76 -0
  148. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/rest_dictlearning_reference.py +56 -0
  149. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/rest_ica_reference.py +59 -0
  150. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/second_level_glm_reference.py +58 -0
  151. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/spacenet_classifier_reference.py +59 -0
  152. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/svm_classifier_reference.py +60 -0
  153. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/task_glm_reference.py +63 -0
  154. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/zalff_summary_reference.py +109 -0
  155. package/skills/06_fMRI_Neuroimaging/nsd-skill/SKILL.md +210 -0
  156. package/skills/06_fMRI_Neuroimaging/nsd-skill/scripts/extract_nsd_stimulus.py +171 -0
  157. package/skills/06_fMRI_Neuroimaging/nsd-skill/scripts/nsd_qc_summary.py +142 -0
  158. package/skills/06_fMRI_Neuroimaging/nsd-skill/scripts/validate_nsd.py +142 -0
  159. package/skills/06_fMRI_Neuroimaging/oasis-skill/SKILL.md +205 -0
  160. package/skills/06_fMRI_Neuroimaging/oasis-skill/scripts/extract_oasis_phenotype.py +126 -0
  161. package/skills/06_fMRI_Neuroimaging/oasis-skill/scripts/oasis_qc_summary.py +115 -0
  162. package/skills/06_fMRI_Neuroimaging/oasis-skill/scripts/validate_oasis.py +119 -0
  163. package/skills/06_fMRI_Neuroimaging/pet-skill/SKILL.md +173 -0
  164. package/skills/06_fMRI_Neuroimaging/pet-skill/scripts/compute_suvr.py +202 -0
  165. package/skills/06_fMRI_Neuroimaging/pnc-skill/SKILL.md +206 -0
  166. package/skills/06_fMRI_Neuroimaging/pnc-skill/scripts/extract_pnc_phenotype.py +136 -0
  167. package/skills/06_fMRI_Neuroimaging/pnc-skill/scripts/pnc_qc_summary.py +116 -0
  168. package/skills/06_fMRI_Neuroimaging/pnc-skill/scripts/validate_pnc.py +120 -0
  169. package/skills/06_fMRI_Neuroimaging/ppmi-skill/SKILL.md +209 -0
  170. package/skills/06_fMRI_Neuroimaging/ppmi-skill/scripts/extract_ppmi_phenotype.py +138 -0
  171. package/skills/06_fMRI_Neuroimaging/ppmi-skill/scripts/ppmi_qc_summary.py +111 -0
  172. package/skills/06_fMRI_Neuroimaging/ppmi-skill/scripts/validate_ppmi.py +117 -0
  173. package/skills/06_fMRI_Neuroimaging/qsiprep-tool/SKILL.md +320 -0
  174. package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/SKILL.md +215 -0
  175. package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/extract_rest_mdd_phenotype.py +132 -0
  176. package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/harmonize_sites.py +152 -0
  177. package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/rest_mdd_qc_summary.py +124 -0
  178. package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/validate_rest_mdd.py +103 -0
  179. package/skills/06_fMRI_Neuroimaging/smri-skill/SKILL.md +302 -0
  180. package/skills/06_fMRI_Neuroimaging/tcp-skill/SKILL.md +204 -0
  181. package/skills/06_fMRI_Neuroimaging/tcp-skill/scripts/extract_tcp_phenotype.py +139 -0
  182. package/skills/06_fMRI_Neuroimaging/tcp-skill/scripts/tcp_qc_summary.py +111 -0
  183. package/skills/06_fMRI_Neuroimaging/tcp-skill/scripts/validate_tcp.py +99 -0
  184. package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/SKILL.md +217 -0
  185. package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/scripts/extract_ucla_cnp_phenotype.py +145 -0
  186. package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/scripts/ucla_cnp_qc_summary.py +111 -0
  187. package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/scripts/validate_ucla_cnp.py +113 -0
  188. package/skills/06_fMRI_Neuroimaging/ukb-skill/SKILL.md +310 -0
  189. package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/build_ukb_survival.py +210 -0
  190. package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/extract_ukb_cases.py +308 -0
  191. package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/extract_ukb_phenotype.py +232 -0
  192. package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/ukb_qc_summary.py +158 -0
  193. package/skills/06_fMRI_Neuroimaging/wmh-segmentation/SKILL.md +133 -0
  194. package/skills/07_Computational_Modeling/detrending/SKILL.md +118 -0
  195. package/skills/07_Computational_Modeling/dictlearning/SKILL.md +122 -0
  196. package/skills/07_Computational_Modeling/filtering/SKILL.md +121 -0
  197. package/skills/07_Computational_Modeling/glm/SKILL.md +153 -0
  198. package/skills/07_Computational_Modeling/hierarchical/SKILL.md +121 -0
  199. package/skills/07_Computational_Modeling/ica/SKILL.md +122 -0
  200. package/skills/07_Computational_Modeling/kmeans/SKILL.md +119 -0
  201. package/skills/07_Computational_Modeling/run_models/SKILL.md +427 -0
  202. package/skills/07_Computational_Modeling/spacenet/SKILL.md +122 -0
  203. package/skills/07_Computational_Modeling/svm/SKILL.md +120 -0
  204. package/skills/08_Computational_Neuroscience/brain_gnn/SKILL.md +183 -0
  205. package/skills/08_Computational_Neuroscience/dipy-tool/SKILL.md +239 -0
  206. package/skills/08_Computational_Neuroscience/dipy-tool/scripts/dti_metrics_reference.py +70 -0
  207. package/skills/08_Computational_Neuroscience/dipy-tool/scripts/load_and_mask_reference.py +76 -0
  208. package/skills/08_Computational_Neuroscience/dipy-tool/scripts/roi_stats_reference.py +59 -0
  209. package/skills/08_Computational_Neuroscience/fm_app/SKILL.md +195 -0
  210. package/skills/08_Computational_Neuroscience/neurostorm/SKILL.md +151 -0
  211. package/skills/13_Visualization/brain-visualization/SKILL.md +191 -0
  212. package/skills/13_Visualization/brain-visualization/scripts/connectome_reference.py +108 -0
  213. package/skills/13_Visualization/brain-visualization/scripts/freesurfer_ply_reference.py +54 -0
  214. package/skills/13_Visualization/brain-visualization/scripts/zalff_summary_reference.py +116 -0
  215. package/skills/13_Visualization/ethoclaw-paper-figure-layout/SKILL.md +78 -0
  216. package/skills/13_Visualization/ethoclaw-paper-figure-layout/assets/naturecomm_figures.tex +74 -0
  217. package/skills/13_Visualization/ethoclaw-paper-figure-layout/scripts/layout_results_foldered.py +579 -0
  218. package/skills/14_Writing/overleaf-skill/SKILL.md +184 -0
  219. package/skills/14_Writing/overleaf-skill/scripts/install.sh +30 -0
  220. package/skills/14_Writing/paper-writing/SKILL.md +146 -0
  221. package/skills/14_Writing/paper-writing/scripts/data_statement_templates.py +164 -0
  222. package/skills/14_Writing/paper-writing/scripts/figure_templates.py +315 -0
  223. package/skills/14_Writing/paper-writing/scripts/nature_figure_style.py +214 -0
  224. package/skills/14_Writing/paper-writing/scripts/section_phrasebank.py +246 -0
  225. package/skills/16_Animal_Behavior/deeplabcut/SKILL.md +154 -0
  226. package/skills/16_Animal_Behavior/deeplabcut/references/3d-pose.md +89 -0
  227. package/skills/16_Animal_Behavior/deeplabcut/references/maDLC.md +123 -0
  228. package/skills/16_Animal_Behavior/deeplabcut/references/modelzoo.md +98 -0
  229. package/skills/16_Animal_Behavior/deeplabcut/references/standard-pipeline.md +165 -0
  230. package/skills/16_Animal_Behavior/deeplabcut/references/utilities.md +146 -0
  231. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/SKILL.md +274 -0
  232. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/report_template_en.html +112 -0
  233. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/report_template_en.md +21 -0
  234. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/cluster-section.md +5 -0
  235. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/heatmap-section.md +5 -0
  236. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/integrated-interpretation.md +3 -0
  237. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/overview.md +3 -0
  238. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/project-summary.md +3 -0
  239. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/radar-section.md +5 -0
  240. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/raw-trajectory.md +3 -0
  241. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/sample-check.md +3 -0
  242. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/single-subject-section.md +3 -0
  243. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/stats-section.md +5 -0
  244. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/epm.md +52 -0
  245. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/fst.md +37 -0
  246. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/nor.md +39 -0
  247. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/oft.md +43 -0
  248. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/tcst.md +45 -0
  249. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/tst.md +36 -0
  250. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/input-types.md +59 -0
  251. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/interpretation-guardrails.md +45 -0
  252. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/metadata-schema.md +57 -0
  253. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/report-sections.md +86 -0
  254. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/section-selection-rules.md +169 -0
  255. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/scripts/build_report_manifest.py +27 -0
  256. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/scripts/render_report.py +34 -0
  257. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/scripts/report_utils.py +1121 -0
  258. package/skills/16_Animal_Behavior/ethoclaw-animal-grounding/SKILL.md +390 -0
  259. package/skills/16_Animal_Behavior/ethoclaw-animal-grounding/reference_code.py +98 -0
  260. package/skills/16_Animal_Behavior/ethoclaw-animal-pose-estimation/SKILL.md +336 -0
  261. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/README.md +21 -0
  262. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/SKILL.md +41 -0
  263. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/batch_kinematic_generator.py +663 -0
  264. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/config.json +19 -0
  265. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/generate_kinematic_parameter.py +401 -0
  266. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/kinematic_generator.py +265 -0
  267. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/SKILL.md +72 -0
  268. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/references/config.example.toml +56 -0
  269. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/scripts/cluster_all_params.py +232 -0
  270. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/scripts/cluster_all_params_from_config.py +236 -0
  271. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-radar-generate/SKILL.md +68 -0
  272. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-radar-generate/references/notes.md +5 -0
  273. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-radar-generate/scripts/plot_h5_radar.py +513 -0
  274. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/SKILL.md +52 -0
  275. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/config.toml +81 -0
  276. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/references/stats-rule.md +18 -0
  277. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/scripts/h5_inspect.py +79 -0
  278. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/scripts/h5_violin_batch.py +624 -0
  279. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/scripts/h5_violin_stats.py +438 -0
  280. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/SKILL.md +280 -0
  281. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/core_scripts/heatmap_trajectory.py +790 -0
  282. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/core_scripts/heatmap_velocity.py +855 -0
  283. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/reference_data/reference_2d.csv +101 -0
  284. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/reference_data/reference_2d.h5 +0 -0
  285. 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())