@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,143 @@
1
+ ---
2
+ name: nii2dcm
3
+ description: "Use this skill whenever the user wants to convert NIfTI files (.nii or .nii.gz) to DICOM format, create DICOM series from processed neuroimaging results, write segmentation/registration/analysis outputs back to DICOM for PACS compatibility or clinical viewer comparison, or transfer metadata from reference DICOM files. Triggers include: mentions of 'NIfTI to DICOM', 'nii to dcm', 'convert nii.gz to DICOM', 'dicomify segmentation', 'nii2dcm', 'bring results back to DICOM', 'create DICOM from NIfTI', 'nii to dicom series', or any request to take post-processed neuroimaging results (segmentation, registration, bias field correction, synthesis, etc.) and store/view them alongside original patient DICOM data. Also use when modality-specific metadata (especially MR, SVR) or preservation of patient/study information from a reference DICOM is needed. Do NOT use for the reverse conversion (DICOM to NIfTI), non-medical imaging file conversions, or any clinical diagnostic or treatment-related workflows."
4
+ license: BSD 3-Clause (original nii2dcm license). See https://github.com/tomaroberts/nii2dcm/blob/main/LICENSE for complete terms.
5
+ layer: base
6
+ skill_type: tool
7
+ dependencies:
8
+ - claw-shell
9
+ ---
10
+ # NIfTI to DICOM conversion
11
+
12
+ ## Overview
13
+
14
+ A NIfTI file (.nii/.nii.gz) is a compact format widely used in neuroimaging research, typically stripped of patient metadata.
15
+ DICOM is the clinical standard for medical images, including rich metadata and interoperability with PACS/hospital systems.
16
+
17
+ This skill wraps `nii2dcm` (v0.1.6, May 2025) to convert NIfTI volumes into single-frame DICOM series (multi-slice 2D), primarily for MRI-derived data.
18
+ It supports modality-specific metadata (MR, SVR) and optional metadata transfer from a reference DICOM file.
19
+
20
+ **Research use only** — not certified for clinical diagnosis, treatment, or patient care.
21
+
22
+ ## Quick Reference
23
+
24
+ | Task | Approach / Command Flag |
25
+ |-------------------------------|------------------------------------------|
26
+ | Basic conversion (generic) | `nii2dcm input.nii.gz output_dir/` |
27
+ | MRI multi-slice series | `--dicom-type MR` or `-d MR` |
28
+ | SVR (3D swept volume recon) | `--dicom-type SVR` or `-d SVR` |
29
+ | Copy patient/study metadata | `--ref-dicom ref.dcm` or `-r ref.dcm` |
30
+ | Custom series description | Add via wrapper or post-process |
31
+ | Verify output | Open in Horos, 3D Slicer, ITK-Snap |
32
+
33
+ ## Installation
34
+
35
+ ### Via pip (recommended for NeuroClaw)
36
+ ```bash
37
+ pip install nii2dcm>=0.1.6
38
+ # or latest
39
+ pip install git+https://github.com/tomaroberts/nii2dcm.git
40
+ ```
41
+
42
+ ### From source (for customization / debugging)
43
+ ```bash
44
+ git clone https://github.com/tomaroberts/nii2dcm.git
45
+ cd nii2dcm
46
+ python -m venv venv
47
+ source venv/bin/activate
48
+ pip install --upgrade pip
49
+ pip install -r requirements.txt
50
+ pip install .
51
+ nii2dcm -h # Verify
52
+ ```
53
+
54
+ Core dependencies (automatically installed):
55
+ - highdicom >= 0.9.0
56
+ - SimpleITK >= 2.2.0
57
+ - pydicom
58
+ - numpy
59
+
60
+ Docker alternative (if preferred in containerized env):
61
+ ```bash
62
+ docker pull ghcr.io/tomaroberts/nii2dcm:latest
63
+ docker tag ghcr.io/tomaroberts/nii2dcm:latest nii2dcm
64
+ docker run nii2dcm -v # check version
65
+ ```
66
+
67
+ ## Usage Examples
68
+
69
+ Core command pattern:
70
+ ```bash
71
+ nii2dcm <input.nii[.gz]> <output_directory> [options]
72
+ ```
73
+
74
+ ### Create standard MRI DICOM series
75
+ ```bash
76
+ nii2dcm processed_t1.nii.gz dicom_mr/ -d MR
77
+ ```
78
+
79
+ ### Create SVR (swept volume reconstruction) series
80
+ ```bash
81
+ nii2dcm svr_recon.nii.gz dicom_svr/ -d SVR
82
+ ```
83
+
84
+ ### Generic conversion (no modality metadata)
85
+ ```bash
86
+ nii2dcm seg_result.nii.gz dicom_generic/
87
+ ```
88
+
89
+ ### With reference DICOM (copy patient/study metadata)
90
+ ```bash
91
+ nii2dcm hippocampus_seg.nii.gz dicom_seg/ -d MR -r original_T1_001.dcm
92
+ ```
93
+
94
+ Transferred attributes (from DicomMRI class, see source):
95
+ - PatientName, PatientID, PatientBirthDate, PatientSex
96
+ - StudyInstanceUID, StudyDate, StudyTime, StudyDescription
97
+ - SeriesInstanceUID, SeriesNumber, SeriesDescription, etc.
98
+ (Full list: https://github.com/tomaroberts/nii2dcm/blob/main/nii2dcm/dcm.py#L236)
99
+
100
+ ### NeuroClaw recommended wrapper (simpler for agent calling)
101
+ Use a thin wrapper script (to be provided in skill dir):
102
+ ```bash
103
+ python nii2dcm_wrapper.py \
104
+ --input seg_postop.nii.gz \
105
+ --output-dir dicom_results/ \
106
+ --modality MR \
107
+ --ref-dcm ref_series/0001.dcm \
108
+ --series-desc "U-Net v3 Segmentation"
109
+ ```
110
+
111
+ ## Important Notes & Limitations
112
+
113
+ - Supports only **3D single-volume → multi-slice 2D DICOM series** (common in structural MRI, segmentations)
114
+ - **No 4D support** (fMRI, DWI, perfusion, DTI) — split volumes first if needed
115
+ - Without `--dicom-type`, output is generic (lacks modality-specific tags)
116
+ - Without `--ref-dicom`, patient/study info is anonymized/generic
117
+ - Orientation, spacing, slice thickness read from NIfTI; verify alignment
118
+ - **Always visually validate** output in DICOM viewer (Horos, 3D Slicer, ITK-Snap, MITK)
119
+ - Project still in early stage — expect occasional bugs
120
+ - **Research purpose only** — not a clinical tool
121
+
122
+ ## When to Call This Skill
123
+
124
+ - Finished NIfTI-space processing (bias correction, registration, segmentation, synthesis, etc.)
125
+ - Need to compare AI/model outputs visually with original clinical DICOM images
126
+ - Want to store results in same format/framework as source study
127
+ - Preparing outputs for PACS import, clinical collaboration, or archiving
128
+
129
+ ## Complementary / Related Skills
130
+ - `dependency-planner` → install dependencies
131
+ - `claw-shell` → safe execution of conversion commands
132
+
133
+ ## Reference
134
+
135
+ Original: https://github.com/tomaroberts/nii2dcm (v0.1.6, May 2025)
136
+ Built on: highdicom (DICOM creation), SimpleITK (image I/O)
137
+ Inspired by: dcm2niix (reverse tool), SVRTK project
138
+
139
+ Report issues or request extensions (e.g., CT support, 4D handling) in NeuroClaw repo.
140
+
141
+ Created At: 2026-03-18 20:09 HKT
142
+ Last Updated At: 2026-03-26 00:21 HKT
143
+ Author: chengwang96
@@ -0,0 +1,266 @@
1
+ ---
2
+ name: nilearn-tool
3
+ description: "Use this skill whenever any NeuroClaw fMRI modality skill needs to execute concrete Nilearn operations: ROI/atlas time-series extraction, confounds handling (fMRIPrep), seed-based connectivity maps, ROI-to-ROI connectivity matrices, and optional GLM/decoding utilities. This is the dedicated base/tool skill that contains Nilearn usage patterns and lightweight wrappers. Never called directly by the user."
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
+ # Nilearn Tool (Base/Tool Layer)
11
+
12
+ ## Overview
13
+ `nilearn-tool` is the **NeuroClaw base/tool skill** that implements concrete **Nilearn** workflows for turning **preprocessed BOLD** into features (ROI time series, connectivity matrices, seed maps) and optional statistical modeling (GLM).
14
+
15
+ It is **never called directly by the user**. It is delegated to by `fmri-skill` (or other interface/modality skills) and executed via `claw-shell`.
16
+
17
+ **Research use only.**
18
+
19
+ ## Agent Reference Rule
20
+
21
+ When the agent needs Nilearn-based implementation code, it should first consult the curated snippets in `skills/nilearn-tool/scripts/` instead of copying directly from long tutorial scripts with hard-coded paths.
22
+
23
+ Reference snippets available:
24
+ - `scripts/preprocess_bold_reference.py` -> dummy removal, smoothing, band-pass filtering, MNI resampling
25
+ - `scripts/connectome_reference.py` -> atlas ROI extraction and ROI-to-ROI connectivity export
26
+ - `scripts/zalff_summary_reference.py` -> MNI resampling, zALFF summary, atlas-level regional export
27
+ - `scripts/task_glm_reference.py` -> first-level task GLM with design matrix and contrast maps
28
+ - `scripts/second_level_glm_reference.py` -> group-level GLM from subject contrast maps
29
+ - `scripts/rest_ica_reference.py` -> resting-state CanICA component extraction
30
+ - `scripts/rest_dictlearning_reference.py` -> resting-state DictLearning component extraction
31
+ - `scripts/svm_classifier_reference.py` -> ROI/tabular disease classification with SVM
32
+ - `scripts/spacenet_classifier_reference.py` -> voxel-wise disease classification with SpaceNet
33
+ - `scripts/kmeans_parcellation_reference.py` -> mask-based K-means brain parcellation
34
+ - `scripts/hierarchical_parcellation_reference.py` -> mask-based hierarchical brain parcellation
35
+ - `scripts/denoise_timeseries_reference.py` -> confound regression and detrending with `clean_img`
36
+
37
+ ---
38
+
39
+ ## Scope (What this tool does / does not do)
40
+
41
+ ### ✅ This tool does
42
+ - Load BOLD NIfTI and (optional) brain mask.
43
+ - Load fMRIPrep confounds TSV and apply common denoising regressors.
44
+ - Extract ROI time series from an atlas/parcellation.
45
+ - Compute ROI-to-ROI functional connectivity matrices.
46
+ - Compute seed-to-voxel connectivity maps.
47
+ - (Optional) Run first-/second-level GLM when events/maps are provided.
48
+
49
+ ### ❌ This tool does NOT do
50
+ - Raw fMRI preprocessing (slice timing, motion correction, susceptibility distortion correction, eddy/topup, etc.).
51
+ Those belong to `fmriprep-tool`, `hcppipeline-tool`, `fsl-tool`.
52
+
53
+ ---
54
+
55
+ ## Core Outputs (Typical)
56
+ - `roi_timeseries.csv` (T × R)
57
+ - `connectome.npy` / `connectome.csv` (R × R)
58
+ - `seed_zmap.nii.gz`
59
+ - (Optional) `first_level_zmap.nii.gz`, `second_level_zmap.nii.gz`
60
+ - Optional figures: connectome matrix PNG, connectome graph PNG, stat map PNG
61
+
62
+ ---
63
+
64
+ ## Minimal Nilearn Usage Patterns (Short Snippets)
65
+
66
+ ### 1) fMRIPrep confounds (recommended)
67
+ ```python
68
+ from nilearn.interfaces.fmriprep import load_confounds
69
+ confounds, sample_mask = load_confounds(confounds_tsv, strategy=["motion", "wm_csf"])
70
+ ```
71
+
72
+ ### 2) ROI time series (atlas/parcellation)
73
+ ```python
74
+ from nilearn.maskers import NiftiLabelsMasker
75
+ masker = NiftiLabelsMasker(labels_img=atlas_img, t_r=tr, standardize=True, detrend=True)
76
+ roi_ts = masker.fit_transform(bold_img, confounds=confounds, sample_mask=sample_mask) # (T, R)
77
+ ```
78
+
79
+ ### 3) ROI-to-ROI connectivity
80
+ ```python
81
+ from nilearn.connectome import ConnectivityMeasure
82
+ conn = ConnectivityMeasure(kind="correlation").fit_transform([roi_ts])[0] # (R, R)
83
+ ```
84
+
85
+ ### 4) Seed-to-voxel connectivity (concept)
86
+ - Use `NiftiSpheresMasker` for seed TS, `NiftiMasker` for voxel TS, then correlate and Fisher-z.
87
+
88
+ ## Curated Reference Snippets
89
+
90
+ These scripts are distilled from `rs-fMRI-Pipeline-Tutorial/` and should be the preferred starting point for new code in this skill:
91
+
92
+ ### `scripts/preprocess_bold_reference.py`
93
+ - Covers the Nilearn-centric part of resting-state preprocessing shown in `multimodal_brain_connectivity_pipeline.py`
94
+ - Includes dummy-scan removal, spatial smoothing, temporal band-pass filtering, and MNI152 resampling
95
+
96
+ Example:
97
+ ```bash
98
+ python skills/nilearn-tool/scripts/preprocess_bold_reference.py \
99
+ --bold path/to/rest_bold.nii.gz \
100
+ --output fmri_output/sub-001/nilearn/preprocessed_bold_mni.nii.gz
101
+ ```
102
+
103
+ ### `scripts/connectome_reference.py`
104
+ - Extracts atlas ROI time series with `NiftiLabelsMasker`
105
+ - Computes ROI-to-ROI connectivity with `ConnectivityMeasure`
106
+ - Exports `roi_timeseries.csv`, `connectome.npy`, and `connectome.csv`
107
+
108
+ Example:
109
+ ```bash
110
+ python skills/nilearn-tool/scripts/connectome_reference.py \
111
+ --bold path/to/preprocessed_bold_mni.nii.gz \
112
+ --atlas path/to/AAL3v1.nii \
113
+ --labels path/to/AAL3v1.nii.txt \
114
+ --output-dir fmri_output/sub-001/nilearn/connectome
115
+ ```
116
+
117
+ ### `scripts/zalff_summary_reference.py`
118
+ - Adapts the regional zALFF summarization logic from `MNI152_zALFF_Brain_Region_Activation_Analysis.py`
119
+ - Uses Nilearn resampling, cleaning, and `NiftiLabelsMasker` for atlas-level reporting
120
+
121
+ Example:
122
+ ```bash
123
+ python skills/nilearn-tool/scripts/zalff_summary_reference.py \
124
+ --bold path/to/rest_bold.nii.gz \
125
+ --atlas path/to/AAL3v1.nii \
126
+ --labels path/to/AAL3v1.nii.txt \
127
+ --mask path/to/mni_mask.nii.gz \
128
+ --output-dir fmri_output/sub-001/nilearn/zalff
129
+ ```
130
+
131
+ ### Additional model-routing snippets
132
+ - `scripts/task_glm_reference.py` -> first-level task GLM
133
+ - `scripts/second_level_glm_reference.py` -> second-level / group GLM
134
+ - `scripts/rest_ica_reference.py` -> resting-state ICA decomposition
135
+ - `scripts/rest_dictlearning_reference.py` -> resting-state DictLearning decomposition
136
+ - `scripts/svm_classifier_reference.py` -> tabular / ROI SVM classifier
137
+ - `scripts/spacenet_classifier_reference.py` -> voxel-wise SpaceNet classifier
138
+ - `scripts/kmeans_parcellation_reference.py` -> K-means parcellation from masked image features
139
+ - `scripts/hierarchical_parcellation_reference.py` -> Hierarchical parcellation from masked image features
140
+ - `scripts/denoise_timeseries_reference.py` -> confound-aware detrending and time-series cleaning
141
+
142
+ ---
143
+
144
+ ## Wrapper Entry (Recommended)
145
+ This tool should expose a **small CLI wrapper** (implementation kept in a separate file, not embedded here):
146
+ - File: `skills/nilearn-tool/nilearn_pipeline.py`
147
+ - Subcommands (recommended):
148
+ - `roi-ts` → extract ROI time series
149
+ - `connectome` → compute connectivity matrix from ROI TS
150
+ - `seed-corr` → seed connectivity z-map
151
+ - `first-glm` / `second-glm` (optional)
152
+
153
+ **All execution must be routed through `claw-shell`.**
154
+
155
+ Example calls:
156
+ ```bash
157
+ conda run -n neuroclaw-nilearn python skills/nilearn-tool/nilearn_pipeline.py roi-ts \
158
+ --bold <preproc_bold.nii.gz> --confounds <confounds.tsv> --tr 2.0 --atlas schaefer_2018_200_7 \
159
+ --outdir fmri_output/sub-001/nilearn/roi_ts
160
+
161
+ conda run -n neuroclaw-nilearn python skills/nilearn-tool/nilearn_pipeline.py connectome \
162
+ --roi-timeseries fmri_output/sub-001/nilearn/roi_ts/roi_timeseries.csv --kind correlation \
163
+ --outdir fmri_output/sub-001/nilearn/connectome
164
+ ```
165
+
166
+ ---
167
+
168
+ ## Installation (Handled by `dependency-planner`)
169
+ Recommended isolated environment:
170
+ ```bash
171
+ conda create -n neuroclaw-nilearn python=3.11 -y
172
+ conda install -n neuroclaw-nilearn -c conda-forge nilearn nibabel numpy scipy pandas scikit-learn matplotlib -y
173
+ ```
174
+
175
+ ---
176
+
177
+ ## Safety / Execution Rules (NeuroClaw)
178
+ - No direct `subprocess.run()` for long operations in this skill.
179
+ - All shell commands go through `claw-shell`.
180
+ - Always produce outputs under `fmri_output/.../nilearn/...` with deterministic filenames.
181
+
182
+ ---
183
+
184
+ ## Complementary / Related Skills
185
+ - `dependency-planner` + `conda-env-manager` → install/manage `neuroclaw-nilearn`
186
+ - `claw-shell` → mandatory execution layer
187
+
188
+ ---
189
+
190
+ ## Reference
191
+ - Nilearn documentation: https://nilearn.github.io/
192
+ - fMRIPrep confounds interface: Nilearn `nilearn.interfaces.fmriprep`
193
+ - Curated code snippets in this skill:
194
+ - `skills/nilearn-tool/scripts/preprocess_bold_reference.py`
195
+ - `skills/nilearn-tool/scripts/connectome_reference.py`
196
+ - `skills/nilearn-tool/scripts/zalff_summary_reference.py`
197
+ - `skills/nilearn-tool/scripts/task_glm_reference.py`
198
+ - `skills/nilearn-tool/scripts/second_level_glm_reference.py`
199
+ - `skills/nilearn-tool/scripts/rest_ica_reference.py`
200
+ - `skills/nilearn-tool/scripts/rest_dictlearning_reference.py`
201
+ - `skills/nilearn-tool/scripts/svm_classifier_reference.py`
202
+ - `skills/nilearn-tool/scripts/spacenet_classifier_reference.py`
203
+ - `skills/nilearn-tool/scripts/kmeans_parcellation_reference.py`
204
+ - `skills/nilearn-tool/scripts/hierarchical_parcellation_reference.py`
205
+ - `skills/nilearn-tool/scripts/denoise_timeseries_reference.py`
206
+
207
+ ## Post-Execution Verification (Harness Integration)
208
+
209
+ After Nilearn processing completes, this skill **automatically invokes harness-core's VerificationRunner** to validate output integrity:
210
+
211
+ **Integrated verification checks**:
212
+
213
+ ```python
214
+ from skills.harness_core import VerificationRunner, AuditLogger
215
+
216
+ verifier = VerificationRunner(task_type="nilearn_processing")
217
+
218
+ # 1. ROI time series shape and completeness
219
+ verifier.add_check("roi_timeseries",
220
+ checker=lambda: verify_roi_timeseries(output_dir),
221
+ severity="error"
222
+ )
223
+
224
+ # 2. Confounds loading and application
225
+ verifier.add_check("confounds_handling",
226
+ checker=lambda: verify_confounds_applied(output_dir),
227
+ severity="warning"
228
+ )
229
+
230
+ # 3. Connectivity matrix dimensionality (N_ROI × N_ROI)
231
+ verifier.add_check("connectivity_shape",
232
+ checker=lambda: verify_connectome_shape(output_dir),
233
+ severity="error"
234
+ )
235
+
236
+ # 4. Correlation bounds (-1 to +1)
237
+ verifier.add_check("correlation_bounds",
238
+ checker=lambda: verify_correlation_bounds(output_dir),
239
+ severity="warning"
240
+ )
241
+
242
+ # 5. Data integrity (NaN/Inf checks)
243
+ verifier.add_check("data_integrity",
244
+ checker=lambda: verify_no_nan_inf(output_dir),
245
+ severity="error"
246
+ )
247
+
248
+ report = verifier.run(output_dir)
249
+
250
+ # Log verification results
251
+ logger = AuditLogger(log_file=f"{output_dir}/nilearn_verification.jsonl")
252
+ logger.log_validation(
253
+ task_name="nilearn_processing",
254
+ checks_passed=len([r for r in report.results if r.passed]),
255
+ total_checks=len(report.results),
256
+ output_path=output_dir
257
+ )
258
+ ```
259
+
260
+ **Output**: `fmri_output/nilearn_verification.jsonl` (structured audit log with JSONL format)
261
+
262
+ ---
263
+
264
+ Created At: 2026-03-26 00:54 HKT
265
+ Last Updated At: 2026-04-14 00:26 HKT
266
+ Author: chengwang96
@@ -0,0 +1,65 @@
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+ from pathlib import Path
5
+
6
+ import nibabel as nib
7
+ import numpy as np
8
+ import pandas as pd
9
+ from nilearn.connectome import ConnectivityMeasure
10
+ from nilearn.maskers import NiftiLabelsMasker
11
+
12
+
13
+ def load_labels(label_path: Path) -> list[str]:
14
+ with label_path.open("r", encoding="utf-8", errors="ignore") as handle:
15
+ return [line.strip() for line in handle if line.strip()]
16
+
17
+
18
+ def export_connectome(
19
+ bold_path: Path,
20
+ atlas_path: Path,
21
+ output_dir: Path,
22
+ tr: float,
23
+ label_path: Path | None = None,
24
+ ) -> None:
25
+ bold_img = nib.load(str(bold_path))
26
+ masker = NiftiLabelsMasker(labels_img=str(atlas_path), t_r=tr, standardize=True, detrend=True)
27
+ roi_time_series = masker.fit_transform(bold_img)
28
+
29
+ connectome = ConnectivityMeasure(kind="correlation").fit_transform([roi_time_series])[0]
30
+ output_dir.mkdir(parents=True, exist_ok=True)
31
+
32
+ np.save(output_dir / "connectome.npy", connectome)
33
+ pd.DataFrame(roi_time_series).to_csv(output_dir / "roi_timeseries.csv", index=False)
34
+
35
+ if label_path is not None:
36
+ labels = load_labels(label_path)
37
+ count = min(len(labels), connectome.shape[0])
38
+ pd.DataFrame(connectome[:count, :count], index=labels[:count], columns=labels[:count]).to_csv(
39
+ output_dir / "connectome.csv"
40
+ )
41
+ else:
42
+ pd.DataFrame(connectome).to_csv(output_dir / "connectome.csv", index=False)
43
+
44
+
45
+ def main() -> None:
46
+ parser = argparse.ArgumentParser(description="Reference Nilearn snippet for ROI extraction and connectome computation.")
47
+ parser.add_argument("--bold", type=Path, required=True, help="Input preprocessed BOLD NIfTI.")
48
+ parser.add_argument("--atlas", type=Path, required=True, help="Atlas NIfTI for ROI extraction.")
49
+ parser.add_argument("--output-dir", type=Path, required=True, help="Directory for ROI and connectome outputs.")
50
+ parser.add_argument("--tr", type=float, default=1.0, help="Repetition time in seconds.")
51
+ parser.add_argument("--labels", type=Path, default=None, help="Optional atlas label text file.")
52
+ args = parser.parse_args()
53
+
54
+ export_connectome(
55
+ bold_path=args.bold,
56
+ atlas_path=args.atlas,
57
+ output_dir=args.output_dir,
58
+ tr=args.tr,
59
+ label_path=args.labels,
60
+ )
61
+ print(f"Saved connectome outputs to: {args.output_dir}")
62
+
63
+
64
+ if __name__ == "__main__":
65
+ main()
@@ -0,0 +1,58 @@
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+ from pathlib import Path
5
+
6
+ import nibabel as nib
7
+ import pandas as pd
8
+ from nilearn import image
9
+
10
+
11
+ def run_denoising(
12
+ bold_path: Path,
13
+ output_dir: Path,
14
+ tr: float,
15
+ confounds_path: Path | None = None,
16
+ mask_path: Path | None = None,
17
+ detrend: bool = False,
18
+ standardize: bool = True,
19
+ ) -> None:
20
+ output_dir.mkdir(parents=True, exist_ok=True)
21
+
22
+ confounds = pd.read_csv(confounds_path, sep=None, engine="python") if confounds_path is not None else None
23
+ cleaned = image.clean_img(
24
+ str(bold_path),
25
+ confounds=confounds,
26
+ detrend=detrend,
27
+ standardize=standardize,
28
+ mask_img=str(mask_path) if mask_path is not None else None,
29
+ t_r=tr,
30
+ )
31
+ nib.save(cleaned, str(output_dir / "cleaned_bold.nii.gz"))
32
+
33
+
34
+ def main() -> None:
35
+ parser = argparse.ArgumentParser(description="Reference Nilearn snippet for confound regression and detrending.")
36
+ parser.add_argument("--bold", type=Path, required=True, help="Input preprocessed BOLD image.")
37
+ parser.add_argument("--output-dir", type=Path, required=True, help="Directory for cleaned outputs.")
38
+ parser.add_argument("--tr", type=float, required=True, help="Repetition time in seconds.")
39
+ parser.add_argument("--confounds", type=Path, default=None, help="Optional confounds TSV/CSV.")
40
+ parser.add_argument("--mask", type=Path, default=None, help="Optional mask image.")
41
+ parser.add_argument("--detrend", action="store_true", help="Enable temporal detrending.")
42
+ parser.add_argument("--no-standardize", action="store_true", help="Disable standardization.")
43
+ args = parser.parse_args()
44
+
45
+ run_denoising(
46
+ bold_path=args.bold,
47
+ output_dir=args.output_dir,
48
+ tr=args.tr,
49
+ confounds_path=args.confounds,
50
+ mask_path=args.mask,
51
+ detrend=args.detrend,
52
+ standardize=not args.no_standardize,
53
+ )
54
+ print(f"Saved cleaned outputs to: {args.output_dir}")
55
+
56
+
57
+ if __name__ == "__main__":
58
+ main()
@@ -0,0 +1,53 @@
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+ from pathlib import Path
5
+
6
+ import nibabel as nib
7
+ import numpy as np
8
+ import pandas as pd
9
+ from nilearn.maskers import NiftiMasker
10
+ from sklearn.cluster import AgglomerativeClustering
11
+
12
+
13
+ def load_image_list(list_path: Path) -> list[str]:
14
+ with list_path.open("r", encoding="utf-8") as handle:
15
+ return [line.strip() for line in handle if line.strip()]
16
+
17
+
18
+ def build_feature_matrix(images: list[str], masker: NiftiMasker) -> np.ndarray:
19
+ subject_vectors = [masker.fit_transform(image_path) for image_path in images]
20
+ stacked = np.vstack(subject_vectors)
21
+ return stacked.reshape(len(images), -1, stacked.shape[-1]).mean(axis=0)
22
+
23
+
24
+ def run_hierarchical(input_list: Path, output_dir: Path, n_clusters: int, mask_path: Path) -> None:
25
+ output_dir.mkdir(parents=True, exist_ok=True)
26
+ images = load_image_list(input_list)
27
+
28
+ masker = NiftiMasker(mask_img=str(mask_path), standardize=True)
29
+ features = build_feature_matrix(images, masker)
30
+ model = AgglomerativeClustering(n_clusters=n_clusters, linkage="ward")
31
+ labels = model.fit_predict(features)
32
+
33
+ label_img = masker.inverse_transform(labels[:, None].astype(float))
34
+ nib.save(label_img, str(output_dir / "parcel_labels.nii.gz"))
35
+ pd.DataFrame({"cluster": np.arange(n_clusters), "size": np.bincount(labels, minlength=n_clusters)}).to_csv(
36
+ output_dir / "cluster_summary.csv", index=False
37
+ )
38
+
39
+
40
+ def main() -> None:
41
+ parser = argparse.ArgumentParser(description="Reference snippet for hierarchical neuroimaging parcellation.")
42
+ parser.add_argument("--input-list", type=Path, required=True, help="Text file listing aligned images.")
43
+ parser.add_argument("--mask", type=Path, required=True, help="Mask image defining spatial units.")
44
+ parser.add_argument("--n-clusters", type=int, required=True, help="Number of clusters / parcels.")
45
+ parser.add_argument("--output-dir", type=Path, required=True, help="Directory for parcellation outputs.")
46
+ args = parser.parse_args()
47
+
48
+ run_hierarchical(args.input_list, args.output_dir, args.n_clusters, args.mask)
49
+ print(f"Saved hierarchical parcellation outputs to: {args.output_dir}")
50
+
51
+
52
+ if __name__ == "__main__":
53
+ main()
@@ -0,0 +1,53 @@
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+ from pathlib import Path
5
+
6
+ import nibabel as nib
7
+ import numpy as np
8
+ import pandas as pd
9
+ from nilearn.maskers import NiftiMasker
10
+ from sklearn.cluster import KMeans
11
+
12
+
13
+ def load_image_list(list_path: Path) -> list[str]:
14
+ with list_path.open("r", encoding="utf-8") as handle:
15
+ return [line.strip() for line in handle if line.strip()]
16
+
17
+
18
+ def build_feature_matrix(images: list[str], masker: NiftiMasker) -> np.ndarray:
19
+ subject_vectors = [masker.fit_transform(image_path) for image_path in images]
20
+ stacked = np.vstack(subject_vectors)
21
+ return stacked.reshape(len(images), -1, stacked.shape[-1]).mean(axis=0)
22
+
23
+
24
+ def run_kmeans(input_list: Path, output_dir: Path, n_clusters: int, mask_path: Path) -> None:
25
+ output_dir.mkdir(parents=True, exist_ok=True)
26
+ images = load_image_list(input_list)
27
+
28
+ masker = NiftiMasker(mask_img=str(mask_path), standardize=True)
29
+ features = build_feature_matrix(images, masker)
30
+ model = KMeans(n_clusters=n_clusters, random_state=0, n_init=10)
31
+ labels = model.fit_predict(features)
32
+
33
+ label_img = masker.inverse_transform(labels[:, None].astype(float))
34
+ nib.save(label_img, str(output_dir / "parcel_labels.nii.gz"))
35
+ pd.DataFrame({"cluster": np.arange(n_clusters), "size": np.bincount(labels, minlength=n_clusters)}).to_csv(
36
+ output_dir / "cluster_summary.csv", index=False
37
+ )
38
+
39
+
40
+ def main() -> None:
41
+ parser = argparse.ArgumentParser(description="Reference snippet for K-means-based neuroimaging parcellation.")
42
+ parser.add_argument("--input-list", type=Path, required=True, help="Text file listing aligned images.")
43
+ parser.add_argument("--mask", type=Path, required=True, help="Mask image defining spatial units.")
44
+ parser.add_argument("--n-clusters", type=int, required=True, help="Number of clusters / parcels.")
45
+ parser.add_argument("--output-dir", type=Path, required=True, help="Directory for parcellation outputs.")
46
+ args = parser.parse_args()
47
+
48
+ run_kmeans(args.input_list, args.output_dir, args.n_clusters, args.mask)
49
+ print(f"Saved K-means parcellation outputs to: {args.output_dir}")
50
+
51
+
52
+ if __name__ == "__main__":
53
+ main()