@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,394 @@
1
+ #!/usr/bin/env python3
2
+ """Reorganize AIBL raw data into BIDS-compliant directory structure.
3
+
4
+ Handles AIBL-style subject IDs, visit names, and multimodal routing
5
+ for T1w MRI and PET (PiB, FDG, tau).
6
+ """
7
+ import argparse
8
+ import json
9
+ import os
10
+ import re
11
+ import shutil
12
+ import sys
13
+ from collections import defaultdict
14
+ from pathlib import Path
15
+ from typing import Dict, List, Optional, Tuple
16
+
17
+ # AIBL visit name -> BIDS session label mapping
18
+ AIBL_SESSION_MAP = {
19
+ "screening": "screening",
20
+ "baseline": "baseline",
21
+ "18month": "18month",
22
+ "18_month": "18month",
23
+ "18-month": "18month",
24
+ "36month": "36month",
25
+ "36_month": "36month",
26
+ "36-month": "36month",
27
+ "54month": "54month",
28
+ "54_month": "54month",
29
+ "54-month": "54month",
30
+ "72month": "72month",
31
+ "72_month": "72month",
32
+ "72-month": "72month",
33
+ }
34
+
35
+ # Modality keywords -> BIDS modality mapping
36
+ MODALITY_PATTERNS = [
37
+ (re.compile(r"T1w|T1|mprage|MPRAGE|SPGR", re.IGNORECASE), "T1w", "anat"),
38
+ (re.compile(r"PET.*PiB|PiB.*PET|pib", re.IGNORECASE), "pet", "pet"),
39
+ (re.compile(r"PET.*FDG|FDG.*PET|fdg", re.IGNORECASE), "pet", "pet"),
40
+ (re.compile(r"PET.*tau|tau.*PET|18F.*AV.*1451|flortaucipir", re.IGNORECASE), "pet", "pet"),
41
+ (re.compile(r"PET|pet", re.IGNORECASE), "pet", "pet"),
42
+ ]
43
+
44
+ SIDECAR_EXTENSIONS = [".json", ".bval", ".bvec", ".tsv"]
45
+
46
+
47
+ def normalize_subject_id(raw_id: str) -> str:
48
+ """Convert AIBL subject ID to BIDS-compatible label.
49
+
50
+ 002_S_0295 -> sub-002S0295
51
+ """
52
+ clean = raw_id.strip()
53
+ if clean.startswith("sub-"):
54
+ clean = clean[4:]
55
+ # Remove underscores and non-alphanumeric characters
56
+ clean = re.sub(r"[^a-zA-Z0-9]", "", clean)
57
+ return f"sub-{clean}"
58
+
59
+
60
+ def normalize_session(visit_name: str) -> str:
61
+ """Convert AIBL visit name to BIDS session label."""
62
+ visit_name = visit_name.strip().lower()
63
+ if visit_name.startswith("ses-"):
64
+ visit_name = visit_name[4:]
65
+
66
+ # Direct match
67
+ if visit_name in AIBL_SESSION_MAP:
68
+ return f"ses-{AIBL_SESSION_MAP[visit_name]}"
69
+
70
+ # Fuzzy match
71
+ for key, val in AIBL_SESSION_MAP.items():
72
+ if key in visit_name or visit_name in key:
73
+ return f"ses-{val}"
74
+
75
+ # Fallback: sanitize
76
+ clean = re.sub(r"[^a-zA-Z0-9]", "", visit_name)
77
+ return f"ses-{clean}"
78
+
79
+
80
+ def detect_pet_tracer(filename: str) -> str:
81
+ """Detect PET tracer from filename."""
82
+ fname = filename.lower()
83
+ if "pib" in fname:
84
+ return "PiB"
85
+ if "fdg" in fname:
86
+ return "FDG"
87
+ if "tau" in fname or "av1451" in fname or "flortaucipir" in fname:
88
+ return "tau"
89
+ return "unknown"
90
+
91
+
92
+ def detect_modality(filename: str) -> Optional[Tuple[str, str, str]]:
93
+ """Detect BIDS modality suffix and folder from filename.
94
+
95
+ Returns (bids_suffix, bids_folder, tracer) or None.
96
+ """
97
+ for pattern, suffix, folder in MODALITY_PATTERNS:
98
+ if pattern.search(filename):
99
+ if folder == "pet":
100
+ tracer = detect_pet_tracer(filename)
101
+ return (suffix, folder, tracer)
102
+ return (suffix, folder, "")
103
+ return None
104
+
105
+
106
+ def find_nifti_files(directory: Path) -> List[Path]:
107
+ """Find all NIfTI files in a directory."""
108
+ results = []
109
+ for f in directory.rglob("*"):
110
+ if f.is_file() and (f.name.endswith(".nii") or f.name.endswith(".nii.gz")):
111
+ results.append(f)
112
+ return results
113
+
114
+
115
+ def copy_with_sidecars(src_nifti: Path, dst_dir: Path, dst_stem: str) -> List[Path]:
116
+ """Copy NIfTI file and its sidecar files to destination."""
117
+ dst_dir.mkdir(parents=True, exist_ok=True)
118
+ copied = []
119
+
120
+ ext = ".nii.gz" if src_nifti.name.endswith(".nii.gz") else ".nii"
121
+ dst_nifti = dst_dir / f"{dst_stem}{ext}"
122
+ if not dst_nifti.exists():
123
+ shutil.copy2(str(src_nifti), str(dst_nifti))
124
+ copied.append(dst_nifti)
125
+
126
+ src_stem = src_nifti.name
127
+ if src_stem.endswith(".nii.gz"):
128
+ src_stem = src_stem[:-7]
129
+ elif src_stem.endswith(".nii"):
130
+ src_stem = src_stem[:-4]
131
+
132
+ for sidecar_ext in SIDECAR_EXTENSIONS:
133
+ src_sidecar = src_nifti.parent / f"{src_stem}{sidecar_ext}"
134
+ if src_sidecar.exists():
135
+ dst_sidecar = dst_dir / f"{dst_stem}{sidecar_ext}"
136
+ if not dst_sidecar.exists():
137
+ shutil.copy2(str(src_sidecar), str(dst_sidecar))
138
+ copied.append(dst_sidecar)
139
+
140
+ return copied
141
+
142
+
143
+ def write_dataset_description(bids_root: Path) -> None:
144
+ """Write BIDS dataset_description.json."""
145
+ desc = {
146
+ "Name": "AIBL (Australian Imaging, Biomarkers and Lifestyle)",
147
+ "BIDSVersion": "1.8.0",
148
+ "DatasetType": "raw",
149
+ "GeneratedBy": [
150
+ {
151
+ "Name": "NeuroClaw aibl-skill",
152
+ "Description": "AIBL raw data reorganized to BIDS structure",
153
+ "Version": "1.0.0",
154
+ }
155
+ ],
156
+ }
157
+ desc_path = bids_root / "dataset_description.json"
158
+ with open(desc_path, "w", encoding="utf-8") as f:
159
+ json.dump(desc, f, indent=2, ensure_ascii=False)
160
+ print(f"[OK] Wrote {desc_path}")
161
+
162
+
163
+ def write_participants_tsv(bids_root: Path, subject_ids: List[str]) -> None:
164
+ """Write BIDS participants.tsv header."""
165
+ tsv_path = bids_root / "participants.tsv"
166
+ with open(tsv_path, "w", encoding="utf-8") as f:
167
+ f.write("participant_id\n")
168
+ for sid in sorted(set(subject_ids)):
169
+ f.write(f"{sid}\n")
170
+ print(f"[OK] Wrote {tsv_path} ({len(set(subject_ids))} participants)")
171
+
172
+
173
+ def detect_subject_layout(input_dir: Path) -> str:
174
+ """Detect whether input follows flat or nested AIBL layout.
175
+
176
+ Returns 'flat' if subject dirs are direct children,
177
+ 'nested' if organized as subject/visit/modality.
178
+ """
179
+ children = list(input_dir.iterdir())
180
+ if not children:
181
+ return "flat"
182
+
183
+ first_child = children[0]
184
+ if first_child.is_dir():
185
+ sub_children = list(first_child.iterdir())
186
+ if sub_children:
187
+ # Check if children look like visit names
188
+ for sc in sub_children:
189
+ if sc.is_dir() and any(
190
+ k in sc.name.lower() for k in ["screening", "baseline", "month", "visit"]
191
+ ):
192
+ return "nested"
193
+ # Check if children look like modality folders
194
+ for sc in sub_children:
195
+ if sc.is_dir() and detect_modality(sc.name):
196
+ return "flat"
197
+
198
+ return "flat"
199
+
200
+
201
+ def process_flat_layout(
202
+ input_dir: Path,
203
+ bids_root: Path,
204
+ participants: List[str],
205
+ dry_run: bool = False,
206
+ ) -> Tuple[int, int, int]:
207
+ """Process flat AIBL layout: subject/modality/files."""
208
+ converted = 0
209
+ skipped = 0
210
+ failed = 0
211
+
212
+ subject_dirs = sorted(
213
+ [p for p in input_dir.iterdir() if p.is_dir() and not p.name.startswith(".")]
214
+ )
215
+
216
+ for subject_dir in subject_dirs:
217
+ sub_label = normalize_subject_id(subject_dir.name)
218
+ participants.append(sub_label)
219
+
220
+ for modality_dir in sorted(subject_dir.iterdir()):
221
+ if not modality_dir.is_dir():
222
+ continue
223
+
224
+ nifti_files = find_nifti_files(modality_dir)
225
+ for nifti in nifti_files:
226
+ result = detect_modality(nifti.name)
227
+ if result is None:
228
+ result = detect_modality(modality_dir.name)
229
+ if result is None:
230
+ print(f"[WARN] {sub_label} | cannot detect modality: {nifti.name}")
231
+ failed += 1
232
+ continue
233
+
234
+ bids_suffix, bids_folder, tracer = result
235
+
236
+ ses_label = "ses-baseline"
237
+
238
+ if bids_folder == "pet":
239
+ dst_stem = f"{sub_label}_{ses_label}_trc-{tracer}_{bids_suffix}"
240
+ else:
241
+ dst_stem = f"{sub_label}_{ses_label}_{bids_suffix}"
242
+
243
+ bids_sub_dir = bids_root / sub_label / ses_label / bids_folder
244
+
245
+ ext = ".nii.gz" if nifti.name.endswith(".nii.gz") else ".nii"
246
+ if (bids_sub_dir / f"{dst_stem}{ext}").exists():
247
+ skipped += 1
248
+ continue
249
+
250
+ if dry_run:
251
+ print(f"[DRY] {sub_label}/{ses_label}/{bids_folder}/{dst_stem}")
252
+ converted += 1
253
+ else:
254
+ copy_with_sidecars(nifti, bids_sub_dir, dst_stem)
255
+ print(f"[OK] {sub_label}/{ses_label}/{bids_folder}/{dst_stem}")
256
+ converted += 1
257
+
258
+ return converted, skipped, failed
259
+
260
+
261
+ def process_nested_layout(
262
+ input_dir: Path,
263
+ bids_root: Path,
264
+ participants: List[str],
265
+ dry_run: bool = False,
266
+ ) -> Tuple[int, int, int]:
267
+ """Process nested AIBL layout: subject/visit/modality/files."""
268
+ converted = 0
269
+ skipped = 0
270
+ failed = 0
271
+
272
+ subject_dirs = sorted(
273
+ [p for p in input_dir.iterdir() if p.is_dir() and not p.name.startswith(".")]
274
+ )
275
+
276
+ for subject_dir in subject_dirs:
277
+ sub_label = normalize_subject_id(subject_dir.name)
278
+ participants.append(sub_label)
279
+
280
+ for visit_dir in sorted(subject_dir.iterdir()):
281
+ if not visit_dir.is_dir():
282
+ continue
283
+
284
+ ses_label = normalize_session(visit_dir.name)
285
+
286
+ for modality_dir in sorted(visit_dir.iterdir()):
287
+ if not modality_dir.is_dir():
288
+ continue
289
+
290
+ nifti_files = find_nifti_files(modality_dir)
291
+ if not nifti_files:
292
+ nifti_files = find_nifti_files(visit_dir)
293
+ nifti_files = [f for f in nifti_files if f.parent == modality_dir]
294
+
295
+ for nifti in nifti_files:
296
+ result = detect_modality(nifti.name)
297
+ if result is None:
298
+ result = detect_modality(modality_dir.name)
299
+ if result is None:
300
+ print(
301
+ f"[WARN] {sub_label}/{ses_label} | cannot detect modality: {nifti.name}"
302
+ )
303
+ failed += 1
304
+ continue
305
+
306
+ bids_suffix, bids_folder, tracer = result
307
+
308
+ if bids_folder == "pet":
309
+ dst_stem = f"{sub_label}_{ses_label}_trc-{tracer}_{bids_suffix}"
310
+ else:
311
+ dst_stem = f"{sub_label}_{ses_label}_{bids_suffix}"
312
+
313
+ bids_sub_dir = bids_root / sub_label / ses_label / bids_folder
314
+
315
+ ext = ".nii.gz" if nifti.name.endswith(".nii.gz") else ".nii"
316
+ if (bids_sub_dir / f"{dst_stem}{ext}").exists():
317
+ skipped += 1
318
+ continue
319
+
320
+ if dry_run:
321
+ print(
322
+ f"[DRY] {sub_label}/{ses_label}/{bids_folder}/{dst_stem}"
323
+ )
324
+ converted += 1
325
+ else:
326
+ copy_with_sidecars(nifti, bids_sub_dir, dst_stem)
327
+ print(
328
+ f"[OK] {sub_label}/{ses_label}/{bids_folder}/{dst_stem}"
329
+ )
330
+ converted += 1
331
+
332
+ return converted, skipped, failed
333
+
334
+
335
+ def main() -> int:
336
+ parser = argparse.ArgumentParser(
337
+ description="Reorganize AIBL raw data into BIDS-compliant structure."
338
+ )
339
+ parser.add_argument(
340
+ "--input",
341
+ required=True,
342
+ help="Path to AIBL raw data directory",
343
+ )
344
+ parser.add_argument(
345
+ "--output",
346
+ required=True,
347
+ help="Path to output BIDS directory",
348
+ )
349
+ parser.add_argument(
350
+ "--participants-file",
351
+ help="Optional: path to AIBL phenotype file for participant metadata",
352
+ )
353
+ parser.add_argument(
354
+ "--dry-run",
355
+ action="store_true",
356
+ help="Preview without copying files",
357
+ )
358
+ args = parser.parse_args()
359
+
360
+ input_dir = Path(args.input).resolve()
361
+ output_dir = Path(args.output).resolve()
362
+
363
+ if not input_dir.exists() or not input_dir.is_dir():
364
+ print(f"Input directory does not exist: {input_dir}", file=sys.stderr)
365
+ return 1
366
+
367
+ output_dir.mkdir(parents=True, exist_ok=True)
368
+ participants: List[str] = []
369
+
370
+ layout = detect_subject_layout(input_dir)
371
+ print(f"Detected layout: {layout}")
372
+ print(f"Input: {input_dir}")
373
+ print(f"Output: {output_dir}")
374
+ print(f"{'[DRY RUN] ' if args.dry_run else ''}Starting reorganization...\n")
375
+
376
+ if layout == "nested":
377
+ converted, skipped, failed = process_nested_layout(
378
+ input_dir, output_dir, participants, args.dry_run
379
+ )
380
+ else:
381
+ converted, skipped, failed = process_flat_layout(
382
+ input_dir, output_dir, participants, args.dry_run
383
+ )
384
+
385
+ if not args.dry_run and converted > 0:
386
+ write_dataset_description(output_dir)
387
+ write_participants_tsv(output_dir, participants)
388
+
389
+ print(f"\nDone. Converted={converted}, Skipped={skipped}, Failed={failed}")
390
+ return 0 if failed == 0 else 2
391
+
392
+
393
+ if __name__ == "__main__":
394
+ sys.exit(main())
@@ -0,0 +1,292 @@
1
+ ---
2
+ name: aomic-skill
3
+ description: "Use this skill whenever the user wants an end-to-end workflow for the AOMIC (Amsterdam Open MRI Collection) dataset, including data access, BIDS organization, and multimodal processing of sMRI, rs-fMRI, and task-fMRI. Triggers include: 'AOMIC', 'AOMIC data', 'process AOMIC', 'AOMIC fMRI', 'AOMIC resting state', or any request to run the AOMIC multimodal pipeline. This is the NeuroClaw dataset-orchestration layer for AOMIC."
4
+ license: MIT License (NeuroClaw custom skill - freely modifiable within the project)
5
+ layer: subagent
6
+ skill_type: dataset
7
+ dependencies:
8
+ - smri-skill
9
+ - fmri-skill
10
+ - bids-organizer
11
+ - claw-shell
12
+ ---
13
+ # AOMIC Skill (Dataset-Orchestration Layer)
14
+
15
+ ## Overview
16
+ `aomic-skill` is the NeuroClaw orchestration skill for the **AOMIC (Amsterdam Open MRI Collection)** dataset.
17
+
18
+ It coordinates a fixed three-phase workflow:
19
+ 1. Guide AOMIC data access and download from OpenNeuro / the AOMIC repository.
20
+ 2. Prepare and validate BIDS-style data organization for downstream processing.
21
+ 3. Delegate modality pipelines to `smri-skill` and `fmri-skill`.
22
+
23
+ It also provides **phenotype extraction** and **QC integration** paths:
24
+ - Extract and merge AOMIC phenotype tables (Big Five personality traits, fluid intelligence, demographics).
25
+ - Generate per-subject QC summaries with exclusion lists.
26
+
27
+ This skill follows NeuroClaw hierarchy:
28
+ - Defines **WHAT to do**, not low-level implementation details.
29
+ - Does **not** execute direct shell commands itself.
30
+ - Delegates all execution via `claw-shell` to base/tool skills.
31
+
32
+ **Research use only.**
33
+
34
+ ---
35
+
36
+ ## Download Stage (Mandatory First Step)
37
+
38
+ ### Source
39
+ AOMIC data is publicly available:
40
+ - Website: https://nilab-uva.github.io/AOMIC.github.io/
41
+ - OpenNeuro derivatives: https://openneuro.org/
42
+ - Data access: direct download, no authentication required for most components
43
+
44
+ ### Supported AOMIC Sub-datasets
45
+ - **AOMIC-ID1000**: ~1,000 participants with T1w, rs-fMRI, task-fMRI (emotion, gambling, motor, language tasks), Big Five personality, Raven's progressive matrices
46
+ - **AOMIC-PIOP1**: T1w, rs-fMRI, task-fMRI (emotion, working memory), personality and cognitive data
47
+ - **AOMIC-PIOP2**: T1w, rs-fMRI, task-fMRI (emotion, working memory), personality and cognitive data
48
+
49
+ ### Delegation Rules for Download
50
+ - Environment/setup checks: `dependency-planner` + `conda-env-manager`
51
+ - Download tool installation and execution: `claw-shell`
52
+ - Optional raw-data organization to BIDS-style staging: `bids-organizer`
53
+
54
+ ### Download Inputs to Confirm in Plan
55
+ - Target sub-dataset (ID1000, PIOP1, PIOP2, or all)
56
+ - Subject list scope (full cohort or custom subset)
57
+ - Destination directory with sufficient disk space
58
+
59
+ ---
60
+
61
+ ## Narrow Path: AOMIC Raw Data -> BIDS Staging
62
+
63
+ Use this path when the task only asks to reorganize raw AOMIC files into a BIDS-style dataset and does not require preprocessing, ROI extraction, phenotype merging, or downstream analysis.
64
+
65
+ ### When this narrow path should dominate
66
+ - The task objective is limited to AOMIC data staging, BIDS renaming, sidecar handling, and dataset-level metadata.
67
+ - Inputs are already local AOMIC files or AOMIC-style subject folders.
68
+ - The required deliverable is a direct staging script or command sequence, not a plan for preprocessing or downstream analysis.
69
+
70
+ ### Narrow-path contract
71
+ - Do not widen the solution to preprocessing, ROI extraction, phenotype merging, or downstream analysis unless the task explicitly requires them.
72
+ - Treat this as a direct file-organization problem: scan AOMIC subject layout, normalize subject labels, map modalities to BIDS names, copy or symlink files plus matching sidecars, and write dataset-level metadata plus staging logs.
73
+ - If the task is benchmark-style, prefer a single direct end-to-end staging script over a confirmation-first orchestration plan.
74
+
75
+ ### Expected narrow-path behavior
76
+ 1. Detect AOMIC subject IDs (e.g., `sub-0001`) and validate BIDS compliance.
77
+ 2. Detect session/task information from directory structure and filenames.
78
+ 3. Route modalities:
79
+ - T1w -> `anat/*_T1w`
80
+ - rs-fMRI -> `func/*_task-rest_bold`
81
+ - task-fMRI -> `func/*_task-<taskname>_bold` (emotion, gambling, motor, language, workingmemory)
82
+ 4. Preserve or rename matching JSON sidecars and physiological recordings when available.
83
+ 5. Emit dataset-level outputs such as `dataset_description.json`, `participants.tsv`, `README`, and a manifest or skipped-file report.
84
+
85
+ ---
86
+
87
+ ## Core Workflow (Never Bypassed)
88
+ 1. Identify user target: full AOMIC processing, specific sub-dataset, phenotype extraction, or BIDS staging only.
89
+ 2. Generate a numbered plan with tools, outputs, runtime, storage, and risks.
90
+ 3. Wait for explicit confirmation (`YES` / `execute` / `proceed`).
91
+ 4. On confirmation, run download stage first (if needed).
92
+ 5. After download success, run BIDS preparation using `scripts/reorganize_aomic.py`.
93
+ 6. Delegate sequentially or in parallel to:
94
+ - `smri-skill` for structural MRI (T1w)
95
+ - `fmri-skill` for functional MRI (rs-fMRI, task-fMRI)
96
+ 7. If phenotype extraction is requested, run `scripts/extract_aomic_phenotype.py`.
97
+ 8. If QC summary is requested, run `scripts/aomic_qc_summary.py`.
98
+ 9. Save outputs into an AOMIC-centered structure under `aomic_output/`.
99
+
100
+ ---
101
+
102
+ ## Input Layout (Example)
103
+
104
+ Subject `sub-0001` (T1w + rs-fMRI + task-fMRI):
105
+
106
+ ```
107
+ aomic_raw/
108
+ sub-0001/
109
+ anat/
110
+ sub-0001_T1w.nii.gz
111
+ sub-0001_T1w.json
112
+ func/
113
+ sub-0001_task-rest_bold.nii.gz
114
+ sub-0001_task-rest_bold.json
115
+ sub-0001_task-emotion_bold.nii.gz
116
+ sub-0001_task-emotion_bold.json
117
+ sub-0001_task-gambling_bold.nii.gz
118
+ sub-0001_task-gambling_bold.json
119
+ sub-0001_task-motor_bold.nii.gz
120
+ sub-0001_task-motor_bold.json
121
+ sub-0001_task-language_bold.nii.gz
122
+ sub-0001_task-language_bold.json
123
+ phenotype/
124
+ big_five.csv
125
+ ravens.csv
126
+ demographics.csv
127
+ ```
128
+
129
+ ---
130
+
131
+ ## BIDS Preparation
132
+
133
+ ### Script: `scripts/reorganize_aomic.py`
134
+
135
+ Validates and reorganizes AOMIC data into BIDS-compliant layout.
136
+
137
+ ```bash
138
+ python skills/aomic-skill/scripts/reorganize_aomic.py \
139
+ --input /path/to/aomic_raw \
140
+ --output /path/to/aomic_bids \
141
+ --participants-file /path/to/aomic_raw/phenotype/demographics.csv
142
+ ```
143
+
144
+ Features:
145
+ - Subject ID validation (BIDS-compliant `sub-XXXX` format)
146
+ - Session/task detection from directory structure and filenames
147
+ - Modality routing: T1w, rs-fMRI, task-fMRI (emotion, gambling, motor, language, workingmemory)
148
+ - Sidecar JSON preservation and validation
149
+ - Physiological recording file handling
150
+ - `dataset_description.json` and `participants.tsv` generation
151
+ - Dry-run mode: `--dry-run` to preview without copying
152
+
153
+ ---
154
+
155
+ ## Modality Processing Delegation
156
+
157
+ After BIDS staging completes, `aomic-skill` delegates by modality:
158
+
159
+ | Modality | Delegated skill | Typical tasks | Main outputs |
160
+ |---|---|---|---|
161
+ | sMRI (T1w) | `smri-skill` | brain extraction, tissue segmentation, cortical reconstruction, ROI morphometry | `smri_output/` derivatives and stats |
162
+ | fMRI (rs-fMRI/task-fMRI) | `fmri-skill` | preprocessing, denoising, ROI time series, connectivity, task GLM | `fmri_output/` derivatives, timeseries, connectivity |
163
+
164
+ ### Delegation Strategy
165
+ - If user asks for full multimodal AOMIC analysis: run sMRI -> fMRI in ordered phases.
166
+ - If user asks for one modality only: call only the corresponding modality skill.
167
+ - Task-fMRI analysis should use task-specific event files (emotion, gambling, motor, language, workingmemory).
168
+
169
+ ---
170
+
171
+ ## Phenotype Extraction
172
+
173
+ ### Script: `scripts/extract_aomic_phenotype.py`
174
+
175
+ Extracts and merges AOMIC phenotype tables for downstream analysis.
176
+
177
+ ```bash
178
+ python skills/aomic-skill/scripts/extract_aomic_phenotype.py \
179
+ --phenotype-dir /path/to/aomic_raw/phenotype \
180
+ --output /path/to/aomic_output/phenotype/merged_phenotype.csv \
181
+ --columns subject_id,age,sex,openness,conscientiousness,extraversion,agreeableness,neuroticism,ravens_score \
182
+ --imaging-ids /path/to/aomic_output/bids/participants.tsv
183
+ ```
184
+
185
+ Features:
186
+ - Reads AOMIC phenotype CSV/TSV files (Big Five, Raven's, demographics)
187
+ - Column selection and renaming
188
+ - Missing value handling (filter or impute)
189
+ - Cross-reference with imaging subject list to keep only subjects with both imaging and phenotype data
190
+ - Outputs merged CSV ready for statistical analysis or model training
191
+
192
+ ---
193
+
194
+ ## QC Integration
195
+
196
+ ### Script: `scripts/aomic_qc_summary.py`
197
+
198
+ Generates per-subject QC summaries and exclusion lists.
199
+
200
+ ```bash
201
+ python skills/aomic-skill/scripts/aomic_qc_summary.py \
202
+ --fmriprep-dir /path/to/aomic_output/fmriprep \
203
+ --freesurfer-dir /path/to/aomic_output/smri/freesurfer \
204
+ --output /path/to/aomic_output/qc/qc_summary.csv \
205
+ --exclude-output /path/to/aomic_output/qc/exclude_list.csv \
206
+ --fd-threshold 0.3
207
+ ```
208
+
209
+ Features:
210
+ - Reads fMRIPrep confounds (framewise displacement, DVARS)
211
+ - Reads FreeSurfer recon-all QC metrics
212
+ - Structural quality assessment
213
+ - Applies exclusion criteria: motion threshold (FD), structural quality
214
+ - Outputs per-subject QC summary CSV and exclusion list CSV
215
+
216
+ ---
217
+
218
+ ## Recommended Output Layout
219
+ All assets should be organized under `./aomic_output/`:
220
+ - `aomic_output/raw/` (downloaded original AOMIC files)
221
+ - `aomic_output/bids/` (staged BIDS data)
222
+ - `aomic_output/smri/` (links or copies from `smri_output/`)
223
+ - `aomic_output/fmri/` (links or copies from `fmri_output/`)
224
+ - `aomic_output/phenotype/` (merged phenotype tables)
225
+ - `aomic_output/qc/` (QC summaries and exclusion lists)
226
+ - `aomic_output/logs/` (download + orchestration logs)
227
+
228
+ ---
229
+
230
+ ## Benchmark Adapter Guidance
231
+
232
+ For benchmark-style prompts, do not force the full `download -> staging -> multimodal processing` orchestration when the task is only asking for local AOMIC data staging or organization.
233
+
234
+ - If the task starts from raw AOMIC data already present on disk and only asks for BIDS-style staging / organization:
235
+ - skip the mandatory download stage
236
+ - do not automatically delegate to `smri-skill` or `fmri-skill`
237
+ - default to the narrow path `local raw AOMIC discovery -> BIDS-style staging -> minimal metadata -> validation/report`
238
+ - In benchmark mode, do not require explicit confirmation before presenting the direct staging solution.
239
+ - Preserve the AOMIC-centered output contract under `aomic_output/bids/` when the task is specifically a staging benchmark.
240
+ - Only use the full multimodal orchestration and confirmation-heavy workflow when the prompt explicitly asks for download, end-to-end multimodal AOMIC processing, or post-staging structural / functional analysis.
241
+
242
+ ---
243
+
244
+ ## Safety and Execution Policy
245
+ - No execution before explicit plan confirmation.
246
+ - All execution must be routed via `claw-shell`.
247
+ - Missing dependencies must be resolved by `dependency-planner` before running.
248
+ - If download fails for partial subjects, continue batch with clear failure report and retry list.
249
+
250
+ ---
251
+
252
+ ## Important Notes and Limitations
253
+ - AOMIC data is already in BIDS format for many components; the reorganize script primarily validates and handles edge cases.
254
+ - AOMIC has multiple sub-datasets (ID1000, PIOP1, PIOP2) with slightly different task paradigms and phenotype measures.
255
+ - Task-fMRI event files (.tsv) must be preserved alongside BOLD data for proper task analysis.
256
+ - Some AOMIC components include physiological recordings (cardiac, respiration) that can be used for advanced denoising.
257
+ - `aomic-skill` is orchestration-only; detailed preprocessing logic remains in `smri-skill` and `fmri-skill`.
258
+
259
+ ---
260
+
261
+ ## When to Call This Skill
262
+ - User asks for end-to-end AOMIC workflow.
263
+ - User asks to process AOMIC MRI data (sMRI, rs-fMRI, task-fMRI).
264
+ - User needs BIDS staging for raw AOMIC files.
265
+ - User asks to extract and merge AOMIC phenotype tables (personality, cognition, demographics).
266
+ - User asks for AOMIC-specific QC summaries and exclusion lists.
267
+ - User needs a single entry point for AOMIC multimodal orchestration.
268
+
269
+ ---
270
+
271
+ ## Complementary / Related Skills
272
+ - `smri-skill`
273
+ - `fmri-skill`
274
+ - `bids-organizer`
275
+ - `fmriprep-tool`
276
+ - `freesurfer-tool`
277
+ - `nilearn-tool`
278
+ - `brain-visualization`
279
+ - `dependency-planner`
280
+ - `conda-env-manager`
281
+ - `claw-shell`
282
+
283
+ ---
284
+
285
+ ## Reference
286
+ - AOMIC: https://nilab-uva.github.io/AOMIC.github.io/
287
+ - OpenNeuro: https://openneuro.org/
288
+ - BIDS spec: https://bids.neuroimaging.io/
289
+
290
+ Created At: 2026-05-06 11:24 HKT
291
+ Last Updated At: 2026-05-06 11:24 HKT
292
+ Author: chengwang96