@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,145 @@
1
+ #!/usr/bin/env python3
2
+ """Extract and merge UCLA CNP phenotype data.
3
+
4
+ Reads UCLA CNP phenotype files (diagnosis, cognitive battery, behavioral)
5
+ and produces a merged phenotype table aligned with imaging subject list.
6
+ """
7
+ import argparse
8
+ import csv
9
+ import sys
10
+ from pathlib import Path
11
+ from typing import Dict, List, Optional
12
+
13
+ COLUMN_MAP = {
14
+ "subject_id": ["subject", "Subject", "participant_id", "SubID"],
15
+ "age": ["age", "Age"],
16
+ "sex": ["sex", "Sex", "Gender"],
17
+ "race": ["race", "Race"],
18
+ "ethnicity": ["ethnicity", "Ethnicity"],
19
+ "handedness": ["handedness", "Handedness"],
20
+ "diagnosis": ["diagnosis", "Diagnosis", "Group", "DX"],
21
+ "diagnosis_detail": ["diagnosis_detail", "Diagnosis_Detail"],
22
+ # Cognitive battery
23
+ "digit_span_fwd": ["DigitSpan_Forward", "digit_span_fwd"],
24
+ "digit_span_bwd": ["DigitSpan_Backward", "digit_span_bwd"],
25
+ "trail_a": ["TrailA", "trail_a"],
26
+ "trail_b": ["TrailB", "trail_b"],
27
+ "cpt_dprime": ["CPT_dprime", "cpt_dprime"],
28
+ "lns": ["LNS", "lns"],
29
+ # Task performance
30
+ "stopsignal_srt": ["StopSignal_SRT", "stopsignal_srt"],
31
+ "stopsignal_ssrt": ["StopSignal_SSRT", "stopsignal_ssrt"],
32
+ "spatialwm_accuracy": ["SpatialWM_Acc", "spatialwm_accuracy"],
33
+ "facememory_accuracy": ["FaceMem_Acc", "facememory_accuracy"],
34
+ # Clinical
35
+ "bdi": ["BDI", "bdi"],
36
+ "bai": ["BAI", "bai"],
37
+ "panss_positive": ["PANSS_Pos", "panss_positive"],
38
+ "panss_negative": ["PANSS_Neg", "panss_negative"],
39
+ "panss_general": ["PANSS_Gen", "panss_general"],
40
+ "ymrs": ["YMRS", "ymrs"],
41
+ }
42
+
43
+
44
+ def load_csv(path: Path) -> List[Dict[str, str]]:
45
+ delimiter = "\t" if path.suffix == ".tsv" else ","
46
+ with open(path, "r", encoding="utf-8") as f:
47
+ reader = csv.DictReader(f, delimiter=delimiter)
48
+ return list(reader)
49
+
50
+
51
+ def find_column(row: Dict[str, str], candidates: List[str]) -> Optional[str]:
52
+ for col in candidates:
53
+ if col in row:
54
+ return col
55
+ return None
56
+
57
+
58
+ def extract_phenotype(
59
+ phenotype_files: List[Path],
60
+ imaging_ids: Optional[List[str]] = None,
61
+ columns: Optional[List[str]] = None,
62
+ ) -> List[Dict[str, str]]:
63
+ all_data = []
64
+ for fpath in phenotype_files:
65
+ rows = load_csv(fpath)
66
+ all_data.extend(rows)
67
+
68
+ if not all_data:
69
+ return []
70
+
71
+ target_columns = columns if columns else list(COLUMN_MAP.keys())
72
+ merged = {}
73
+
74
+ for row in all_data:
75
+ subj_col = find_column(row, COLUMN_MAP["subject_id"])
76
+ if subj_col is None:
77
+ continue
78
+ subj_id = row[subj_col].strip()
79
+ if not subj_id:
80
+ continue
81
+
82
+ if subj_id not in merged:
83
+ merged[subj_id] = {"subject_id": subj_id}
84
+
85
+ for target_col in target_columns:
86
+ if target_col == "subject_id":
87
+ continue
88
+ if target_col in merged[subj_id] and merged[subj_id][target_col]:
89
+ continue
90
+ candidates = COLUMN_MAP.get(target_col, [target_col])
91
+ src_col = find_column(row, candidates)
92
+ if src_col and row.get(src_col, "").strip():
93
+ merged[subj_id][target_col] = row[src_col].strip()
94
+
95
+ result = list(merged.values())
96
+ if imaging_ids:
97
+ imaging_set = set(imaging_ids)
98
+ result = [r for r in result if r["subject_id"] in imaging_set]
99
+ return result
100
+
101
+
102
+ def main() -> int:
103
+ parser = argparse.ArgumentParser(description="Extract UCLA CNP phenotype data.")
104
+ parser.add_argument("--phenotype-files", required=True, nargs="+")
105
+ parser.add_argument("--output", required=True)
106
+ parser.add_argument("--imaging-ids")
107
+ parser.add_argument("--columns")
108
+ args = parser.parse_args()
109
+
110
+ phenotype_files = [Path(f).resolve() for f in args.phenotype_files]
111
+ for f in phenotype_files:
112
+ if not f.exists():
113
+ print(f"File not found: {f}", file=sys.stderr)
114
+ return 1
115
+
116
+ imaging_ids = None
117
+ if args.imaging_ids:
118
+ id_file = Path(args.imaging_ids).resolve()
119
+ if id_file.exists():
120
+ imaging_ids = [l.strip() for l in id_file.read_text().splitlines() if l.strip()]
121
+
122
+ columns = None
123
+ if args.columns:
124
+ columns = [c.strip() for c in args.columns.split(",")]
125
+
126
+ merged = extract_phenotype(phenotype_files, imaging_ids, columns)
127
+ if not merged:
128
+ print("[ERROR] No phenotype data extracted.", file=sys.stderr)
129
+ return 1
130
+
131
+ output_path = Path(args.output).resolve()
132
+ output_path.parent.mkdir(parents=True, exist_ok=True)
133
+ fieldnames = list(merged[0].keys())
134
+ with open(output_path, "w", newline="", encoding="utf-8") as f:
135
+ writer = csv.DictWriter(f, fieldnames=fieldnames)
136
+ writer.writeheader()
137
+ writer.writerows(merged)
138
+
139
+ diag_groups = set(r.get("diagnosis", "") for r in merged if r.get("diagnosis"))
140
+ print(f"Phenotype: {len(merged)} subjects, {len(fieldnames)} columns, {len(diag_groups)} groups -> {output_path}")
141
+ return 0
142
+
143
+
144
+ if __name__ == "__main__":
145
+ sys.exit(main())
@@ -0,0 +1,111 @@
1
+ #!/usr/bin/env python3
2
+ """Generate per-subject QC summaries for UCLA CNP processing.
3
+
4
+ Multi-disorder: tracks diagnostic group and applies appropriate QC criteria.
5
+ """
6
+ import argparse
7
+ import csv
8
+ import sys
9
+ from pathlib import Path
10
+ from typing import Dict, List
11
+
12
+
13
+ def load_confounds(confounds_path: Path) -> Dict[str, float]:
14
+ metrics = {"fd_mean": float("nan"), "fd_max": float("nan")}
15
+ try:
16
+ import pandas as pd
17
+ df = pd.read_csv(confounds_path, sep="\t")
18
+ if "framewise_displacement" in df.columns:
19
+ fd = df["framewise_displacement"].dropna()
20
+ metrics["fd_mean"] = float(fd.mean())
21
+ metrics["fd_max"] = float(fd.max())
22
+ except Exception:
23
+ pass
24
+ return metrics
25
+
26
+
27
+ def check_exclusion(metrics: Dict[str, float], fd_threshold: float = 0.3) -> List[str]:
28
+ reasons = []
29
+ if not (metrics["fd_mean"] != metrics["fd_mean"]):
30
+ if metrics["fd_mean"] > fd_threshold:
31
+ reasons.append(f"FD mean {metrics['fd_mean']:.3f} > {fd_threshold}")
32
+ return reasons
33
+
34
+
35
+ def main() -> int:
36
+ parser = argparse.ArgumentParser(description="Generate QC summaries for UCLA CNP processing.")
37
+ parser.add_argument("--fmriprep-dir", help="Path to fMRIPrep output directory")
38
+ parser.add_argument("--output", required=True)
39
+ parser.add_argument("--exclude-output")
40
+ parser.add_argument("--fd-threshold", type=float, default=0.3)
41
+ parser.add_argument("--diagnosis-file", help="CSV with subject diagnosis info")
42
+ args = parser.parse_args()
43
+
44
+ output_path = Path(args.output).resolve()
45
+ output_path.parent.mkdir(parents=True, exist_ok=True)
46
+
47
+ diagnosis_map = {}
48
+ if args.diagnosis_file:
49
+ diag_path = Path(args.diagnosis_file).resolve()
50
+ if diag_path.exists():
51
+ with open(diag_path, "r", encoding="utf-8") as f:
52
+ reader = csv.DictReader(f)
53
+ for row in reader:
54
+ subj = row.get("subject_id") or row.get("Subject", "")
55
+ diag = row.get("diagnosis") or row.get("Diagnosis") or row.get("Group", "")
56
+ if subj and diag:
57
+ diagnosis_map[subj] = diag
58
+
59
+ subjects = set()
60
+ if args.fmriprep_dir:
61
+ fmriprep_dir = Path(args.fmriprep_dir).resolve()
62
+ if fmriprep_dir.exists():
63
+ for d in fmriprep_dir.glob("sub-*"):
64
+ if d.is_dir():
65
+ subjects.add(d.name)
66
+
67
+ if not subjects:
68
+ print("[WARN] No subjects found.", file=sys.stderr)
69
+ return 1
70
+
71
+ results = []
72
+ excluded = []
73
+ for subj in sorted(subjects):
74
+ metrics = {"subject_id": subj}
75
+ if diagnosis_map:
76
+ metrics["diagnosis"] = diagnosis_map.get(subj, "unknown")
77
+
78
+ if args.fmriprep_dir:
79
+ confounds_files = list(Path(args.fmriprep_dir).glob(f"{subj}/func/*_desc-confounds_timeseries.tsv"))
80
+ if confounds_files:
81
+ metrics.update(load_confounds(confounds_files[0]))
82
+
83
+ exclusion_reasons = check_exclusion(metrics, args.fd_threshold)
84
+ metrics["excluded"] = len(exclusion_reasons) > 0
85
+ metrics["exclusion_reasons"] = "; ".join(exclusion_reasons)
86
+
87
+ results.append(metrics)
88
+ if exclusion_reasons:
89
+ excluded.append({"subject_id": subj, "reasons": "; ".join(exclusion_reasons)})
90
+
91
+ if results:
92
+ fieldnames = list(results[0].keys())
93
+ with open(output_path, "w", newline="", encoding="utf-8") as f:
94
+ writer = csv.DictWriter(f, fieldnames=fieldnames)
95
+ writer.writeheader()
96
+ writer.writerows(results)
97
+ print(f"QC: {len(results)} subjects, {len(excluded)} excluded -> {output_path}")
98
+
99
+ if args.exclude_output and excluded:
100
+ exclude_path = Path(args.exclude_output).resolve()
101
+ exclude_path.parent.mkdir(parents=True, exist_ok=True)
102
+ with open(exclude_path, "w", newline="", encoding="utf-8") as f:
103
+ writer = csv.DictWriter(f, fieldnames=["subject_id", "reasons"])
104
+ writer.writeheader()
105
+ writer.writerows(excluded)
106
+
107
+ return 0
108
+
109
+
110
+ if __name__ == "__main__":
111
+ sys.exit(main())
@@ -0,0 +1,113 @@
1
+ #!/usr/bin/env python3
2
+ """Validate UCLA CNP BIDS structure and generate compliance report.
3
+
4
+ Checks directory structure, modality completeness, and task paradigm presence.
5
+ """
6
+ import argparse
7
+ import csv
8
+ import sys
9
+ from pathlib import Path
10
+ from typing import Dict, List
11
+
12
+ EXPECTED_TASKS = ["stopsignal", "spatialwm", "facememory", "barts", "taskswitch"]
13
+
14
+
15
+ def validate_subject(subject_dir: Path) -> Dict[str, any]:
16
+ report = {
17
+ "subject": subject_dir.name,
18
+ "anat_complete": False,
19
+ "task_fMRI_present": False,
20
+ "dwi_present": False,
21
+ "n_task_runs": 0,
22
+ "tasks_found": [],
23
+ "missing_files": [],
24
+ "warnings": [],
25
+ }
26
+
27
+ anat_dir = subject_dir / "anat"
28
+ if anat_dir.exists():
29
+ t1w_files = list(anat_dir.glob("*_T1w.nii.gz"))
30
+ report["anat_complete"] = len(t1w_files) > 0
31
+ if not t1w_files:
32
+ report["missing_files"].append("anat/*_T1w.nii.gz")
33
+ else:
34
+ report["missing_files"].append("anat/")
35
+
36
+ func_dir = subject_dir / "func"
37
+ if func_dir.exists():
38
+ bold_files = list(func_dir.glob("*_bold.nii.gz"))
39
+ report["n_task_runs"] = len(bold_files)
40
+
41
+ tasks_found = set()
42
+ for f in bold_files:
43
+ name = f.name
44
+ for task in EXPECTED_TASKS:
45
+ if f"task-{task}" in name:
46
+ tasks_found.add(task)
47
+ report["tasks_found"] = sorted(tasks_found)
48
+ report["task_fMRI_present"] = len(tasks_found) > 0
49
+ else:
50
+ report["missing_files"].append("func/")
51
+
52
+ dwi_dir = subject_dir / "dwi"
53
+ if dwi_dir.exists():
54
+ dwi_files = list(dwi_dir.glob("*_dwi.nii.gz"))
55
+ report["dwi_present"] = len(dwi_files) > 0
56
+ else:
57
+ report["warnings"].append("No dwi directory")
58
+
59
+ return report
60
+
61
+
62
+ def main() -> int:
63
+ parser = argparse.ArgumentParser(description="Validate UCLA CNP BIDS structure.")
64
+ parser.add_argument("--input", required=True)
65
+ parser.add_argument("--output", required=True)
66
+ args = parser.parse_args()
67
+
68
+ input_dir = Path(args.input).resolve()
69
+ if not input_dir.exists():
70
+ print(f"Input directory not found: {input_dir}", file=sys.stderr)
71
+ return 1
72
+
73
+ subjects = sorted([d for d in input_dir.glob("sub-*") if d.is_dir()])
74
+ print(f"Found {len(subjects)} subjects in {input_dir}")
75
+
76
+ if not subjects:
77
+ print("[ERROR] No subjects found.", file=sys.stderr)
78
+ return 1
79
+
80
+ results = []
81
+ for sub_dir in subjects:
82
+ report = validate_subject(sub_dir)
83
+ results.append(report)
84
+
85
+ output_path = Path(args.output).resolve()
86
+ output_path.parent.mkdir(parents=True, exist_ok=True)
87
+
88
+ fieldnames = [
89
+ "subject", "anat_complete", "task_fMRI_present", "dwi_present",
90
+ "n_task_runs", "tasks_found", "missing_files", "warnings",
91
+ ]
92
+ with open(output_path, "w", newline="", encoding="utf-8") as f:
93
+ writer = csv.DictWriter(f, fieldnames=fieldnames)
94
+ writer.writeheader()
95
+ for r in results:
96
+ r["tasks_found"] = "; ".join(r["tasks_found"])
97
+ r["missing_files"] = "; ".join(r["missing_files"])
98
+ r["warnings"] = "; ".join(r["warnings"])
99
+ writer.writerow(r)
100
+
101
+ print(f"\nValidation Summary:")
102
+ print(f" Total subjects: {len(results)}")
103
+ print(f" With T1w: {sum(1 for r in results if r['anat_complete'])}")
104
+ print(f" With task-fMRI: {sum(1 for r in results if r['task_fMRI_present'])}")
105
+ print(f" With dMRI: {sum(1 for r in results if r['dwi_present'])}")
106
+ print(f" Avg task runs: {sum(r['n_task_runs'] for r in results) / max(len(results), 1):.1f}")
107
+ print(f" Output: {output_path}")
108
+
109
+ return 0
110
+
111
+
112
+ if __name__ == "__main__":
113
+ sys.exit(main())
@@ -0,0 +1,310 @@
1
+ ---
2
+ name: ukb-skill
3
+ description: "Use this skill whenever the user wants to analyze already available UK Biobank data for brain-related research, including neurological outcomes, cognitive phenotypes, brain MRI derived phenotypes, survival analysis, subgroup analysis, propensity score analysis, mediation analysis, sensitivity analysis, machine learning, visualization, or manuscript-ready summaries. This skill only covers post-extraction analysis and explicitly excludes RAP access and data download guidance."
4
+ license: MIT License (NeuroClaw custom skill – freely modifiable within the project)
5
+ layer: subagent
6
+ skill_type: dataset
7
+ dependencies:
8
+ - nilearn-tool
9
+ - fsl-tool
10
+ - claw-shell
11
+ ---
12
+ # UKB Skill (Dataset Layer)
13
+
14
+ ## Overview
15
+
16
+ `ukb-skill` is the NeuroClaw **analysis-layer** skill for **brain-focused UK Biobank downstream research**.
17
+
18
+ This skill is designed for users who already have local UK Biobank tables, derived phenotype tables, or neuroimaging-derived feature matrices and want to run downstream statistical or machine learning analyses.
19
+
20
+ It follows the NeuroClaw hierarchical design principles:
21
+ - This skill describes **WHAT needs to be analyzed** and **which existing skill should handle each part**.
22
+ - It contains **no RAP download workflow** and **no cloud export instructions**.
23
+ - It contains **no direct implementation code** and **no direct shell commands**.
24
+ - All concrete execution should be delegated through `claw-shell` and related downstream skills.
25
+
26
+ **Core workflow (never bypassed):**
27
+ 1. Confirm that the user already has accessible UK Biobank-derived local data.
28
+ 2. Identify the research target: neurological endpoint, cognitive phenotype, brain MRI phenotype, or predictive modeling task.
29
+ 3. Identify the analysis type: regression, survival analysis, subgroup analysis, propensity score analysis, mediation analysis, sensitivity analysis, machine learning, visualization, or manuscript support.
30
+ 4. Check the minimum required columns, files, and assumptions.
31
+ 5. Generate a **numbered execution plan** with outputs, delegated skills, and risks.
32
+ 6. Present the plan and wait for explicit user confirmation ("YES" / "execute" / "proceed").
33
+ 7. On confirmation, delegate all execution through `claw-shell` and the target skills.
34
+
35
+ **Research use only.**
36
+
37
+ ---
38
+
39
+ ## Scope Boundaries
40
+
41
+ ### Included
42
+ - Brain-related UK Biobank disease endpoint analysis using existing tables
43
+ - Cognitive and brain-health phenotype modeling
44
+ - Brain MRI derived phenotype association analysis
45
+ - Survival / logistic / linear modeling on UK Biobank-derived tables
46
+ - Sensitivity analysis, subgroup analysis, propensity score analysis, and mediation analysis
47
+ - Machine learning on brain-related tabular or derived neuroimaging features
48
+ - Visualization and manuscript-ready result summarization
49
+
50
+ ### Excluded
51
+ - UK Biobank RAP access setup
52
+ - UK Biobank application, governance, or approval procedures
53
+ - Downloading demographics, proteomics, metabolomics, or raw UKB exports
54
+ - Cloud-side field selection or export helper workflows
55
+ - Low-level data download scripts
56
+
57
+ If the user asks how to obtain or download UK Biobank data, state that this skill only supports post-extraction analysis after the data has already been exported or derived.
58
+
59
+ ---
60
+
61
+ ## Benchmark-Facing Default Mainline
62
+
63
+ For benchmark-style prompts, choose the narrowest valid UK Biobank brain-analysis route first and do not widen the response into unrelated epidemiology branches.
64
+
65
+ - If the task is incident neurological disease modeling:
66
+ - Default to `analysis-ready table -> survival endpoint check -> Cox regression -> sensitivity analysis if requested -> result summary`.
67
+ - Do not expand into unrelated imaging preprocessing or data download steps.
68
+ - If the task is cross-sectional cognition or brain-phenotype association analysis:
69
+ - Default to `feature table -> covariate check -> linear/logistic regression -> ranked outputs -> visualization if requested`.
70
+ - Do not expand into unrelated survival analysis unless the prompt explicitly asks for incident-event modeling.
71
+ - If the task is predictive modeling on brain-related UKB features:
72
+ - Default to `clean feature matrix -> train/validation split -> model fitting -> metrics -> interpretation`.
73
+ - Delegate predictive modeling to `run_models` when appropriate.
74
+ - If required columns or files are missing:
75
+ - State `Missing required input` explicitly.
76
+ - Do not invent UKB field names, event dates, or covariates.
77
+ - Do not introduce RAP, cloud export, or downloader guidance in benchmark mode.
78
+
79
+ When multiple valid analysis routes exist, prefer one explicit mainline plus a short note about blocked optional branches.
80
+
81
+ **Research use only.**
82
+
83
+ ---
84
+
85
+ ## Quick Reference (Common UKB Brain Tasks → Delegation Map)
86
+
87
+ | Task | What needs to be done (high level) | Delegate to which skill | Expected outputs |
88
+ |---|---|---|---|
89
+ | Phenotype extraction | Extract and preprocess UKB variables with field ID mapping | `scripts/extract_ukb_phenotype.py` | Preprocessed phenotype CSV |
90
+ | Case extraction | Extract brain-related disease cases by ICD-10/ICD-9 codes | `scripts/extract_ukb_cases.py` | Case/control CSV with prevalence stats |
91
+ | Survival dataset | Build survival dataset with prevalent/incident separation | `scripts/build_ukb_survival.py` | Survival CSV (time, status) |
92
+ | QC summary | Generate per-subject QC with imaging availability | `scripts/ukb_qc_summary.py` | QC summary + exclusion list |
93
+ | Neurological survival analysis | Validate incident-event table, define endpoint, run Cox regression, summarize hazard ratios | `claw-shell` | model summaries, hazard ratio tables, survival outputs |
94
+ | Cognitive phenotype association | Regress cognition or brain-health phenotype on exposure or imaging features | `claw-shell` | beta/OR tables, cleaned regression outputs |
95
+ | Brain MRI phenotype association | Analyze ROI volumes, cortical thickness, WMH burden, diffusion or connectivity summaries | `claw-shell` | ranked effect tables, feature association summaries |
96
+ | Predictive modeling on UKB brain features | Fit classification or regression models and interpret them | `run_models` | metrics, predictions, SHAP summaries, model comparisons |
97
+ | Subgroup analysis | Test heterogeneity by sex, age band, APOE, vascular risk, or other subgroup | `claw-shell` | subgroup effect tables, interaction summaries |
98
+ | Propensity score analysis | Estimate propensity scores, run matching or weighting, assess balance | `claw-shell` | matched/weighted dataset summaries, balance outputs |
99
+ | Mediation analysis | Test whether a biomarker or imaging phenotype mediates a brain-related outcome | `claw-shell` | direct/indirect effect summaries, mediation tables |
100
+ | Sensitivity analysis | Exclude early events or rows with missing covariates, then rerun the same model | `claw-shell` | sensitivity tables, robustness comparison summaries |
101
+ | Brain-result visualization | Turn ranked brain-region or connectome outputs into figures | `brain-visualization` | PNG figures, ranked region tables, connectome plots |
102
+ | Manuscript-ready methods/results | Convert the finished analysis into text for reports or papers | `paper-writing` | draft methods, results text, figure legends |
103
+
104
+ ---
105
+
106
+ ## Recommended Strategy (Decision Logic)
107
+
108
+ - If the goal is **incident neurological disease analysis** such as dementia, stroke, or Parkinson's disease:
109
+ - Prefer the survival-analysis route.
110
+ - Confirm prevalent vs incident definition, censoring rule, and time/status columns before modeling.
111
+ - Best for: longitudinal UKB outcome studies.
112
+
113
+ - If the goal is **cross-sectional cognition or brain-health association analysis**:
114
+ - Prefer linear or logistic regression on a cleaned participant-level table.
115
+ - Best for: baseline phenotype studies, association screens, cognition analyses.
116
+
117
+ - If the goal is **brain MRI phenotype association analysis** using ROI tables, cortical thickness, WMH burden, diffusion summaries, or connectome summaries:
118
+ - Prefer a feature-table association route.
119
+ - Best for: imaging-derived phenotype studies and region-wise effect ranking.
120
+
121
+ - If the goal is **predictive modeling** on UKB brain-related features:
122
+ - Prefer `run_models` for model fitting, model comparison, and interpretation.
123
+ - Best for: disease risk prediction, cognitive outcome prediction, multimodal tabular modeling.
124
+
125
+ - If the goal is **effect heterogeneity or causal approximation**:
126
+ - Prefer subgroup, propensity score, or mediation workflows.
127
+ - Best for: mechanistic analyses, treatment/exposure comparison, robustness studies.
128
+
129
+ - If the goal is **publication-ready figures or writing**:
130
+ - Prefer `brain-visualization` for figures and `paper-writing` for text output.
131
+ - Best for: reporting, paper drafting, slide-ready summaries.
132
+
133
+ ---
134
+
135
+ ## Minimal Input Requirements
136
+
137
+ ### For Survival Analysis
138
+ - participant ID column
139
+ - survival time or baseline and event/censoring dates
140
+ - event indicator/status column
141
+ - clearly defined neurological or brain-related outcome
142
+ - covariates
143
+
144
+ ### For Cross-Sectional Regression
145
+ - participant ID column
146
+ - exposure or predictor columns
147
+ - target phenotype column
148
+ - covariates
149
+
150
+ ### For Brain Feature Modeling
151
+ - participant ID column
152
+ - ROI / IDP / derived feature columns
153
+ - target phenotype or outcome
154
+ - optional scanner, site, or confound columns
155
+
156
+ If the required inputs are not present, return a concrete missing-input list instead of inventing fields.
157
+
158
+ ---
159
+
160
+ ## Brain-Relevant UKB Targets
161
+
162
+ This skill is intentionally restricted to brain-related UK Biobank content. Typical targets include:
163
+ - neurodegenerative outcomes: dementia, Alzheimer's disease, Parkinson's disease
164
+ - cerebrovascular outcomes: stroke and vascular brain-health outcomes
165
+ - cognition: memory, reaction time, executive function, fluid intelligence, cognitive decline
166
+ - psychiatric or brain-health outcomes when explicitly tied to brain-focused analysis
167
+ - imaging-derived brain phenotypes: cortical thickness, regional volume, subcortical volume, WMH burden, diffusion metrics, functional connectivity summaries
168
+
169
+ If the request is mainly non-brain UK Biobank epidemiology, this skill should state that it is out of scope.
170
+
171
+ ---
172
+
173
+ ## When to Call This Skill
174
+
175
+ - Any request involving UK Biobank brain-related downstream analysis on already available local data.
176
+ - Any request involving dementia, stroke, cognition, brain MRI phenotypes, WMH burden, or brain-feature prediction in UKB.
177
+ - Any request asking for subgroup analysis, propensity score analysis, mediation analysis, or sensitivity analysis in a brain-focused UKB setting.
178
+
179
+ Do not call this skill for RAP export, field download, or raw neuroimaging preprocessing from DICOM/NIfTI.
180
+
181
+ ---
182
+
183
+ ## Complementary / Related Skills
184
+
185
+ - `run_models` -> predictive modeling and interpretation on derived UKB brain features
186
+ - `brain-visualization` -> convert effect tables or connectome outputs into figures
187
+ - `paper-writing` -> manuscript-ready methods/results writing
188
+ - `method-design` -> analysis design refinement for neurological UKB studies
189
+ - `academic-research-hub` -> literature-backed design support and research grounding
190
+ - `smri-skill` -> raw structural MRI preprocessing before UKB-level tabular analysis
191
+ - `fmri-skill` -> raw functional MRI preprocessing before UKB-level tabular analysis
192
+ - `wmh-segmentation` -> WMH extraction before UKB-level association or prediction analysis
193
+ - `claw-shell` -> all concrete execution
194
+
195
+ ---
196
+
197
+ ## Important Notes & Limitations
198
+
199
+ - This skill assumes that the user already has legal access to UK Biobank data and has already exported or derived the needed local analysis files.
200
+ - This skill does not define fixed UKB field IDs because field selection differs across studies and exports.
201
+ - This skill should not guess disease definitions, date columns, or censoring rules when they are not provided.
202
+ - Sensitivity analysis should be framed as filtered-data reruns of the same main model, not as unrelated new pipelines.
203
+ - If multiple candidate outcomes or feature tables exist, the skill should first ask which one is primary before execution.
204
+ - This skill is intended for research workflows and not for clinical decision-making.
205
+
206
+ ---
207
+
208
+ ## Default Response Pattern
209
+
210
+ When this skill is triggered, the response should:
211
+ 1. Restate the exact UK Biobank brain-related analysis goal.
212
+ 2. State that the skill assumes local data is already available and does not cover downloading.
213
+ 3. List the minimum required columns or files.
214
+ 4. Provide a numbered execution plan.
215
+ 5. State which NeuroClaw skills will be delegated to.
216
+ 6. Wait for confirmation before execution.
217
+
218
+ ---
219
+
220
+ ## Companion Scripts
221
+
222
+ Adapted from [UKBAnalytica_v2](https://github.com/Hinna0818/UKBAnalytica_v2) (Nan He, Southern Medical University).
223
+
224
+ ### `scripts/extract_ukb_phenotype.py`
225
+
226
+ Extract and preprocess UKB phenotype data with automatic field ID mapping.
227
+
228
+ ```bash
229
+ python skills/ukb-skill/scripts/extract_ukb_phenotype.py \
230
+ --input ukb_raw.csv --output phenotype.csv
231
+
232
+ python skills/ukb-skill/scripts/extract_ukb_phenotype.py \
233
+ --input ukb_raw.csv --variables sex,age,bmi,smoking,townsend --output covariates.csv
234
+
235
+ python skills/ukb-skill/scripts/extract_ukb_phenotype.py --list-variables
236
+ ```
237
+
238
+ Features:
239
+ - 50+ predefined UKB field ID mappings (demographics, lifestyle, biomarkers, brain IDPs, cognition)
240
+ - Automatic preprocessing: invalid code removal, variable-specific recoding
241
+ - Custom variable mapping via JSON
242
+ - Lists all available variables with `--list-variables`
243
+
244
+ ### `scripts/extract_ukb_cases.py`
245
+
246
+ Extract brain-related disease cases using ICD-10/ICD-9 codes.
247
+
248
+ ```bash
249
+ python skills/ukb-skill/scripts/extract_ukb_cases.py \
250
+ --input ukb_raw.csv --disease dementia --output dementia_cases.csv
251
+
252
+ python skills/ukb-skill/scripts/extract_ukb_cases.py \
253
+ --input ukb_raw.csv --custom-icd G20 --output custom_cases.csv
254
+
255
+ python skills/ukb-skill/scripts/extract_ukb_cases.py --list-diseases
256
+ ```
257
+
258
+ Features:
259
+ - 15 predefined brain-related disease definitions (dementia, Alzheimer's, stroke, Parkinson's, MS, epilepsy, depression, anxiety, schizophrenia, bipolar, brain tumour, TBI)
260
+ - Multi-source ascertainment: ICD-10, ICD-9, Death register
261
+ - Custom ICD-10 pattern support
262
+ - Prevalence statistics per disease
263
+
264
+ ### `scripts/build_ukb_survival.py`
265
+
266
+ Build survival analysis datasets with prevalent/incident case separation.
267
+
268
+ ```bash
269
+ python skills/ukb-skill/scripts/build_ukb_survival.py \
270
+ --input ukb_raw.csv --disease dementia --output survival.csv
271
+
272
+ python skills/ukb-skill/scripts/build_ukb_survival.py \
273
+ --input ukb_raw.csv --disease stroke --censor-date 2023-10-31 --output stroke_survival.csv
274
+ ```
275
+
276
+ Features:
277
+ - Follow-up time calculation (years from baseline)
278
+ - Prevalent vs incident case separation
279
+ - Censoring at death or administrative censor date
280
+ - Compatible with Cox regression in downstream analysis
281
+
282
+ ### `scripts/ukb_qc_summary.py`
283
+
284
+ Generate per-subject QC summaries for brain-related UKB data.
285
+
286
+ ```bash
287
+ python skills/ukb-skill/scripts/ukb_qc_summary.py \
288
+ --input ukb_raw.csv --output qc_summary.csv
289
+
290
+ python skills/ukb-skill/scripts/ukb_qc_summary.py \
291
+ --input ukb_raw.csv --imaging-check --age-min 45 --age-max 80 --output qc_imaging.csv
292
+ ```
293
+
294
+ Features:
295
+ - Covariate completeness check
296
+ - Brain imaging availability (T1w, FLAIR, dMRI, rs-fMRI IDPs)
297
+ - Age range filtering
298
+ - Per-subject QC pass/fail flag
299
+
300
+ ---
301
+
302
+ ## Reference
303
+
304
+ Companion scripts adapted from [UKBAnalytica_v2](https://github.com/Hinna0818/UKBAnalytica_v2) by Nan He (Southern Medical University). SKILL.md analysis design narrowed to brain-focused UK Biobank research.
305
+
306
+ Custom NeuroClaw skill.
307
+
308
+ Created At: 2026-04-20 15:47 HKT
309
+ Last Updated At: 2026-05-06 15:12 HKT
310
+ Author: chengwang96