@brainpilot/skills 0.0.6 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (285) hide show
  1. package/package.json +2 -2
  2. package/skills/01_Meta-Skills/academic-research-hub/SKILL.md +108 -0
  3. package/skills/01_Meta-Skills/academic-research-hub/scripts/requirements.txt +17 -0
  4. package/skills/01_Meta-Skills/academic-research-hub/scripts/research.py +781 -0
  5. package/skills/01_Meta-Skills/beautiful-log/SKILL.md +64 -0
  6. package/skills/01_Meta-Skills/beautiful-log/scripts/beautiful_log.py +274 -0
  7. package/skills/01_Meta-Skills/ethoclaw-daily-paper/SKILL.md +130 -0
  8. package/skills/01_Meta-Skills/ethoclaw-daily-paper/assets/config.template.yaml +54 -0
  9. package/skills/01_Meta-Skills/ethoclaw-daily-paper/assets/top5_digest_template.md +5 -0
  10. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/build_top5_digest.py +300 -0
  11. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/common.py +137 -0
  12. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/merge_results.py +106 -0
  13. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/run_pipeline.py +177 -0
  14. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/search_arxiv.py +162 -0
  15. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/search_pubmed.py +202 -0
  16. package/skills/01_Meta-Skills/ethoclaw-normalize-tabular/SKILL.md +173 -0
  17. package/skills/01_Meta-Skills/ethoclaw-normalize-tabular/scripts/normalize_data.py +874 -0
  18. package/skills/01_Meta-Skills/ethoclaw-pdf-research/SKILL.md +134 -0
  19. package/skills/01_Meta-Skills/ethoclaw-pdf-research/references/confirmation-prompts.md +31 -0
  20. package/skills/01_Meta-Skills/ethoclaw-pdf-research/references/output-patterns.md +45 -0
  21. package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/build_markdown_deliverables.py +41 -0
  22. package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/build_research_log.py +84 -0
  23. package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/build_summary_md.py +63 -0
  24. package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/extract_pdf_bundle.py +140 -0
  25. package/skills/01_Meta-Skills/experiment-controller/SKILL.md +140 -0
  26. package/skills/01_Meta-Skills/knowledge-graph-builder/SKILL.md +366 -0
  27. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/entity_resolution.py +120 -0
  28. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/extraction_prompt_template.txt +19 -0
  29. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/graph_query.py +106 -0
  30. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/hypothesis_cli_reference.py +42 -0
  31. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/new_data_source_template.py +116 -0
  32. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/requirements.txt +15 -0
  33. package/skills/01_Meta-Skills/method-design/SKILL.md +61 -0
  34. package/skills/01_Meta-Skills/multi-search-engine/SKILL.md +119 -0
  35. package/skills/01_Meta-Skills/research-idea/SKILL.md +65 -0
  36. package/skills/05_EEG_ERP/eeg-skill/SKILL.md +197 -0
  37. package/skills/05_EEG_ERP/meg-skill/SKILL.md +188 -0
  38. package/skills/05_EEG_ERP/meg-skill/scripts/time_frequency.py +223 -0
  39. package/skills/05_EEG_ERP/mne-eeg-tool/SKILL.md +165 -0
  40. package/skills/05_EEG_ERP/mne-eeg-tool/scripts/eeg_pipeline_reference.py +231 -0
  41. package/skills/05_EEG_ERP/seed-iv-skill/SKILL.md +184 -0
  42. package/skills/05_EEG_ERP/seed-iv-skill/scripts/classify_seed_iv.py +154 -0
  43. package/skills/05_EEG_ERP/seed-iv-skill/scripts/extract_seed_iv_features.py +190 -0
  44. package/skills/05_EEG_ERP/seed-iv-skill/scripts/validate_seed_iv.py +102 -0
  45. package/skills/05_EEG_ERP/seed-vig-skill/SKILL.md +182 -0
  46. package/skills/05_EEG_ERP/seed-vig-skill/scripts/classify_seed_vig.py +165 -0
  47. package/skills/05_EEG_ERP/seed-vig-skill/scripts/extract_seed_vig_features.py +185 -0
  48. package/skills/05_EEG_ERP/seed-vig-skill/scripts/validate_seed_vig.py +88 -0
  49. package/skills/06_fMRI_Neuroimaging/abcd-skill/SKILL.md +308 -0
  50. package/skills/06_fMRI_Neuroimaging/abcd-skill/scripts/abcd_qc_summary.py +449 -0
  51. package/skills/06_fMRI_Neuroimaging/abcd-skill/scripts/extract_abcd_phenotype.py +292 -0
  52. package/skills/06_fMRI_Neuroimaging/abcd-skill/scripts/reorganize_abcd.py +387 -0
  53. package/skills/06_fMRI_Neuroimaging/abide-skill/SKILL.md +302 -0
  54. package/skills/06_fMRI_Neuroimaging/abide-skill/scripts/abide_qc_summary.py +317 -0
  55. package/skills/06_fMRI_Neuroimaging/abide-skill/scripts/extract_abide_phenotype.py +267 -0
  56. package/skills/06_fMRI_Neuroimaging/abide-skill/scripts/reorganize_abide.py +387 -0
  57. package/skills/06_fMRI_Neuroimaging/adhd200-skill/SKILL.md +244 -0
  58. package/skills/06_fMRI_Neuroimaging/adhd200-skill/scripts/adhd200_qc_summary.py +98 -0
  59. package/skills/06_fMRI_Neuroimaging/adhd200-skill/scripts/extract_adhd200_phenotype.py +134 -0
  60. package/skills/06_fMRI_Neuroimaging/adhd200-skill/scripts/reorganize_adhd200.py +206 -0
  61. package/skills/06_fMRI_Neuroimaging/adni-skill/SKILL.md +358 -0
  62. package/skills/06_fMRI_Neuroimaging/adni-skill/scripts/generate_adni_task_files.py +1305 -0
  63. package/skills/06_fMRI_Neuroimaging/adni-skill/scripts/generate_vqa_from_tasks.py +766 -0
  64. package/skills/06_fMRI_Neuroimaging/adni-skill/scripts/reorganize_adni.py +491 -0
  65. package/skills/06_fMRI_Neuroimaging/aibl-skill/SKILL.md +295 -0
  66. package/skills/06_fMRI_Neuroimaging/aibl-skill/scripts/aibl_qc_summary.py +260 -0
  67. package/skills/06_fMRI_Neuroimaging/aibl-skill/scripts/extract_aibl_phenotype.py +365 -0
  68. package/skills/06_fMRI_Neuroimaging/aibl-skill/scripts/reorganize_aibl.py +394 -0
  69. package/skills/06_fMRI_Neuroimaging/aomic-skill/SKILL.md +292 -0
  70. package/skills/06_fMRI_Neuroimaging/aomic-skill/scripts/aomic_qc_summary.py +258 -0
  71. package/skills/06_fMRI_Neuroimaging/aomic-skill/scripts/extract_aomic_phenotype.py +284 -0
  72. package/skills/06_fMRI_Neuroimaging/aomic-skill/scripts/reorganize_aomic.py +322 -0
  73. package/skills/06_fMRI_Neuroimaging/asl-skill/SKILL.md +168 -0
  74. package/skills/06_fMRI_Neuroimaging/asl-skill/scripts/compute_cbf.py +224 -0
  75. package/skills/06_fMRI_Neuroimaging/bids-organizer/SKILL.md +241 -0
  76. package/skills/06_fMRI_Neuroimaging/bold5000-skill/SKILL.md +186 -0
  77. package/skills/06_fMRI_Neuroimaging/bold5000-skill/scripts/bold5000_qc_summary.py +96 -0
  78. package/skills/06_fMRI_Neuroimaging/bold5000-skill/scripts/extract_bold5000_stimulus.py +125 -0
  79. package/skills/06_fMRI_Neuroimaging/bold5000-skill/scripts/reorganize_bold5000.py +102 -0
  80. package/skills/06_fMRI_Neuroimaging/camcan-skill/SKILL.md +213 -0
  81. package/skills/06_fMRI_Neuroimaging/camcan-skill/scripts/camcan_qc_summary.py +131 -0
  82. package/skills/06_fMRI_Neuroimaging/camcan-skill/scripts/extract_camcan_phenotype.py +145 -0
  83. package/skills/06_fMRI_Neuroimaging/camcan-skill/scripts/validate_camcan.py +141 -0
  84. package/skills/06_fMRI_Neuroimaging/cobre-skill/SKILL.md +201 -0
  85. package/skills/06_fMRI_Neuroimaging/cobre-skill/scripts/cobre_qc_summary.py +95 -0
  86. package/skills/06_fMRI_Neuroimaging/cobre-skill/scripts/extract_cobre_phenotype.py +104 -0
  87. package/skills/06_fMRI_Neuroimaging/cobre-skill/scripts/reorganize_cobre.py +140 -0
  88. package/skills/06_fMRI_Neuroimaging/conn-tool/SKILL.md +180 -0
  89. package/skills/06_fMRI_Neuroimaging/dcm2nii/SKILL.md +189 -0
  90. package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/SKILL.md +183 -0
  91. package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/scripts/dmt_har_med_qc_summary.py +96 -0
  92. package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/scripts/extract_dmt_har_med_phenotype.py +121 -0
  93. package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/scripts/reorganize_dmt_har_med.py +125 -0
  94. package/skills/06_fMRI_Neuroimaging/dwi-skill/SKILL.md +359 -0
  95. package/skills/06_fMRI_Neuroimaging/fmri-skill/SKILL.md +371 -0
  96. package/skills/06_fMRI_Neuroimaging/fmriprep-tool/SKILL.md +228 -0
  97. package/skills/06_fMRI_Neuroimaging/freesurfer-tool/SKILL.md +286 -0
  98. package/skills/06_fMRI_Neuroimaging/freesurfer-tool/scripts/freesurfer_processor.py +145 -0
  99. package/skills/06_fMRI_Neuroimaging/fsl-tool/SKILL.md +208 -0
  100. package/skills/06_fMRI_Neuroimaging/hbn-skill/SKILL.md +271 -0
  101. package/skills/06_fMRI_Neuroimaging/hbn-skill/scripts/extract_hbn_phenotype.py +107 -0
  102. package/skills/06_fMRI_Neuroimaging/hbn-skill/scripts/hbn_qc_summary.py +96 -0
  103. package/skills/06_fMRI_Neuroimaging/hbn-skill/scripts/reorganize_hbn.py +150 -0
  104. package/skills/06_fMRI_Neuroimaging/hcpa-skill/SKILL.md +210 -0
  105. package/skills/06_fMRI_Neuroimaging/hcpa-skill/scripts/extract_hcpa_phenotype.py +146 -0
  106. package/skills/06_fMRI_Neuroimaging/hcpa-skill/scripts/hcpa_qc_summary.py +120 -0
  107. package/skills/06_fMRI_Neuroimaging/hcpa-skill/scripts/reorganize_hcpa.py +155 -0
  108. package/skills/06_fMRI_Neuroimaging/hcpd-skill/SKILL.md +210 -0
  109. package/skills/06_fMRI_Neuroimaging/hcpd-skill/scripts/extract_hcpd_phenotype.py +148 -0
  110. package/skills/06_fMRI_Neuroimaging/hcpd-skill/scripts/hcpd_qc_summary.py +125 -0
  111. package/skills/06_fMRI_Neuroimaging/hcpd-skill/scripts/reorganize_hcpd.py +146 -0
  112. package/skills/06_fMRI_Neuroimaging/hcpep-skill/SKILL.md +215 -0
  113. package/skills/06_fMRI_Neuroimaging/hcpep-skill/scripts/extract_hcpep_phenotype.py +157 -0
  114. package/skills/06_fMRI_Neuroimaging/hcpep-skill/scripts/hcpep_qc_summary.py +143 -0
  115. package/skills/06_fMRI_Neuroimaging/hcpep-skill/scripts/reorganize_hcpep.py +146 -0
  116. package/skills/06_fMRI_Neuroimaging/hcppipeline-tool/SKILL.md +217 -0
  117. package/skills/06_fMRI_Neuroimaging/hcpya-skill/SKILL.md +214 -0
  118. package/skills/06_fMRI_Neuroimaging/hcpya-skill/scripts/extract_hcpya_phenotype.py +190 -0
  119. package/skills/06_fMRI_Neuroimaging/hcpya-skill/scripts/hcpya_qc_summary.py +152 -0
  120. package/skills/06_fMRI_Neuroimaging/hcpya-skill/scripts/reorganize_hcpya.py +203 -0
  121. package/skills/06_fMRI_Neuroimaging/ixi-skill/SKILL.md +198 -0
  122. package/skills/06_fMRI_Neuroimaging/ixi-skill/scripts/ixi_qc_summary.py +137 -0
  123. package/skills/06_fMRI_Neuroimaging/ixi-skill/scripts/reorganize_ixi.py +190 -0
  124. package/skills/06_fMRI_Neuroimaging/mnd-skill/SKILL.md +191 -0
  125. package/skills/06_fMRI_Neuroimaging/mnd-skill/scripts/extract_mnd_phenotype.py +143 -0
  126. package/skills/06_fMRI_Neuroimaging/mnd-skill/scripts/mnd_qc_summary.py +120 -0
  127. package/skills/06_fMRI_Neuroimaging/mnd-skill/scripts/validate_mnd.py +107 -0
  128. package/skills/06_fMRI_Neuroimaging/mschallenge-skill/SKILL.md +203 -0
  129. package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/analyze_lesions.py +119 -0
  130. package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/longitudinal_lesion.py +148 -0
  131. package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/mschallenge_qc_summary.py +132 -0
  132. package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/validate_mschallenge.py +116 -0
  133. package/skills/06_fMRI_Neuroimaging/nibabel-skill/SKILL.md +184 -0
  134. package/skills/06_fMRI_Neuroimaging/nibabel-skill/scripts/atlas_coordinate_reference.py +61 -0
  135. package/skills/06_fMRI_Neuroimaging/nibabel-skill/scripts/freesurfer_io_reference.py +34 -0
  136. package/skills/06_fMRI_Neuroimaging/nibabel-skill/scripts/nifti_inspection_reference.py +35 -0
  137. package/skills/06_fMRI_Neuroimaging/nifd-skill/SKILL.md +205 -0
  138. package/skills/06_fMRI_Neuroimaging/nifd-skill/scripts/extract_nifd_phenotype.py +132 -0
  139. package/skills/06_fMRI_Neuroimaging/nifd-skill/scripts/nifd_qc_summary.py +111 -0
  140. package/skills/06_fMRI_Neuroimaging/nifd-skill/scripts/validate_nifd.py +111 -0
  141. package/skills/06_fMRI_Neuroimaging/nii2dcm/SKILL.md +143 -0
  142. package/skills/06_fMRI_Neuroimaging/nilearn-tool/SKILL.md +266 -0
  143. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/connectome_reference.py +65 -0
  144. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/denoise_timeseries_reference.py +58 -0
  145. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/hierarchical_parcellation_reference.py +53 -0
  146. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/kmeans_parcellation_reference.py +53 -0
  147. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/preprocess_bold_reference.py +76 -0
  148. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/rest_dictlearning_reference.py +56 -0
  149. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/rest_ica_reference.py +59 -0
  150. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/second_level_glm_reference.py +58 -0
  151. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/spacenet_classifier_reference.py +59 -0
  152. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/svm_classifier_reference.py +60 -0
  153. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/task_glm_reference.py +63 -0
  154. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/zalff_summary_reference.py +109 -0
  155. package/skills/06_fMRI_Neuroimaging/nsd-skill/SKILL.md +210 -0
  156. package/skills/06_fMRI_Neuroimaging/nsd-skill/scripts/extract_nsd_stimulus.py +171 -0
  157. package/skills/06_fMRI_Neuroimaging/nsd-skill/scripts/nsd_qc_summary.py +142 -0
  158. package/skills/06_fMRI_Neuroimaging/nsd-skill/scripts/validate_nsd.py +142 -0
  159. package/skills/06_fMRI_Neuroimaging/oasis-skill/SKILL.md +205 -0
  160. package/skills/06_fMRI_Neuroimaging/oasis-skill/scripts/extract_oasis_phenotype.py +126 -0
  161. package/skills/06_fMRI_Neuroimaging/oasis-skill/scripts/oasis_qc_summary.py +115 -0
  162. package/skills/06_fMRI_Neuroimaging/oasis-skill/scripts/validate_oasis.py +119 -0
  163. package/skills/06_fMRI_Neuroimaging/pet-skill/SKILL.md +173 -0
  164. package/skills/06_fMRI_Neuroimaging/pet-skill/scripts/compute_suvr.py +202 -0
  165. package/skills/06_fMRI_Neuroimaging/pnc-skill/SKILL.md +206 -0
  166. package/skills/06_fMRI_Neuroimaging/pnc-skill/scripts/extract_pnc_phenotype.py +136 -0
  167. package/skills/06_fMRI_Neuroimaging/pnc-skill/scripts/pnc_qc_summary.py +116 -0
  168. package/skills/06_fMRI_Neuroimaging/pnc-skill/scripts/validate_pnc.py +120 -0
  169. package/skills/06_fMRI_Neuroimaging/ppmi-skill/SKILL.md +209 -0
  170. package/skills/06_fMRI_Neuroimaging/ppmi-skill/scripts/extract_ppmi_phenotype.py +138 -0
  171. package/skills/06_fMRI_Neuroimaging/ppmi-skill/scripts/ppmi_qc_summary.py +111 -0
  172. package/skills/06_fMRI_Neuroimaging/ppmi-skill/scripts/validate_ppmi.py +117 -0
  173. package/skills/06_fMRI_Neuroimaging/qsiprep-tool/SKILL.md +320 -0
  174. package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/SKILL.md +215 -0
  175. package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/extract_rest_mdd_phenotype.py +132 -0
  176. package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/harmonize_sites.py +152 -0
  177. package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/rest_mdd_qc_summary.py +124 -0
  178. package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/validate_rest_mdd.py +103 -0
  179. package/skills/06_fMRI_Neuroimaging/smri-skill/SKILL.md +302 -0
  180. package/skills/06_fMRI_Neuroimaging/tcp-skill/SKILL.md +204 -0
  181. package/skills/06_fMRI_Neuroimaging/tcp-skill/scripts/extract_tcp_phenotype.py +139 -0
  182. package/skills/06_fMRI_Neuroimaging/tcp-skill/scripts/tcp_qc_summary.py +111 -0
  183. package/skills/06_fMRI_Neuroimaging/tcp-skill/scripts/validate_tcp.py +99 -0
  184. package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/SKILL.md +217 -0
  185. package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/scripts/extract_ucla_cnp_phenotype.py +145 -0
  186. package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/scripts/ucla_cnp_qc_summary.py +111 -0
  187. package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/scripts/validate_ucla_cnp.py +113 -0
  188. package/skills/06_fMRI_Neuroimaging/ukb-skill/SKILL.md +310 -0
  189. package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/build_ukb_survival.py +210 -0
  190. package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/extract_ukb_cases.py +308 -0
  191. package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/extract_ukb_phenotype.py +232 -0
  192. package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/ukb_qc_summary.py +158 -0
  193. package/skills/06_fMRI_Neuroimaging/wmh-segmentation/SKILL.md +133 -0
  194. package/skills/07_Computational_Modeling/detrending/SKILL.md +118 -0
  195. package/skills/07_Computational_Modeling/dictlearning/SKILL.md +122 -0
  196. package/skills/07_Computational_Modeling/filtering/SKILL.md +121 -0
  197. package/skills/07_Computational_Modeling/glm/SKILL.md +153 -0
  198. package/skills/07_Computational_Modeling/hierarchical/SKILL.md +121 -0
  199. package/skills/07_Computational_Modeling/ica/SKILL.md +122 -0
  200. package/skills/07_Computational_Modeling/kmeans/SKILL.md +119 -0
  201. package/skills/07_Computational_Modeling/run_models/SKILL.md +427 -0
  202. package/skills/07_Computational_Modeling/spacenet/SKILL.md +122 -0
  203. package/skills/07_Computational_Modeling/svm/SKILL.md +120 -0
  204. package/skills/08_Computational_Neuroscience/brain_gnn/SKILL.md +183 -0
  205. package/skills/08_Computational_Neuroscience/dipy-tool/SKILL.md +239 -0
  206. package/skills/08_Computational_Neuroscience/dipy-tool/scripts/dti_metrics_reference.py +70 -0
  207. package/skills/08_Computational_Neuroscience/dipy-tool/scripts/load_and_mask_reference.py +76 -0
  208. package/skills/08_Computational_Neuroscience/dipy-tool/scripts/roi_stats_reference.py +59 -0
  209. package/skills/08_Computational_Neuroscience/fm_app/SKILL.md +195 -0
  210. package/skills/08_Computational_Neuroscience/neurostorm/SKILL.md +151 -0
  211. package/skills/13_Visualization/brain-visualization/SKILL.md +191 -0
  212. package/skills/13_Visualization/brain-visualization/scripts/connectome_reference.py +108 -0
  213. package/skills/13_Visualization/brain-visualization/scripts/freesurfer_ply_reference.py +54 -0
  214. package/skills/13_Visualization/brain-visualization/scripts/zalff_summary_reference.py +116 -0
  215. package/skills/13_Visualization/ethoclaw-paper-figure-layout/SKILL.md +78 -0
  216. package/skills/13_Visualization/ethoclaw-paper-figure-layout/assets/naturecomm_figures.tex +74 -0
  217. package/skills/13_Visualization/ethoclaw-paper-figure-layout/scripts/layout_results_foldered.py +579 -0
  218. package/skills/14_Writing/overleaf-skill/SKILL.md +184 -0
  219. package/skills/14_Writing/overleaf-skill/scripts/install.sh +30 -0
  220. package/skills/14_Writing/paper-writing/SKILL.md +146 -0
  221. package/skills/14_Writing/paper-writing/scripts/data_statement_templates.py +164 -0
  222. package/skills/14_Writing/paper-writing/scripts/figure_templates.py +315 -0
  223. package/skills/14_Writing/paper-writing/scripts/nature_figure_style.py +214 -0
  224. package/skills/14_Writing/paper-writing/scripts/section_phrasebank.py +246 -0
  225. package/skills/16_Animal_Behavior/deeplabcut/SKILL.md +154 -0
  226. package/skills/16_Animal_Behavior/deeplabcut/references/3d-pose.md +89 -0
  227. package/skills/16_Animal_Behavior/deeplabcut/references/maDLC.md +123 -0
  228. package/skills/16_Animal_Behavior/deeplabcut/references/modelzoo.md +98 -0
  229. package/skills/16_Animal_Behavior/deeplabcut/references/standard-pipeline.md +165 -0
  230. package/skills/16_Animal_Behavior/deeplabcut/references/utilities.md +146 -0
  231. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/SKILL.md +274 -0
  232. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/report_template_en.html +112 -0
  233. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/report_template_en.md +21 -0
  234. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/cluster-section.md +5 -0
  235. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/heatmap-section.md +5 -0
  236. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/integrated-interpretation.md +3 -0
  237. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/overview.md +3 -0
  238. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/project-summary.md +3 -0
  239. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/radar-section.md +5 -0
  240. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/raw-trajectory.md +3 -0
  241. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/sample-check.md +3 -0
  242. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/single-subject-section.md +3 -0
  243. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/stats-section.md +5 -0
  244. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/epm.md +52 -0
  245. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/fst.md +37 -0
  246. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/nor.md +39 -0
  247. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/oft.md +43 -0
  248. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/tcst.md +45 -0
  249. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/tst.md +36 -0
  250. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/input-types.md +59 -0
  251. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/interpretation-guardrails.md +45 -0
  252. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/metadata-schema.md +57 -0
  253. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/report-sections.md +86 -0
  254. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/section-selection-rules.md +169 -0
  255. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/scripts/build_report_manifest.py +27 -0
  256. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/scripts/render_report.py +34 -0
  257. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/scripts/report_utils.py +1121 -0
  258. package/skills/16_Animal_Behavior/ethoclaw-animal-grounding/SKILL.md +390 -0
  259. package/skills/16_Animal_Behavior/ethoclaw-animal-grounding/reference_code.py +98 -0
  260. package/skills/16_Animal_Behavior/ethoclaw-animal-pose-estimation/SKILL.md +336 -0
  261. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/README.md +21 -0
  262. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/SKILL.md +41 -0
  263. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/batch_kinematic_generator.py +663 -0
  264. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/config.json +19 -0
  265. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/generate_kinematic_parameter.py +401 -0
  266. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/kinematic_generator.py +265 -0
  267. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/SKILL.md +72 -0
  268. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/references/config.example.toml +56 -0
  269. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/scripts/cluster_all_params.py +232 -0
  270. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/scripts/cluster_all_params_from_config.py +236 -0
  271. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-radar-generate/SKILL.md +68 -0
  272. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-radar-generate/references/notes.md +5 -0
  273. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-radar-generate/scripts/plot_h5_radar.py +513 -0
  274. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/SKILL.md +52 -0
  275. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/config.toml +81 -0
  276. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/references/stats-rule.md +18 -0
  277. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/scripts/h5_inspect.py +79 -0
  278. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/scripts/h5_violin_batch.py +624 -0
  279. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/scripts/h5_violin_stats.py +438 -0
  280. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/SKILL.md +280 -0
  281. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/core_scripts/heatmap_trajectory.py +790 -0
  282. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/core_scripts/heatmap_velocity.py +855 -0
  283. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/reference_data/reference_2d.csv +101 -0
  284. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/reference_data/reference_2d.h5 +0 -0
  285. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/reference_data/reference_data_readme.md +126 -0
@@ -0,0 +1,132 @@
1
+ #!/usr/bin/env python3
2
+ """Generate per-subject QC summaries for MS Challenge processing.
3
+
4
+ Checks modality completeness, ground truth presence, and data quality.
5
+ """
6
+ import argparse
7
+ import csv
8
+ import sys
9
+ from pathlib import Path
10
+ from typing import Dict, List
11
+
12
+ EXPECTED_MODALITIES = ["T1", "T2", "FLAIR", "PD"]
13
+
14
+
15
+ def validate_subject(subject_dir: Path, has_ground_truth: bool = True) -> Dict[str, any]:
16
+ """Validate a single subject's data quality."""
17
+ report = {
18
+ "subject": subject_dir.name,
19
+ "n_timepoints": 0,
20
+ "modalities_complete": False,
21
+ "ground_truth_complete": False,
22
+ "excluded": False,
23
+ "exclusion_reasons": [],
24
+ }
25
+
26
+ # Find timepoints
27
+ timepoints = sorted([d for d in subject_dir.iterdir() if d.is_dir()])
28
+ report["n_timepoints"] = len(timepoints)
29
+
30
+ if not timepoints:
31
+ report["excluded"] = True
32
+ report["exclusion_reasons"].append("No timepoints found")
33
+ return report
34
+
35
+ # Check modalities
36
+ all_complete = True
37
+ for tp_dir in timepoints:
38
+ for mod in EXPECTED_MODALITIES:
39
+ mod_files = list(tp_dir.glob(f"*_{mod}.nii.gz"))
40
+ if not mod_files:
41
+ mod_files = list(tp_dir.glob(f"*_{mod.lower()}.nii.gz"))
42
+ if not mod_files:
43
+ all_complete = False
44
+
45
+ report["modalities_complete"] = all_complete
46
+ if not all_complete:
47
+ report["exclusion_reasons"].append("Missing modalities")
48
+
49
+ # Check ground truth
50
+ if has_ground_truth:
51
+ gt_complete = True
52
+ for tp_dir in timepoints:
53
+ lesion_files = list(tp_dir.glob("*_lesion.nii.gz"))
54
+ if not lesion_files:
55
+ gt_complete = False
56
+ break
57
+ report["ground_truth_complete"] = gt_complete
58
+ if not gt_complete:
59
+ report["exclusion_reasons"].append("Missing ground truth")
60
+
61
+ report["excluded"] = len(report["exclusion_reasons"]) > 0
62
+ return report
63
+
64
+
65
+ def main() -> int:
66
+ parser = argparse.ArgumentParser(
67
+ description="Generate QC summaries for MS Challenge."
68
+ )
69
+ parser.add_argument("--input", required=True, help="Path to MS Challenge directory")
70
+ parser.add_argument("--output", required=True, help="Output path for QC summary CSV")
71
+ parser.add_argument("--exclude-output", help="Output path for exclusion list CSV")
72
+ parser.add_argument("--no-ground-truth", action="store_true",
73
+ help="Skip ground truth validation (for test data)")
74
+ args = parser.parse_args()
75
+
76
+ input_dir = Path(args.input).resolve()
77
+ if not input_dir.exists():
78
+ print(f"Input directory not found: {input_dir}", file=sys.stderr)
79
+ return 1
80
+
81
+ # Find subjects
82
+ subjects = sorted([d for d in input_dir.iterdir() if d.is_dir()])
83
+ print(f"Found {len(subjects)} subjects")
84
+
85
+ if not subjects:
86
+ print("[ERROR] No subjects found.", file=sys.stderr)
87
+ return 1
88
+
89
+ # Process each subject
90
+ results = []
91
+ excluded = []
92
+ for sub_dir in subjects:
93
+ report = validate_subject(sub_dir, has_ground_truth=not args.no_ground_truth)
94
+ results.append(report)
95
+ if report["excluded"]:
96
+ excluded.append({
97
+ "subject": report["subject"],
98
+ "reasons": "; ".join(report["exclusion_reasons"]),
99
+ })
100
+
101
+ # Write QC summary
102
+ output_path = Path(args.output).resolve()
103
+ output_path.parent.mkdir(parents=True, exist_ok=True)
104
+
105
+ fieldnames = ["subject", "n_timepoints", "modalities_complete", "ground_truth_complete", "excluded", "exclusion_reasons"]
106
+ with open(output_path, "w", newline="", encoding="utf-8") as f:
107
+ writer = csv.DictWriter(f, fieldnames=fieldnames)
108
+ writer.writeheader()
109
+ for r in results:
110
+ r["exclusion_reasons"] = "; ".join(r["exclusion_reasons"])
111
+ writer.writerow(r)
112
+
113
+ # Write exclusion list
114
+ if args.exclude_output and excluded:
115
+ exclude_path = Path(args.exclude_output).resolve()
116
+ exclude_path.parent.mkdir(parents=True, exist_ok=True)
117
+ with open(exclude_path, "w", newline="", encoding="utf-8") as f:
118
+ writer = csv.DictWriter(f, fieldnames=["subject", "reasons"])
119
+ writer.writeheader()
120
+ writer.writerows(excluded)
121
+
122
+ # Summary
123
+ print(f"\nQC Summary:")
124
+ print(f" Subjects: {len(results)}")
125
+ print(f" Excluded: {len(excluded)}")
126
+ print(f" Output: {output_path}")
127
+
128
+ return 0
129
+
130
+
131
+ if __name__ == "__main__":
132
+ sys.exit(main())
@@ -0,0 +1,116 @@
1
+ #!/usr/bin/env python3
2
+ """Validate MS Lesion Challenge directory structure.
3
+
4
+ Checks directory structure, modality completeness, ground truth presence,
5
+ and longitudinal timepoint consistency.
6
+ """
7
+ import argparse
8
+ import csv
9
+ import sys
10
+ from pathlib import Path
11
+ from typing import Dict, List
12
+
13
+ # Expected modalities
14
+ EXPECTED_MODALITIES = ["T1", "T2", "FLAIR", "PD"]
15
+
16
+
17
+ def validate_subject(subject_dir: Path, has_ground_truth: bool = True) -> Dict[str, any]:
18
+ """Validate a single subject's directory structure."""
19
+ report = {
20
+ "subject": subject_dir.name,
21
+ "timepoints": [],
22
+ "modalities_complete": {},
23
+ "ground_truth_present": {},
24
+ "missing_files": [],
25
+ "warnings": [],
26
+ }
27
+
28
+ # Find timepoints
29
+ timepoints = sorted([d for d in subject_dir.iterdir() if d.is_dir()])
30
+ report["timepoints"] = [tp.name for tp in timepoints]
31
+
32
+ if not timepoints:
33
+ report["warnings"].append("No timepoints found")
34
+ return report
35
+
36
+ for tp_dir in timepoints:
37
+ tp_name = tp_dir.name
38
+ report["modalities_complete"][tp_name] = {}
39
+ report["ground_truth_present"][tp_name] = False
40
+
41
+ # Check each modality
42
+ for mod in EXPECTED_MODALITIES:
43
+ mod_files = list(tp_dir.glob(f"*_{mod}.nii.gz"))
44
+ if not mod_files:
45
+ mod_files = list(tp_dir.glob(f"*_{mod.lower()}.nii.gz"))
46
+ report["modalities_complete"][tp_name][mod] = len(mod_files) > 0
47
+ if not mod_files:
48
+ report["missing_files"].append(f"{tp_name}/*_{mod}.nii.gz")
49
+
50
+ # Check ground truth
51
+ if has_ground_truth:
52
+ lesion_files = list(tp_dir.glob("*_lesion.nii.gz"))
53
+ report["ground_truth_present"][tp_name] = len(lesion_files) > 0
54
+ if not lesion_files and tp_name == report["timepoints"][0]:
55
+ report["warnings"].append(f"Missing ground truth in first timepoint: {tp_name}")
56
+
57
+ return report
58
+
59
+
60
+ def main() -> int:
61
+ parser = argparse.ArgumentParser(
62
+ description="Validate MS Lesion Challenge directory structure."
63
+ )
64
+ parser.add_argument("--input", required=True, help="Path to MS Challenge directory")
65
+ parser.add_argument("--output", required=True, help="Output path for validation CSV")
66
+ parser.add_argument("--no-ground-truth", action="store_true",
67
+ help="Skip ground truth validation (for test data)")
68
+ args = parser.parse_args()
69
+
70
+ input_dir = Path(args.input).resolve()
71
+ if not input_dir.exists():
72
+ print(f"Input directory not found: {input_dir}", file=sys.stderr)
73
+ return 1
74
+
75
+ # Find subjects
76
+ subjects = sorted([d for d in input_dir.iterdir() if d.is_dir()])
77
+ print(f"Found {len(subjects)} subjects in {input_dir}")
78
+
79
+ if not subjects:
80
+ print("[ERROR] No subjects found.", file=sys.stderr)
81
+ return 1
82
+
83
+ # Validate each subject
84
+ results = []
85
+ for sub_dir in subjects:
86
+ report = validate_subject(sub_dir, has_ground_truth=not args.no_ground_truth)
87
+ results.append(report)
88
+
89
+ # Write output
90
+ output_path = Path(args.output).resolve()
91
+ output_path.parent.mkdir(parents=True, exist_ok=True)
92
+
93
+ with open(output_path, "w", newline="", encoding="utf-8") as f:
94
+ writer = csv.writer(f)
95
+ writer.writerow(["subject", "timepoints", "modalities_complete", "ground_truth_present", "warnings"])
96
+ for r in results:
97
+ writer.writerow([
98
+ r["subject"],
99
+ len(r["timepoints"]),
100
+ str(r["modalities_complete"]),
101
+ str(r["ground_truth_present"]),
102
+ "; ".join(r["warnings"]),
103
+ ])
104
+
105
+ # Summary
106
+ total_timepoints = sum(len(r["timepoints"]) for r in results)
107
+ print(f"\nValidation Summary:")
108
+ print(f" Subjects: {len(results)}")
109
+ print(f" Total timepoints: {total_timepoints}")
110
+ print(f" Output: {output_path}")
111
+
112
+ return 0
113
+
114
+
115
+ if __name__ == "__main__":
116
+ sys.exit(main())
@@ -0,0 +1,184 @@
1
+ ---
2
+ name: nibabel-skill
3
+ description: "Use this skill whenever NeuroClaw needs concrete nibabel operations for neuroimaging files: loading and validating NIfTI images, inspecting shapes and affine matrices, saving derived images, converting voxel coordinates to MNI/world coordinates, or reading FreeSurfer geometry and annotation files. Triggers include: 'nibabel', 'inspect NIfTI', 'read affine', 'save nifti', 'voxel to MNI', 'atlas coordinates', 'read FreeSurfer surface', 'read annot', or any request focused on low-level neuroimaging I/O rather than full preprocessing."
4
+ license: MIT License (NeuroClaw custom skill - freely modifiable within the project)
5
+ layer: base
6
+ skill_type: tool
7
+ dependencies: []
8
+ ---
9
+ # Nibabel Skill
10
+
11
+ ## Overview
12
+
13
+ `nibabel-skill` is the NeuroClaw tool skill for low-level neuroimaging file I/O and geometry handling.
14
+
15
+ It is the right skill when the task is about reading or writing NIfTI data, checking image dimensions and affine matrices, extracting atlas-space coordinates, or interacting with FreeSurfer surface and annotation files.
16
+
17
+ This skill is intentionally narrower than `nilearn-tool` and `brain-visualization`:
18
+ - `nibabel-skill` focuses on file structures, affines, voxel/world coordinates, and surface geometry I/O
19
+ - `nilearn-tool` focuses on signal processing, masking, ROI time series, and statistical image workflows
20
+ - `brain-visualization` focuses on final figure generation and mesh export workflows
21
+
22
+ The content is distilled from nibabel-centric patterns that appear repeatedly in `rs-fMRI-Pipeline-Tutorial/`, especially:
23
+ - NIfTI discovery and validation in the multimodal pipeline
24
+ - affine-based ROI center conversion in zALFF regional summaries
25
+ - FreeSurfer geometry and annotation loading for colored surface export
26
+
27
+ ## Agent Reference Rule
28
+
29
+ When the agent needs nibabel-based code, it should start from the curated snippets in `skills/nibabel-skill/scripts/` instead of copying tutorial files with hard-coded paths.
30
+
31
+ Reference snippets available:
32
+ - `scripts/nifti_inspection_reference.py` -> load NIfTI, inspect shape/dtype/affine, save a copied image
33
+ - `scripts/atlas_coordinate_reference.py` -> compute atlas ROI centers and convert voxel coordinates to world coordinates
34
+ - `scripts/freesurfer_io_reference.py` -> read FreeSurfer geometry/annotation and summarize mesh/color-table metadata
35
+
36
+ ## Quick Reference
37
+
38
+ | Task | What it does | Typical input | Expected output |
39
+ |------|--------------|---------------|-----------------|
40
+ | NIfTI inspection | Loads an image and reports shape, dtype, affine, zooms | `.nii` / `.nii.gz` | metadata summary |
41
+ | NIfTI save/export | Saves processed arrays back to NIfTI with an affine | array + affine | output image |
42
+ | Atlas coordinate extraction | Converts ROI voxel centers to atlas/world coordinates | labeled atlas NIfTI | CSV / printed coordinates |
43
+ | FreeSurfer surface I/O | Reads `.pial`, `.white`, `.annot` and summarizes geometry | surface + annot files | geometry summary |
44
+
45
+ ## Installation
46
+
47
+ Install nibabel-related dependencies in the existing `neuroclaw` environment:
48
+
49
+ ```bash
50
+ conda activate neuroclaw
51
+ conda install -n neuroclaw -c conda-forge nibabel numpy pandas -y
52
+ ```
53
+
54
+ Optional companion packages for downstream workflows:
55
+
56
+ ```bash
57
+ conda install -n neuroclaw -c conda-forge nilearn scipy matplotlib -y
58
+ ```
59
+
60
+ ## Core Usage Patterns
61
+
62
+ ### 1. NIfTI Inspection and Validation
63
+
64
+ Recommended when the user needs to verify whether a NIfTI file is 3D or 4D, whether the affine looks valid, or whether an image can be reused in later steps.
65
+
66
+ Typical nibabel operations:
67
+ - `nib.load(...)`
68
+ - `img.shape`
69
+ - `img.affine`
70
+ - `img.get_fdata()`
71
+ - `img.header.get_zooms()`
72
+ - `nib.Nifti1Image(...)`
73
+ - `nib.save(...)`
74
+
75
+ Example command pattern:
76
+
77
+ ```bash
78
+ python skills/nibabel-skill/scripts/nifti_inspection_reference.py \
79
+ --image path/to/image.nii.gz \
80
+ --copy-output outputs/image_copy.nii.gz
81
+ ```
82
+
83
+ ### 2. Atlas ROI Coordinate Extraction
84
+
85
+ Recommended when the task is to convert ROI labels into approximate world or MNI coordinates.
86
+
87
+ Typical nibabel operations:
88
+ - load labeled atlas volumes with `nib.load(...)`
89
+ - find ROI voxels with `numpy.argwhere(...)`
90
+ - compute ROI centers with `numpy.median(...)`
91
+ - convert voxel indices to world coordinates with `nib.affines.apply_affine(...)`
92
+
93
+ Example command pattern:
94
+
95
+ ```bash
96
+ python skills/nibabel-skill/scripts/atlas_coordinate_reference.py \
97
+ --atlas path/to/AAL3v1.nii \
98
+ --labels path/to/AAL3v1.nii.txt \
99
+ --output outputs/atlas_roi_centers.csv
100
+ ```
101
+
102
+ ### 3. FreeSurfer Geometry and Annotation I/O
103
+
104
+ Recommended when the task is to inspect or reuse FreeSurfer surfaces and annotation color tables before later visualization/export steps.
105
+
106
+ Typical nibabel operations:
107
+ - `nibabel.freesurfer.read_geometry(...)`
108
+ - `nibabel.freesurfer.read_annot(...)`
109
+
110
+ Example command pattern:
111
+
112
+ ```bash
113
+ python skills/nibabel-skill/scripts/freesurfer_io_reference.py \
114
+ --surf path/to/lh.pial \
115
+ --annot path/to/lh.aparc.annot
116
+ ```
117
+
118
+ ## Curated Reference Scripts
119
+
120
+ ### `scripts/nifti_inspection_reference.py`
121
+
122
+ Purpose:
123
+ - load NIfTI files safely
124
+ - inspect dimensionality, dtype, zooms, and affine
125
+ - optionally save a copy using the original affine and header
126
+
127
+ Relevant tutorial sources:
128
+ - `rs-fMRI-Pipeline-Tutorial/multimodal_brain_connectivity_pipeline.py`
129
+ - `rs-fMRI-Pipeline-Tutorial/MNI152_zALFF_Brain_Region_Activation_Analysis.py`
130
+
131
+ ### `scripts/atlas_coordinate_reference.py`
132
+
133
+ Purpose:
134
+ - extract ROI ids from a labeled atlas
135
+ - map ROI voxel centers into atlas/world coordinates
136
+ - export a structured CSV table for downstream use
137
+
138
+ Relevant tutorial sources:
139
+ - `rs-fMRI-Pipeline-Tutorial/MNI152_zALFF_Brain_Region_Activation_Analysis.py`
140
+
141
+ ### `scripts/freesurfer_io_reference.py`
142
+
143
+ Purpose:
144
+ - inspect FreeSurfer mesh size and annotation coverage
145
+ - summarize vertex counts, face counts, label ids, and available colors
146
+ - serve as the low-level I/O basis for mesh export workflows
147
+
148
+ Relevant tutorial sources:
149
+ - `rs-fMRI-Pipeline-Tutorial/export_colored_ply_from_freesurfer.py`
150
+
151
+ ## Important Notes & Limitations
152
+
153
+ - `nibabel-skill` is not a replacement for preprocessing tools such as FSL, fMRIPrep, or Nilearn workflows.
154
+ - Affine correctness matters: voxel coordinates are meaningless without the right affine transform.
155
+ - Atlas label files and atlas volumes may not align perfectly by naming convention; always validate label counts.
156
+ - FreeSurfer `.annot` label ids are not always a direct 0..N index into user expectations; inspect the returned tables carefully.
157
+
158
+ ## When to Call This Skill
159
+
160
+ - The agent needs to read or validate a NIfTI image before running downstream analysis.
161
+ - The user asks for affine, shape, dtype, or voxel/world coordinate inspection.
162
+ - The task involves extracting ROI centers from an atlas volume.
163
+ - The task involves reading FreeSurfer surfaces or annotations before mesh export.
164
+
165
+ ## Complementary / Related Skills
166
+
167
+ - `nilearn-tool` -> higher-level masking, ROI extraction, connectivity, GLM workflows
168
+ - `brain-visualization` -> final connectome figures and PLY export workflows
169
+ - `freesurfer-tool` -> full structural processing and recon-all workflows
170
+
171
+ ## Reference
172
+
173
+ This skill is adapted from the nibabel-related code patterns in:
174
+ - rs-fMRI-Pipeline-Tutorial: https://github.com/Karcen/rs-fMRI-Pipeline-Tutorial
175
+
176
+ Curated reference snippets in this skill:
177
+ - `skills/nibabel-skill/scripts/nifti_inspection_reference.py`
178
+ - `skills/nibabel-skill/scripts/atlas_coordinate_reference.py`
179
+ - `skills/nibabel-skill/scripts/freesurfer_io_reference.py`
180
+
181
+ ---
182
+ Created At: 2026-04-14 00:23 HKT
183
+ Last Updated At: 2026-04-14 00:23 HKT
184
+ Author: chengwang96
@@ -0,0 +1,61 @@
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
+
10
+
11
+ def load_labels(label_path: Path) -> list[str]:
12
+ with label_path.open("r", encoding="utf-8", errors="ignore") as handle:
13
+ return [line.strip() for line in handle if line.strip()]
14
+
15
+
16
+ def get_roi_center(atlas_data: np.ndarray, affine: np.ndarray, roi_id: int) -> list[float]:
17
+ coords = np.argwhere(atlas_data == roi_id)
18
+ if len(coords) == 0:
19
+ return [0.0, 0.0, 0.0]
20
+ center = np.median(coords, axis=0)
21
+ xyz = nib.affines.apply_affine(affine, center)
22
+ return np.round(xyz, 2).tolist()
23
+
24
+
25
+ def export_atlas_centers(atlas_path: Path, label_path: Path, output_path: Path) -> None:
26
+ atlas_img = nib.load(str(atlas_path))
27
+ atlas_data = atlas_img.get_fdata()
28
+ labels = load_labels(label_path)
29
+
30
+ roi_ids = sorted(int(value) for value in np.unique(atlas_data) if value > 0)
31
+ rows = []
32
+ for roi_id in roi_ids:
33
+ center = get_roi_center(atlas_data, atlas_img.affine, roi_id)
34
+ label_name = labels[roi_id - 1] if roi_id - 1 < len(labels) else f"ROI_{roi_id}"
35
+ rows.append(
36
+ {
37
+ "Region_ID": roi_id,
38
+ "Region_Name": label_name,
39
+ "MNI_X": center[0],
40
+ "MNI_Y": center[1],
41
+ "MNI_Z": center[2],
42
+ }
43
+ )
44
+
45
+ table = pd.DataFrame(rows)
46
+ output_path.parent.mkdir(parents=True, exist_ok=True)
47
+ table.to_csv(output_path, index=False)
48
+ print(f"Saved atlas ROI centers to: {output_path}")
49
+
50
+
51
+ def main() -> None:
52
+ parser = argparse.ArgumentParser(description="Reference script for atlas ROI center extraction with nibabel.")
53
+ parser.add_argument("--atlas", type=Path, required=True, help="Input atlas NIfTI with integer ROI labels.")
54
+ parser.add_argument("--labels", type=Path, required=True, help="Text file containing ROI labels.")
55
+ parser.add_argument("--output", type=Path, required=True, help="Output CSV for ROI centers.")
56
+ args = parser.parse_args()
57
+ export_atlas_centers(args.atlas, args.labels, args.output)
58
+
59
+
60
+ if __name__ == "__main__":
61
+ main()
@@ -0,0 +1,34 @@
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+ from pathlib import Path
5
+
6
+ import nibabel.freesurfer as fs
7
+ import numpy as np
8
+
9
+
10
+ def summarize_freesurfer_files(surf_path: Path, annot_path: Path) -> None:
11
+ coords, faces = fs.read_geometry(str(surf_path))
12
+ labels, color_table, names = fs.read_annot(str(annot_path))
13
+
14
+ unique_labels = np.unique(labels)
15
+ print(f"Surface: {surf_path}")
16
+ print(f"Vertices: {len(coords)}")
17
+ print(f"Faces: {len(faces)}")
18
+ print(f"Annotation: {annot_path}")
19
+ print(f"Unique annotation ids: {len(unique_labels)}")
20
+ print(f"Color table rows: {len(color_table)}")
21
+ print(f"Annotation names: {len(names)}")
22
+ print(f"Vertex coordinate sample: {coords[0].tolist() if len(coords) else []}")
23
+
24
+
25
+ def main() -> None:
26
+ parser = argparse.ArgumentParser(description="Reference script for FreeSurfer geometry and annotation I/O with nibabel.")
27
+ parser.add_argument("--surf", type=Path, required=True, help="FreeSurfer surface file such as lh.pial.")
28
+ parser.add_argument("--annot", type=Path, required=True, help="FreeSurfer annotation file such as lh.aparc.annot.")
29
+ args = parser.parse_args()
30
+ summarize_freesurfer_files(args.surf, args.annot)
31
+
32
+
33
+ if __name__ == "__main__":
34
+ main()
@@ -0,0 +1,35 @@
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+ from pathlib import Path
5
+
6
+ import nibabel as nib
7
+
8
+
9
+ def inspect_nifti(image_path: Path, copy_output: Path | None = None) -> None:
10
+ image = nib.load(str(image_path))
11
+ print(f"Path: {image_path}")
12
+ print(f"Shape: {image.shape}")
13
+ print(f"Data type: {image.get_data_dtype()}")
14
+ print(f"Zooms: {image.header.get_zooms()}")
15
+ print("Affine:")
16
+ print(image.affine)
17
+
18
+ if copy_output is not None:
19
+ data = image.get_fdata()
20
+ copied = nib.Nifti1Image(data, image.affine, image.header)
21
+ copy_output.parent.mkdir(parents=True, exist_ok=True)
22
+ nib.save(copied, str(copy_output))
23
+ print(f"Saved copy to: {copy_output}")
24
+
25
+
26
+ def main() -> None:
27
+ parser = argparse.ArgumentParser(description="Reference script for NIfTI inspection and save operations with nibabel.")
28
+ parser.add_argument("--image", type=Path, required=True, help="Input NIfTI image (.nii or .nii.gz).")
29
+ parser.add_argument("--copy-output", type=Path, default=None, help="Optional output path for saving an image copy.")
30
+ args = parser.parse_args()
31
+ inspect_nifti(args.image, args.copy_output)
32
+
33
+
34
+ if __name__ == "__main__":
35
+ main()