@brainpilot/skills 0.0.6 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,188 @@
1
+ ---
2
+ name: meg-skill
3
+ description: "Use this skill whenever the user wants to process MEG (magnetoencephalography) data including source localization, time-frequency analysis, connectivity analysis, sensor-level preprocessing, or MEG-specific feature extraction. Triggers include: 'MEG', 'MEG processing', 'MEG source localization', 'MEG connectivity', 'magnetoencephalography', 'beamformer', 'time-frequency', 'MEG preprocessing', or any request involving MEG data files (.fif, .con, .ds)."
4
+ license: MIT License (NeuroClaw custom skill – freely modifiable within the project)
5
+ layer: subagent
6
+ skill_type: modality
7
+ dependencies:
8
+ - claw-shell
9
+ complementary_skills:
10
+ - eeg-skill
11
+ - smri-skill
12
+ - brain-visualization
13
+ ---
14
+ # MEG Skill (Modality Layer)
15
+
16
+ ## Overview
17
+
18
+ `meg-skill` is the NeuroClaw **modality-layer** interface skill responsible for all MEG (magnetoencephalography) data processing tasks.
19
+
20
+ It strictly follows the NeuroClaw hierarchical design principles:
21
+ - This skill **only describes WHAT needs to be done** and **which tool skill to delegate to**.
22
+ - It contains **no implementation code or concrete commands**.
23
+ - All concrete execution is delegated to MNE-Python (via `claw-shell`) and companion scripts.
24
+ - Companion scripts in `scripts/` provide reference implementations for time-frequency analysis and source localization.
25
+
26
+ **Core workflow (never bypassed):**
27
+ 1. Identify input MEG data format (.fif Elekta/Neuromag, .ds CTF, .con KIT/Yokogawa).
28
+ 2. Ensure T1w structural MRI is available for source localization (via `smri-skill` if not yet processed).
29
+ 3. Generate a **numbered execution plan** clearly stating WHAT needs to be done.
30
+ 4. Present the full plan, estimated runtime, resource requirements, and risks to the user and wait for explicit confirmation ("YES" / "execute" / "proceed").
31
+ 5. On confirmation, delegate every step via `claw-shell`.
32
+ 6. After execution, save all outputs in a clean directory structure (`meg_output/`).
33
+
34
+ **Research use only.**
35
+
36
+ ---
37
+
38
+ ## Quick Reference (Common MEG Tasks)
39
+
40
+ | Task | What needs to be done | Implementation via | Expected output |
41
+ |---|---|---|---|
42
+ | Load & validation | Read raw MEG, check channel types, info metadata | MNE-Python (`mne.io`) | Raw object + validation report |
43
+ | Maxwell filtering | Signal-space separation (SSS) for Elekta systems | MNE-Python (`mne.preprocessing.maxwell_filter`) | Cleaned raw MEG |
44
+ | Filtering | Band-pass, notch (line noise removal at 50/60 Hz) | MNE-Python (`raw.filter`, `raw.notch_filter`) | Filtered raw data |
45
+ | Epoching | Segment continuous data around events | MNE-Python (`mne.Epochs`) | Epoched data |
46
+ | ICA artifact removal | Remove cardiac, ocular, environmental artifacts | MNE-Python (`mne.preprocessing.ICA`) | Cleaned epochs |
47
+ | Time-frequency analysis | Morlet wavelet multitaper, Hilbert transform | `scripts/time_frequency.py` | TFR maps (power, ITC) |
48
+ | Source localization | Forward/inverse modeling (MNE, dSPM, beamformer) | MNE-Python + FreeSurfer | Source estimates in brain space |
49
+ | Source-space connectivity | Coherence, PLV, dPLI between source parcels | MNE-Python (`mne_connectivity`) | Connectivity matrices |
50
+ | Sensor-level connectivity | Coherence, PLV between sensor pairs | MNE-Python | Sensor connectivity |
51
+ | Evoked responses | Average epochs, compute ERPs/ERFs | MNE-Python (`epochs.average`) | Evoked NIfTI/fif files |
52
+
53
+ ---
54
+
55
+ ## Supported MEG File Formats
56
+
57
+ | Format | System | Extension | Reader |
58
+ |---|---|---|---|
59
+ | Elekta/Neuromag | VectorView, TRIUX | `.fif` | `mne.io.read_raw_fif` |
60
+ | CTF | CTF MEG systems | `.ds` | `mne.io.read_raw_ctf` |
61
+ | KIT/Yokogawa | KIT, Ricoh | `.con`, `.mrk` | `mne.io.read_raw_kit` |
62
+ | BIDS MEG | Any (BIDS format) | `.meg.fif` | `mne.io.read_raw_fif` |
63
+
64
+ ---
65
+
66
+ ## Core Processing Pipeline
67
+
68
+ ### Stage 1: Data Loading & Validation
69
+ - Load raw MEG data and validate channel types (magnetometers, gradiometers, EEG, EOG, ECG, STIM)
70
+ - Check sampling rate, duration, and channel count
71
+ - Report bad channels if annotated
72
+
73
+ ### Stage 2: Preprocessing
74
+ - **Maxwell filtering** (SSS/tSSS): for Elekta systems, remove environmental noise
75
+ - **Band-pass filtering**: typically 1–100 Hz for sensor-level analysis
76
+ - **Notch filter**: remove power line noise (50 Hz or 60 Hz)
77
+ - **Downsampling**: optional, to reduce computation (e.g., 1000 Hz → 250 Hz)
78
+
79
+ ### Stage 3: Artifact Removal (ICA)
80
+ - Run ICA (FastICA, Infomax, or Picard)
81
+ - Auto-detect and remove cardiac (ECG), ocular (EOG), and muscle artifacts
82
+ - Correlate ICA components with ECG/EOG channels
83
+
84
+ ### Stage 4: Epoching & Averaging
85
+ - Segment around events of interest
86
+ - Baseline correction
87
+ - Reject bad epochs (amplitude threshold, autoreject)
88
+ - Compute evoked responses (ERFs)
89
+
90
+ ### Stage 5: Time-Frequency Analysis (via `scripts/time_frequency.py`)
91
+ - Morlet wavelet or multitaper spectral analysis
92
+ - Compute power spectral density per frequency band (δ/θ/α/β/γ)
93
+ - Inter-trial coherence (ITC)
94
+
95
+ ### Stage 6 (Optional): Source Localization
96
+ - Requires T1w MRI from `smri-skill` and FreeSurfer cortical reconstruction
97
+ - Compute forward model (BEM or sphere)
98
+ - Apply inverse solution (MNE, dSPM, sLORETA, or LCMV beamformer)
99
+ - Output source estimates on cortical surface
100
+
101
+ ---
102
+
103
+ ## Scripts
104
+
105
+ ### `scripts/time_frequency.py`
106
+ Computes time-frequency representations from MEG epochs.
107
+
108
+ ```bash
109
+ python skills/meg-skill/scripts/time_frequency.py \
110
+ --epochs /path/to/epochs.fif \
111
+ --output /path/to/meg_output/tfr/ \
112
+ --freq-min 1 --freq-max 100 --freq-steps 40 \
113
+ --method morlet \
114
+ --baseline -0.2 0.0
115
+ ```
116
+
117
+ ---
118
+
119
+ ## Standard Output Layout
120
+
121
+ ```
122
+ meg_output/
123
+ ├── preprocessed/ # Filtered, cleaned raw MEG
124
+ ├── epochs/ # Epoched data (.fif)
125
+ ├── evoked/ # Averaged evoked responses (.fif, .nii.gz)
126
+ ├── tfr/ # Time-frequency results
127
+ │ ├── power_*.nii.gz
128
+ │ └── itc_*.nii.gz
129
+ ├── source/ # Source estimates (if source localization run)
130
+ │ ├── stc_*.lh.stc
131
+ │ └── stc_*.rh.stc
132
+ ├── connectivity/ # Connectivity matrices (if requested)
133
+ ├── qc/ # Quality control reports
134
+ └── logs/
135
+ ```
136
+
137
+ ---
138
+
139
+ ## Installation (Handled by dependency-planner)
140
+
141
+ No manual installation required at this layer.
142
+ When first used, `meg-skill` automatically calls `dependency-planner` to install MNE-Python and dependencies via conda.
143
+
144
+ ---
145
+
146
+ ## Important Notes & Limitations
147
+
148
+ - MEG data is large (hundreds of MB to GB per recording); ensure sufficient disk space.
149
+ - Maxwell filtering (SSS) is specific to Elekta/Neuromag systems; CTF and KIT systems use different approaches.
150
+ - Source localization requires co-registered T1w MRI and MEG sensor positions (head position indicator coils or digitized head shape).
151
+ - MNE-Python is the primary backend; all MEG processing is built on MNE.
152
+ - MEG has millisecond temporal resolution but lower spatial resolution than fMRI.
153
+ - BIDS-MEG format follows the BIDS extension for MEG: https://bids-specification.readthedocs.io/en/stable/04-modality-specific-files/02-magnetoencephalography.html
154
+ - This skill is for research workflows; not for clinical decision-making.
155
+
156
+ ---
157
+
158
+ ## When to Call This Skill
159
+
160
+ - When the user provides MEG data (.fif, .ds, .con) and requests preprocessing, artifact removal, or analysis.
161
+ - When time-frequency analysis or source localization is needed for MEG data.
162
+ - When MEG connectivity analysis (sensor-level or source-level) is requested.
163
+ - When `eeg-skill` handles EEG but the data also includes MEG channels.
164
+ - When dataset skills (e.g., `Cam-CAN`) delegate MEG processing.
165
+
166
+ ---
167
+
168
+ ## Complementary / Related Skills
169
+
170
+ - `eeg-skill` → EEG processing (MEG and EEG share many MNE-Python tools)
171
+ - `smri-skill` → T1w structural preprocessing (required for source localization)
172
+ - `freesurfer-tool` → cortical reconstruction for source-space analysis
173
+ - `nibabel-skill` → NIfTI I/O for surface/volume data
174
+ - `brain-visualization` → MEG source overlay visualization
175
+ - `nilearn-tool` → post-hoc statistical analysis on source estimates
176
+
177
+ ---
178
+
179
+ ## Reference
180
+ - MNE-Python: https://mne.tools/
181
+ - Gramfort et al. (2013): MEG and EEG data analysis with MNE-Python
182
+ - Taulu & Simola (2006): Spatiotemporal signal space separation (SSS)
183
+ - BIDS MEG: https://bids-specification.readthedocs.io/en/stable/04-modality-specific-files/02-magnetoencephalography.html
184
+ - Cam-CAN dataset: https://www.cam-can.org/
185
+
186
+ Created At: 2026-05-06 12:19 HKT
187
+ Last Updated At: 2026-05-06 12:19 HKT
188
+ Author: chengwang96
@@ -0,0 +1,223 @@
1
+ #!/usr/bin/env python3
2
+ """Compute time-frequency representations from MEG/EEG epochs.
3
+
4
+ Uses MNE-Python for Morlet wavelet or multitaper spectral analysis.
5
+ Outputs power and inter-trial coherence (ITC) maps.
6
+ """
7
+ import argparse
8
+ import sys
9
+ from pathlib import Path
10
+
11
+ try:
12
+ import numpy as np
13
+ except ImportError:
14
+ print("Error: numpy is required.", file=sys.stderr)
15
+ sys.exit(1)
16
+
17
+ try:
18
+ import mne
19
+ except ImportError:
20
+ print("Error: mne is required. Install with: pip install mne", file=sys.stderr)
21
+ sys.exit(1)
22
+
23
+
24
+ def compute_tfr_morlet(
25
+ epochs: mne.Epochs,
26
+ freqs: np.ndarray,
27
+ n_cycles: float,
28
+ baseline: tuple = None,
29
+ return_itc: bool = True,
30
+ ) -> tuple:
31
+ """Compute time-frequency representation using Morlet wavelets.
32
+
33
+ Args:
34
+ epochs: MNE Epochs object.
35
+ freqs: Array of frequencies of interest.
36
+ n_cycles: Number of cycles in the Morlet wavelet.
37
+ baseline: Tuple (tmin, tmax) for baseline correction.
38
+ return_itc: Whether to compute inter-trial coherence.
39
+
40
+ Returns:
41
+ power: Average TFR power (EvokedArray).
42
+ itc: Inter-trial coherence (EvokedArray) or None.
43
+ """
44
+ # Compute TFR for each epoch
45
+ tfr = epochs.compute_tfr(
46
+ method="morlet",
47
+ freqs=freqs,
48
+ n_cycles=n_cycles,
49
+ return_itc=False,
50
+ average=False,
51
+ )
52
+
53
+ # Average power across epochs
54
+ power = tfr.copy().average()
55
+
56
+ # Apply baseline correction
57
+ if baseline is not None:
58
+ power.apply_baseline(baseline=baseline)
59
+
60
+ itc = None
61
+ if return_itc:
62
+ # ITC = |mean(exp(j * phase))| across epochs
63
+ data = tfr.data # (n_epochs, n_channels, n_freqs, n_times)
64
+ itc_data = np.abs(np.mean(np.exp(1j * np.angle(data)), axis=0))
65
+ itc = power.copy()
66
+ itc.data = itc_data
67
+
68
+ return power, itc
69
+
70
+
71
+ def compute_tfr_multitaper(
72
+ epochs: mne.Epochs,
73
+ freqs: np.ndarray,
74
+ bandwidth: float,
75
+ baseline: tuple = None,
76
+ ) -> "mne.time_frequency.AverageTFR":
77
+ """Compute time-frequency representation using multitaper method.
78
+
79
+ Args:
80
+ epochs: MNE Epochs object.
81
+ freqs: Array of frequencies of interest.
82
+ bandwidth: Frequency bandwidth of the multitaper windows.
83
+ baseline: Tuple (tmin, tmax) for baseline correction.
84
+
85
+ Returns:
86
+ power: Average TFR power.
87
+ """
88
+ tfr = epochs.compute_tfr(
89
+ method="multitaper",
90
+ freqs=freqs,
91
+ bandwidth=bandwidth,
92
+ return_itc=False,
93
+ average=False,
94
+ )
95
+
96
+ power = tfr.copy().average()
97
+
98
+ if baseline is not None:
99
+ power.apply_baseline(baseline=baseline)
100
+
101
+ return power
102
+
103
+
104
+ def main() -> int:
105
+ parser = argparse.ArgumentParser(
106
+ description="Compute time-frequency representations from MEG/EEG epochs."
107
+ )
108
+ parser.add_argument("--epochs", required=True, help="Path to epochs .fif file")
109
+ parser.add_argument("--output", required=True, help="Output directory for TFR results")
110
+ parser.add_argument("--method", default="morlet", choices=["morlet", "multitaper"],
111
+ help="TFR method (default: morlet)")
112
+ parser.add_argument("--freq-min", type=float, default=1.0, help="Minimum frequency in Hz (default: 1)")
113
+ parser.add_argument("--freq-max", type=float, default=100.0, help="Maximum frequency in Hz (default: 100)")
114
+ parser.add_argument("--freq-steps", type=int, default=40, help="Number of frequency steps (default: 40)")
115
+ parser.add_argument("--n-cycles", type=float, default=7.0, help="Number of Morlet wavelet cycles (default: 7)")
116
+ parser.add_argument("--bandwidth", type=float, default=4.0, help="Multitaper bandwidth in Hz (default: 4)")
117
+ parser.add_argument("--baseline", nargs=2, type=float, metavar=("TMIN", "TMAX"),
118
+ help="Baseline correction window in seconds (e.g., -0.2 0.0)")
119
+ parser.add_argument("--channels", help="Comma-separated channel names to include (default: all MEG channels)")
120
+ parser.add_argument("--picks", default="meg", help="Channel types to include: meg, eeg, mag, grad (default: meg)")
121
+ parser.add_argument("--no-itc", action="store_true", help="Skip ITC computation")
122
+ parser.add_argument("--format", default="nifti", choices=["nifti", "numpy", "fif"],
123
+ help="Output format (default: nifti)")
124
+ args = parser.parse_args()
125
+
126
+ epochs_path = Path(args.epochs).resolve()
127
+ if not epochs_path.exists():
128
+ print(f"Epochs file not found: {epochs_path}", file=sys.stderr)
129
+ return 1
130
+
131
+ # Load epochs
132
+ print(f"Loading epochs: {epochs_path}")
133
+ epochs = mne.read_epochs(str(epochs_path), preload=True)
134
+ print(f" {len(epochs)} epochs, {len(epochs.ch_names)} channels, {epochs.info['sfreq']} Hz")
135
+
136
+ # Select channels
137
+ if args.channels:
138
+ ch_names = [c.strip() for c in args.channels.split(",")]
139
+ epochs.pick(ch_names)
140
+ print(f" Selected channels: {ch_names}")
141
+ else:
142
+ epochs.pick(args.picks)
143
+
144
+ # Build frequency array
145
+ freqs = np.linspace(args.freq_min, args.freq_max, args.freq_steps)
146
+ print(f" Frequencies: {freqs[0]:.1f} - {freqs[-1]:.1f} Hz ({len(freqs)} steps)")
147
+
148
+ # Parse baseline
149
+ baseline = None
150
+ if args.baseline:
151
+ baseline = (args.baseline[0], args.baseline[1])
152
+ print(f" Baseline: [{baseline[0]}, {baseline[1]}] s")
153
+
154
+ # Compute TFR
155
+ output_dir = Path(args.output).resolve()
156
+ output_dir.mkdir(parents=True, exist_ok=True)
157
+
158
+ print(f"\nComputing TFR ({args.method})...")
159
+ if args.method == "morlet":
160
+ power, itc = compute_tfr_morlet(
161
+ epochs, freqs, n_cycles=args.n_cycles, baseline=baseline, return_itc=not args.no_itc,
162
+ )
163
+ else:
164
+ power = compute_tfr_multitaper(
165
+ epochs, freqs, bandwidth=args.bandwidth, baseline=baseline,
166
+ )
167
+ itc = None
168
+
169
+ # Save results
170
+ power_path = output_dir / "tfr_power"
171
+ if args.format == "fif":
172
+ power.save(str(power_path.with_suffix(".fif")), overwrite=True)
173
+ print(f" Power saved: {power_path.with_suffix('.fif')}")
174
+ elif args.format == "numpy":
175
+ np.save(str(power_path.with_suffix(".npy")), power.data)
176
+ print(f" Power saved: {power_path.with_suffix('.npy')} (shape: {power.data.shape})")
177
+ else:
178
+ # Save as NIfTI (convert 4D data: channels x freqs x times)
179
+ try:
180
+ import nibabel as nib
181
+ data = power.data # (n_channels, n_freqs, n_times)
182
+ # Create a 4D NIfTI with singleton spatial dimensions
183
+ nii_data = data.reshape(1, 1, data.shape[0], data.shape[1] * data.shape[2]) if data.ndim == 3 else data
184
+ affine = np.eye(4)
185
+ img = nib.Nifti1Image(nii_data, affine)
186
+ nii_path = power_path.with_suffix(".nii.gz")
187
+ nib.save(img, str(nii_path))
188
+ print(f" Power saved: {nii_path} (shape: {data.shape})")
189
+ except ImportError:
190
+ # Fallback to numpy
191
+ np.save(str(power_path.with_suffix(".npy")), power.data)
192
+ print(f" Power saved (numpy fallback): {power_path.with_suffix('.npy')}")
193
+
194
+ if itc is not None:
195
+ itc_path = output_dir / "tfr_itc"
196
+ if args.format == "fif":
197
+ itc.save(str(itc_path.with_suffix(".fif")), overwrite=True)
198
+ elif args.format == "numpy":
199
+ np.save(str(itc_path.with_suffix(".npy")), itc.data)
200
+ else:
201
+ try:
202
+ import nibabel as nib
203
+ data = itc.data
204
+ nii_data = data.reshape(1, 1, data.shape[0], data.shape[1] * data.shape[2]) if data.ndim == 3 else data
205
+ img = nib.Nifti1Image(nii_data, np.eye(4))
206
+ nib.save(img, str(itc_path.with_suffix(".nii.gz")))
207
+ except ImportError:
208
+ np.save(str(itc_path.with_suffix(".npy")), itc.data)
209
+ print(f" ITC saved: {itc_path}")
210
+
211
+ # Print summary
212
+ print(f"\nTFR Summary:")
213
+ print(f" Method: {args.method}")
214
+ print(f" Frequency range: {freqs[0]:.1f} - {freqs[-1]:.1f} Hz")
215
+ print(f" Time range: {power.times[0]:.3f} - {power.times[-1]:.3f} s")
216
+ print(f" Channels: {power.data.shape[0]}")
217
+ print(f" Power range: [{power.data.min():.2e}, {power.data.max():.2e}]")
218
+
219
+ return 0
220
+
221
+
222
+ if __name__ == "__main__":
223
+ sys.exit(main())
@@ -0,0 +1,165 @@
1
+ ---
2
+ name: mne-eeg-tool
3
+ description: "Use this skill whenever any NeuroClaw modality skill (especially eeg-skill) needs to execute concrete MNE-Python operations for EEG loading, preprocessing, filtering, artifact removal, epoching, frequency-band analysis, or feature extraction. This is the dedicated base/tool skill that contains all specific MNE-Python code and usage patterns."
4
+ license: MIT License (NeuroClaw custom skill – freely modifiable within the project)
5
+ layer: base
6
+ skill_type: tool
7
+ dependencies:
8
+ - claw-shell
9
+ ---
10
+ # MNE-EEG Tool (Base/Tool Layer)
11
+
12
+ ## Overview
13
+ `mne-eeg-tool` is the **NeuroClaw base/tool skill** that provides all concrete MNE-Python implementation for EEG processing.
14
+
15
+ It is **never called directly by the user**. It is exclusively delegated to by the modality-layer skill `eeg-skill` (and any future EEG-related modality skills).
16
+
17
+ This skill:
18
+ - Contains the complete, ready-to-run MNE-Python code (covers all standard preprocessing and feature extraction tasks).
19
+ - Handles environment setup verification.
20
+ - Provides a single, well-documented wrapper script (`eeg_pipeline.py`) that implements **all** common EEG tasks, including the newly added continuous-data branch, functional connectivity, ERP features, frontal alpha asymmetry, and microstate analysis.
21
+ - Routes every execution through `claw-shell` for safety and logging.
22
+
23
+ **Research use only** — outputs are for scientific analysis.
24
+
25
+ ## Agent Reference Rule
26
+
27
+ When the agent needs MNE-EEG implementation code, it should first consult the curated snippet in `skills/mne-eeg-tool/scripts/` instead of copying from the embedded wrapper below.
28
+
29
+ Reference snippet available:
30
+ - `scripts/eeg_pipeline_reference.py` -> full EEG pipeline: load, bad-channel detection, filtering, ICA, epoching, frequency bands, connectivity, ERP features, alpha asymmetry, microstates
31
+
32
+ Example:
33
+ ```bash
34
+ python skills/mne-eeg-tool/scripts/eeg_pipeline_reference.py \
35
+ --input path/to/data.set \
36
+ --resting \
37
+ --output-dir eeg_output/
38
+ ```
39
+
40
+ ## Quick Reference (Core Functions)
41
+
42
+ | Function | Purpose | New in this update? |
43
+ |---------------------------------------|-------------------------------------------------------------------------|---------------------|
44
+ | `load_eeg()` | Load .set / .edf / .bdf / .fif / BIDS + validation | — |
45
+ | `detect_and_interpolate_bad_channels()` | Auto-detect + interpolate noisy channels | **Yes** |
46
+ | `preprocess_filtering()` | Resample + high-pass + notch + bandpass | — |
47
+ | `remove_artifacts()` | ICA + AutoReject + EOG/ECG regression | **Yes** |
48
+ | `continuous_data_cleaning()` | Resting-state pipeline (no events) | **Yes** |
49
+ | `rereference_and_epoch()` | Average reference + epoching + baseline correction | — |
50
+ | `extract_frequency_bands()` | Split into δ/θ/α/β/γ bands + power matrices | — |
51
+ | `extract_features()` | Band power, CSP, Hjorth, sample entropy, etc. | — |
52
+ | `compute_connectivity()` | PLV, coherence, wPLI, imaginary coherence | **Yes** |
53
+ | `extract_erp_features()` | Peak amplitude, latency, area under curve | **Yes** |
54
+ | `compute_alpha_asymmetry()` | Frontal alpha asymmetry (emotion studies) | **Yes** |
55
+ | `run_microstate_analysis()` | EEG microstates (resting-state) | **Yes** |
56
+ | `full_eeg_pipeline()` | One-click end-to-end pipeline (any combination) | — |
57
+
58
+ ## Installation (Handled by dependency-planner)
59
+ This skill is automatically installed when `eeg-skill` is used:
60
+
61
+ ```bash
62
+ # Executed via dependency-planner + conda-env-manager
63
+ conda create -n neuroclaw-eeg python=3.11 -y
64
+ conda activate neuroclaw-eeg
65
+ conda install -c conda-forge mne pyentrp scikit-learn pandas numpy matplotlib -y
66
+ pip install mne[full] # optional: full extras
67
+ ```
68
+
69
+ ## NeuroClaw recommended wrapper script
70
+
71
+ The full EEG pipeline implementation is in `scripts/eeg_pipeline_reference.py` (see Agent Reference Rule above).
72
+
73
+ Example:
74
+ ```bash
75
+ python skills/mne-eeg-tool/scripts/eeg_pipeline_reference.py \
76
+ --input path/to/data.set \
77
+ --resting \
78
+ --output-dir eeg_output/
79
+ ```
80
+
81
+ Functions: `load_eeg`, `detect_and_interpolate_bad_channels`, `preprocess_filtering`, `remove_artifacts`, `continuous_data_cleaning`, `rereference_and_epoch`, `extract_frequency_bands`, `extract_features`, `compute_connectivity`, `extract_erp_features`, `compute_alpha_asymmetry`, `run_microstate_analysis`, `full_eeg_pipeline`.
82
+
83
+ ## Important Notes & Limitations
84
+ - Requires the `neuroclaw-eeg` conda environment (auto-created by `dependency-planner`).
85
+ - Long-running steps (ICA, connectivity, microstates) run safely in `claw` tmux session.
86
+ - Outputs are always written to `./eeg_output/` with clear subfolders.
87
+ - Fully extensible: new functions can be added to `eeg_pipeline.py` without touching `eeg-skill`.
88
+
89
+ ## Complementary / Related Skills
90
+ - `claw-shell` → executes this skill’s wrapper
91
+ - `dependency-planner` + `conda-env-manager` → creates `neuroclaw-eeg` environment
92
+
93
+ ## Reference
94
+ Official MNE-Python documentation (https://mne.tools) + MNE-Connectivity + mne-microstates.
95
+ Aligned with NeuroClaw base/tool skill pattern (freesurfer-tool, dcm2nii, etc.).
96
+
97
+ Curated reference snippet in this skill:
98
+ - `skills/mne-eeg-tool/scripts/eeg_pipeline_reference.py`
99
+
100
+ ## Post-Execution Verification (Harness Integration)
101
+
102
+ After MNE-EEG processing completes, this skill **automatically invokes harness-core's VerificationRunner** to validate output integrity:
103
+
104
+ **Integrated verification checks**:
105
+
106
+ ```python
107
+ from skills.harness_core import VerificationRunner, AuditLogger
108
+
109
+ verifier = VerificationRunner(task_type="eeg_processing")
110
+
111
+ # 1. EEG file loading success
112
+ verifier.add_check("eeg_loading",
113
+ checker=lambda: verify_eeg_loaded(output_dir),
114
+ severity="error"
115
+ )
116
+
117
+ # 2. Channel count and data shape
118
+ verifier.add_check("channel_integrity",
119
+ checker=lambda: verify_channel_count(output_dir),
120
+ severity="error"
121
+ )
122
+
123
+ # 3. Artifact removal success (ICA, AutoReject)
124
+ verifier.add_check("artifact_removal",
125
+ checker=lambda: verify_artifact_removal_rate(output_dir, min_rate=0.85),
126
+ severity="warning"
127
+ )
128
+
129
+ # 4. Frequency spectrum sanity (not all zeros, reasonable power)
130
+ verifier.add_check("frequency_spectrum",
131
+ checker=lambda: verify_frequency_spectrum(output_dir),
132
+ severity="warning"
133
+ )
134
+
135
+ # 5. Data range and NaN/Inf checks
136
+ verifier.add_check("data_integrity",
137
+ checker=lambda: verify_no_nan_inf(output_dir),
138
+ severity="error"
139
+ )
140
+
141
+ # 6. Connectivity/Features output shape
142
+ verifier.add_check("feature_extraction",
143
+ checker=lambda: verify_feature_dimensions(output_dir),
144
+ severity="warning"
145
+ )
146
+
147
+ report = verifier.run(output_dir)
148
+
149
+ # Log verification results
150
+ logger = AuditLogger(log_file=f"{output_dir}/eeg_verification.jsonl")
151
+ logger.log_validation(
152
+ task_name="eeg_processing",
153
+ checks_passed=len([r for r in report.results if r.passed]),
154
+ total_checks=len(report.results),
155
+ output_path=output_dir
156
+ )
157
+ ```
158
+
159
+ **Output**: `eeg_output/eeg_verification.jsonl` (structured audit log with JSONL format)
160
+
161
+ ---
162
+
163
+ Created At: 2026-03-25 14:00 HKT
164
+ Last Updated At: 2026-04-05 02:03 HKT
165
+ Author: chengwang96