@brainpilot/skills 0.0.6 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (285) hide show
  1. package/package.json +2 -2
  2. package/skills/01_Meta-Skills/academic-research-hub/SKILL.md +108 -0
  3. package/skills/01_Meta-Skills/academic-research-hub/scripts/requirements.txt +17 -0
  4. package/skills/01_Meta-Skills/academic-research-hub/scripts/research.py +781 -0
  5. package/skills/01_Meta-Skills/beautiful-log/SKILL.md +64 -0
  6. package/skills/01_Meta-Skills/beautiful-log/scripts/beautiful_log.py +274 -0
  7. package/skills/01_Meta-Skills/ethoclaw-daily-paper/SKILL.md +130 -0
  8. package/skills/01_Meta-Skills/ethoclaw-daily-paper/assets/config.template.yaml +54 -0
  9. package/skills/01_Meta-Skills/ethoclaw-daily-paper/assets/top5_digest_template.md +5 -0
  10. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/build_top5_digest.py +300 -0
  11. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/common.py +137 -0
  12. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/merge_results.py +106 -0
  13. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/run_pipeline.py +177 -0
  14. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/search_arxiv.py +162 -0
  15. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/search_pubmed.py +202 -0
  16. package/skills/01_Meta-Skills/ethoclaw-normalize-tabular/SKILL.md +173 -0
  17. package/skills/01_Meta-Skills/ethoclaw-normalize-tabular/scripts/normalize_data.py +874 -0
  18. package/skills/01_Meta-Skills/ethoclaw-pdf-research/SKILL.md +134 -0
  19. package/skills/01_Meta-Skills/ethoclaw-pdf-research/references/confirmation-prompts.md +31 -0
  20. package/skills/01_Meta-Skills/ethoclaw-pdf-research/references/output-patterns.md +45 -0
  21. package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/build_markdown_deliverables.py +41 -0
  22. package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/build_research_log.py +84 -0
  23. package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/build_summary_md.py +63 -0
  24. package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/extract_pdf_bundle.py +140 -0
  25. package/skills/01_Meta-Skills/experiment-controller/SKILL.md +140 -0
  26. package/skills/01_Meta-Skills/knowledge-graph-builder/SKILL.md +366 -0
  27. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/entity_resolution.py +120 -0
  28. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/extraction_prompt_template.txt +19 -0
  29. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/graph_query.py +106 -0
  30. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/hypothesis_cli_reference.py +42 -0
  31. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/new_data_source_template.py +116 -0
  32. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/requirements.txt +15 -0
  33. package/skills/01_Meta-Skills/method-design/SKILL.md +61 -0
  34. package/skills/01_Meta-Skills/multi-search-engine/SKILL.md +119 -0
  35. package/skills/01_Meta-Skills/research-idea/SKILL.md +65 -0
  36. package/skills/05_EEG_ERP/eeg-skill/SKILL.md +197 -0
  37. package/skills/05_EEG_ERP/meg-skill/SKILL.md +188 -0
  38. package/skills/05_EEG_ERP/meg-skill/scripts/time_frequency.py +223 -0
  39. package/skills/05_EEG_ERP/mne-eeg-tool/SKILL.md +165 -0
  40. package/skills/05_EEG_ERP/mne-eeg-tool/scripts/eeg_pipeline_reference.py +231 -0
  41. package/skills/05_EEG_ERP/seed-iv-skill/SKILL.md +184 -0
  42. package/skills/05_EEG_ERP/seed-iv-skill/scripts/classify_seed_iv.py +154 -0
  43. package/skills/05_EEG_ERP/seed-iv-skill/scripts/extract_seed_iv_features.py +190 -0
  44. package/skills/05_EEG_ERP/seed-iv-skill/scripts/validate_seed_iv.py +102 -0
  45. package/skills/05_EEG_ERP/seed-vig-skill/SKILL.md +182 -0
  46. package/skills/05_EEG_ERP/seed-vig-skill/scripts/classify_seed_vig.py +165 -0
  47. package/skills/05_EEG_ERP/seed-vig-skill/scripts/extract_seed_vig_features.py +185 -0
  48. package/skills/05_EEG_ERP/seed-vig-skill/scripts/validate_seed_vig.py +88 -0
  49. package/skills/06_fMRI_Neuroimaging/abcd-skill/SKILL.md +308 -0
  50. package/skills/06_fMRI_Neuroimaging/abcd-skill/scripts/abcd_qc_summary.py +449 -0
  51. package/skills/06_fMRI_Neuroimaging/abcd-skill/scripts/extract_abcd_phenotype.py +292 -0
  52. package/skills/06_fMRI_Neuroimaging/abcd-skill/scripts/reorganize_abcd.py +387 -0
  53. package/skills/06_fMRI_Neuroimaging/abide-skill/SKILL.md +302 -0
  54. package/skills/06_fMRI_Neuroimaging/abide-skill/scripts/abide_qc_summary.py +317 -0
  55. package/skills/06_fMRI_Neuroimaging/abide-skill/scripts/extract_abide_phenotype.py +267 -0
  56. package/skills/06_fMRI_Neuroimaging/abide-skill/scripts/reorganize_abide.py +387 -0
  57. package/skills/06_fMRI_Neuroimaging/adhd200-skill/SKILL.md +244 -0
  58. package/skills/06_fMRI_Neuroimaging/adhd200-skill/scripts/adhd200_qc_summary.py +98 -0
  59. package/skills/06_fMRI_Neuroimaging/adhd200-skill/scripts/extract_adhd200_phenotype.py +134 -0
  60. package/skills/06_fMRI_Neuroimaging/adhd200-skill/scripts/reorganize_adhd200.py +206 -0
  61. package/skills/06_fMRI_Neuroimaging/adni-skill/SKILL.md +358 -0
  62. package/skills/06_fMRI_Neuroimaging/adni-skill/scripts/generate_adni_task_files.py +1305 -0
  63. package/skills/06_fMRI_Neuroimaging/adni-skill/scripts/generate_vqa_from_tasks.py +766 -0
  64. package/skills/06_fMRI_Neuroimaging/adni-skill/scripts/reorganize_adni.py +491 -0
  65. package/skills/06_fMRI_Neuroimaging/aibl-skill/SKILL.md +295 -0
  66. package/skills/06_fMRI_Neuroimaging/aibl-skill/scripts/aibl_qc_summary.py +260 -0
  67. package/skills/06_fMRI_Neuroimaging/aibl-skill/scripts/extract_aibl_phenotype.py +365 -0
  68. package/skills/06_fMRI_Neuroimaging/aibl-skill/scripts/reorganize_aibl.py +394 -0
  69. package/skills/06_fMRI_Neuroimaging/aomic-skill/SKILL.md +292 -0
  70. package/skills/06_fMRI_Neuroimaging/aomic-skill/scripts/aomic_qc_summary.py +258 -0
  71. package/skills/06_fMRI_Neuroimaging/aomic-skill/scripts/extract_aomic_phenotype.py +284 -0
  72. package/skills/06_fMRI_Neuroimaging/aomic-skill/scripts/reorganize_aomic.py +322 -0
  73. package/skills/06_fMRI_Neuroimaging/asl-skill/SKILL.md +168 -0
  74. package/skills/06_fMRI_Neuroimaging/asl-skill/scripts/compute_cbf.py +224 -0
  75. package/skills/06_fMRI_Neuroimaging/bids-organizer/SKILL.md +241 -0
  76. package/skills/06_fMRI_Neuroimaging/bold5000-skill/SKILL.md +186 -0
  77. package/skills/06_fMRI_Neuroimaging/bold5000-skill/scripts/bold5000_qc_summary.py +96 -0
  78. package/skills/06_fMRI_Neuroimaging/bold5000-skill/scripts/extract_bold5000_stimulus.py +125 -0
  79. package/skills/06_fMRI_Neuroimaging/bold5000-skill/scripts/reorganize_bold5000.py +102 -0
  80. package/skills/06_fMRI_Neuroimaging/camcan-skill/SKILL.md +213 -0
  81. package/skills/06_fMRI_Neuroimaging/camcan-skill/scripts/camcan_qc_summary.py +131 -0
  82. package/skills/06_fMRI_Neuroimaging/camcan-skill/scripts/extract_camcan_phenotype.py +145 -0
  83. package/skills/06_fMRI_Neuroimaging/camcan-skill/scripts/validate_camcan.py +141 -0
  84. package/skills/06_fMRI_Neuroimaging/cobre-skill/SKILL.md +201 -0
  85. package/skills/06_fMRI_Neuroimaging/cobre-skill/scripts/cobre_qc_summary.py +95 -0
  86. package/skills/06_fMRI_Neuroimaging/cobre-skill/scripts/extract_cobre_phenotype.py +104 -0
  87. package/skills/06_fMRI_Neuroimaging/cobre-skill/scripts/reorganize_cobre.py +140 -0
  88. package/skills/06_fMRI_Neuroimaging/conn-tool/SKILL.md +180 -0
  89. package/skills/06_fMRI_Neuroimaging/dcm2nii/SKILL.md +189 -0
  90. package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/SKILL.md +183 -0
  91. package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/scripts/dmt_har_med_qc_summary.py +96 -0
  92. package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/scripts/extract_dmt_har_med_phenotype.py +121 -0
  93. package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/scripts/reorganize_dmt_har_med.py +125 -0
  94. package/skills/06_fMRI_Neuroimaging/dwi-skill/SKILL.md +359 -0
  95. package/skills/06_fMRI_Neuroimaging/fmri-skill/SKILL.md +371 -0
  96. package/skills/06_fMRI_Neuroimaging/fmriprep-tool/SKILL.md +228 -0
  97. package/skills/06_fMRI_Neuroimaging/freesurfer-tool/SKILL.md +286 -0
  98. package/skills/06_fMRI_Neuroimaging/freesurfer-tool/scripts/freesurfer_processor.py +145 -0
  99. package/skills/06_fMRI_Neuroimaging/fsl-tool/SKILL.md +208 -0
  100. package/skills/06_fMRI_Neuroimaging/hbn-skill/SKILL.md +271 -0
  101. package/skills/06_fMRI_Neuroimaging/hbn-skill/scripts/extract_hbn_phenotype.py +107 -0
  102. package/skills/06_fMRI_Neuroimaging/hbn-skill/scripts/hbn_qc_summary.py +96 -0
  103. package/skills/06_fMRI_Neuroimaging/hbn-skill/scripts/reorganize_hbn.py +150 -0
  104. package/skills/06_fMRI_Neuroimaging/hcpa-skill/SKILL.md +210 -0
  105. package/skills/06_fMRI_Neuroimaging/hcpa-skill/scripts/extract_hcpa_phenotype.py +146 -0
  106. package/skills/06_fMRI_Neuroimaging/hcpa-skill/scripts/hcpa_qc_summary.py +120 -0
  107. package/skills/06_fMRI_Neuroimaging/hcpa-skill/scripts/reorganize_hcpa.py +155 -0
  108. package/skills/06_fMRI_Neuroimaging/hcpd-skill/SKILL.md +210 -0
  109. package/skills/06_fMRI_Neuroimaging/hcpd-skill/scripts/extract_hcpd_phenotype.py +148 -0
  110. package/skills/06_fMRI_Neuroimaging/hcpd-skill/scripts/hcpd_qc_summary.py +125 -0
  111. package/skills/06_fMRI_Neuroimaging/hcpd-skill/scripts/reorganize_hcpd.py +146 -0
  112. package/skills/06_fMRI_Neuroimaging/hcpep-skill/SKILL.md +215 -0
  113. package/skills/06_fMRI_Neuroimaging/hcpep-skill/scripts/extract_hcpep_phenotype.py +157 -0
  114. package/skills/06_fMRI_Neuroimaging/hcpep-skill/scripts/hcpep_qc_summary.py +143 -0
  115. package/skills/06_fMRI_Neuroimaging/hcpep-skill/scripts/reorganize_hcpep.py +146 -0
  116. package/skills/06_fMRI_Neuroimaging/hcppipeline-tool/SKILL.md +217 -0
  117. package/skills/06_fMRI_Neuroimaging/hcpya-skill/SKILL.md +214 -0
  118. package/skills/06_fMRI_Neuroimaging/hcpya-skill/scripts/extract_hcpya_phenotype.py +190 -0
  119. package/skills/06_fMRI_Neuroimaging/hcpya-skill/scripts/hcpya_qc_summary.py +152 -0
  120. package/skills/06_fMRI_Neuroimaging/hcpya-skill/scripts/reorganize_hcpya.py +203 -0
  121. package/skills/06_fMRI_Neuroimaging/ixi-skill/SKILL.md +198 -0
  122. package/skills/06_fMRI_Neuroimaging/ixi-skill/scripts/ixi_qc_summary.py +137 -0
  123. package/skills/06_fMRI_Neuroimaging/ixi-skill/scripts/reorganize_ixi.py +190 -0
  124. package/skills/06_fMRI_Neuroimaging/mnd-skill/SKILL.md +191 -0
  125. package/skills/06_fMRI_Neuroimaging/mnd-skill/scripts/extract_mnd_phenotype.py +143 -0
  126. package/skills/06_fMRI_Neuroimaging/mnd-skill/scripts/mnd_qc_summary.py +120 -0
  127. package/skills/06_fMRI_Neuroimaging/mnd-skill/scripts/validate_mnd.py +107 -0
  128. package/skills/06_fMRI_Neuroimaging/mschallenge-skill/SKILL.md +203 -0
  129. package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/analyze_lesions.py +119 -0
  130. package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/longitudinal_lesion.py +148 -0
  131. package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/mschallenge_qc_summary.py +132 -0
  132. package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/validate_mschallenge.py +116 -0
  133. package/skills/06_fMRI_Neuroimaging/nibabel-skill/SKILL.md +184 -0
  134. package/skills/06_fMRI_Neuroimaging/nibabel-skill/scripts/atlas_coordinate_reference.py +61 -0
  135. package/skills/06_fMRI_Neuroimaging/nibabel-skill/scripts/freesurfer_io_reference.py +34 -0
  136. package/skills/06_fMRI_Neuroimaging/nibabel-skill/scripts/nifti_inspection_reference.py +35 -0
  137. package/skills/06_fMRI_Neuroimaging/nifd-skill/SKILL.md +205 -0
  138. package/skills/06_fMRI_Neuroimaging/nifd-skill/scripts/extract_nifd_phenotype.py +132 -0
  139. package/skills/06_fMRI_Neuroimaging/nifd-skill/scripts/nifd_qc_summary.py +111 -0
  140. package/skills/06_fMRI_Neuroimaging/nifd-skill/scripts/validate_nifd.py +111 -0
  141. package/skills/06_fMRI_Neuroimaging/nii2dcm/SKILL.md +143 -0
  142. package/skills/06_fMRI_Neuroimaging/nilearn-tool/SKILL.md +266 -0
  143. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/connectome_reference.py +65 -0
  144. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/denoise_timeseries_reference.py +58 -0
  145. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/hierarchical_parcellation_reference.py +53 -0
  146. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/kmeans_parcellation_reference.py +53 -0
  147. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/preprocess_bold_reference.py +76 -0
  148. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/rest_dictlearning_reference.py +56 -0
  149. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/rest_ica_reference.py +59 -0
  150. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/second_level_glm_reference.py +58 -0
  151. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/spacenet_classifier_reference.py +59 -0
  152. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/svm_classifier_reference.py +60 -0
  153. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/task_glm_reference.py +63 -0
  154. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/zalff_summary_reference.py +109 -0
  155. package/skills/06_fMRI_Neuroimaging/nsd-skill/SKILL.md +210 -0
  156. package/skills/06_fMRI_Neuroimaging/nsd-skill/scripts/extract_nsd_stimulus.py +171 -0
  157. package/skills/06_fMRI_Neuroimaging/nsd-skill/scripts/nsd_qc_summary.py +142 -0
  158. package/skills/06_fMRI_Neuroimaging/nsd-skill/scripts/validate_nsd.py +142 -0
  159. package/skills/06_fMRI_Neuroimaging/oasis-skill/SKILL.md +205 -0
  160. package/skills/06_fMRI_Neuroimaging/oasis-skill/scripts/extract_oasis_phenotype.py +126 -0
  161. package/skills/06_fMRI_Neuroimaging/oasis-skill/scripts/oasis_qc_summary.py +115 -0
  162. package/skills/06_fMRI_Neuroimaging/oasis-skill/scripts/validate_oasis.py +119 -0
  163. package/skills/06_fMRI_Neuroimaging/pet-skill/SKILL.md +173 -0
  164. package/skills/06_fMRI_Neuroimaging/pet-skill/scripts/compute_suvr.py +202 -0
  165. package/skills/06_fMRI_Neuroimaging/pnc-skill/SKILL.md +206 -0
  166. package/skills/06_fMRI_Neuroimaging/pnc-skill/scripts/extract_pnc_phenotype.py +136 -0
  167. package/skills/06_fMRI_Neuroimaging/pnc-skill/scripts/pnc_qc_summary.py +116 -0
  168. package/skills/06_fMRI_Neuroimaging/pnc-skill/scripts/validate_pnc.py +120 -0
  169. package/skills/06_fMRI_Neuroimaging/ppmi-skill/SKILL.md +209 -0
  170. package/skills/06_fMRI_Neuroimaging/ppmi-skill/scripts/extract_ppmi_phenotype.py +138 -0
  171. package/skills/06_fMRI_Neuroimaging/ppmi-skill/scripts/ppmi_qc_summary.py +111 -0
  172. package/skills/06_fMRI_Neuroimaging/ppmi-skill/scripts/validate_ppmi.py +117 -0
  173. package/skills/06_fMRI_Neuroimaging/qsiprep-tool/SKILL.md +320 -0
  174. package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/SKILL.md +215 -0
  175. package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/extract_rest_mdd_phenotype.py +132 -0
  176. package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/harmonize_sites.py +152 -0
  177. package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/rest_mdd_qc_summary.py +124 -0
  178. package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/validate_rest_mdd.py +103 -0
  179. package/skills/06_fMRI_Neuroimaging/smri-skill/SKILL.md +302 -0
  180. package/skills/06_fMRI_Neuroimaging/tcp-skill/SKILL.md +204 -0
  181. package/skills/06_fMRI_Neuroimaging/tcp-skill/scripts/extract_tcp_phenotype.py +139 -0
  182. package/skills/06_fMRI_Neuroimaging/tcp-skill/scripts/tcp_qc_summary.py +111 -0
  183. package/skills/06_fMRI_Neuroimaging/tcp-skill/scripts/validate_tcp.py +99 -0
  184. package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/SKILL.md +217 -0
  185. package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/scripts/extract_ucla_cnp_phenotype.py +145 -0
  186. package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/scripts/ucla_cnp_qc_summary.py +111 -0
  187. package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/scripts/validate_ucla_cnp.py +113 -0
  188. package/skills/06_fMRI_Neuroimaging/ukb-skill/SKILL.md +310 -0
  189. package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/build_ukb_survival.py +210 -0
  190. package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/extract_ukb_cases.py +308 -0
  191. package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/extract_ukb_phenotype.py +232 -0
  192. package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/ukb_qc_summary.py +158 -0
  193. package/skills/06_fMRI_Neuroimaging/wmh-segmentation/SKILL.md +133 -0
  194. package/skills/07_Computational_Modeling/detrending/SKILL.md +118 -0
  195. package/skills/07_Computational_Modeling/dictlearning/SKILL.md +122 -0
  196. package/skills/07_Computational_Modeling/filtering/SKILL.md +121 -0
  197. package/skills/07_Computational_Modeling/glm/SKILL.md +153 -0
  198. package/skills/07_Computational_Modeling/hierarchical/SKILL.md +121 -0
  199. package/skills/07_Computational_Modeling/ica/SKILL.md +122 -0
  200. package/skills/07_Computational_Modeling/kmeans/SKILL.md +119 -0
  201. package/skills/07_Computational_Modeling/run_models/SKILL.md +427 -0
  202. package/skills/07_Computational_Modeling/spacenet/SKILL.md +122 -0
  203. package/skills/07_Computational_Modeling/svm/SKILL.md +120 -0
  204. package/skills/08_Computational_Neuroscience/brain_gnn/SKILL.md +183 -0
  205. package/skills/08_Computational_Neuroscience/dipy-tool/SKILL.md +239 -0
  206. package/skills/08_Computational_Neuroscience/dipy-tool/scripts/dti_metrics_reference.py +70 -0
  207. package/skills/08_Computational_Neuroscience/dipy-tool/scripts/load_and_mask_reference.py +76 -0
  208. package/skills/08_Computational_Neuroscience/dipy-tool/scripts/roi_stats_reference.py +59 -0
  209. package/skills/08_Computational_Neuroscience/fm_app/SKILL.md +195 -0
  210. package/skills/08_Computational_Neuroscience/neurostorm/SKILL.md +151 -0
  211. package/skills/13_Visualization/brain-visualization/SKILL.md +191 -0
  212. package/skills/13_Visualization/brain-visualization/scripts/connectome_reference.py +108 -0
  213. package/skills/13_Visualization/brain-visualization/scripts/freesurfer_ply_reference.py +54 -0
  214. package/skills/13_Visualization/brain-visualization/scripts/zalff_summary_reference.py +116 -0
  215. package/skills/13_Visualization/ethoclaw-paper-figure-layout/SKILL.md +78 -0
  216. package/skills/13_Visualization/ethoclaw-paper-figure-layout/assets/naturecomm_figures.tex +74 -0
  217. package/skills/13_Visualization/ethoclaw-paper-figure-layout/scripts/layout_results_foldered.py +579 -0
  218. package/skills/14_Writing/overleaf-skill/SKILL.md +184 -0
  219. package/skills/14_Writing/overleaf-skill/scripts/install.sh +30 -0
  220. package/skills/14_Writing/paper-writing/SKILL.md +146 -0
  221. package/skills/14_Writing/paper-writing/scripts/data_statement_templates.py +164 -0
  222. package/skills/14_Writing/paper-writing/scripts/figure_templates.py +315 -0
  223. package/skills/14_Writing/paper-writing/scripts/nature_figure_style.py +214 -0
  224. package/skills/14_Writing/paper-writing/scripts/section_phrasebank.py +246 -0
  225. package/skills/16_Animal_Behavior/deeplabcut/SKILL.md +154 -0
  226. package/skills/16_Animal_Behavior/deeplabcut/references/3d-pose.md +89 -0
  227. package/skills/16_Animal_Behavior/deeplabcut/references/maDLC.md +123 -0
  228. package/skills/16_Animal_Behavior/deeplabcut/references/modelzoo.md +98 -0
  229. package/skills/16_Animal_Behavior/deeplabcut/references/standard-pipeline.md +165 -0
  230. package/skills/16_Animal_Behavior/deeplabcut/references/utilities.md +146 -0
  231. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/SKILL.md +274 -0
  232. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/report_template_en.html +112 -0
  233. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/report_template_en.md +21 -0
  234. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/cluster-section.md +5 -0
  235. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/heatmap-section.md +5 -0
  236. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/integrated-interpretation.md +3 -0
  237. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/overview.md +3 -0
  238. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/project-summary.md +3 -0
  239. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/radar-section.md +5 -0
  240. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/raw-trajectory.md +3 -0
  241. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/sample-check.md +3 -0
  242. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/single-subject-section.md +3 -0
  243. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/stats-section.md +5 -0
  244. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/epm.md +52 -0
  245. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/fst.md +37 -0
  246. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/nor.md +39 -0
  247. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/oft.md +43 -0
  248. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/tcst.md +45 -0
  249. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/tst.md +36 -0
  250. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/input-types.md +59 -0
  251. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/interpretation-guardrails.md +45 -0
  252. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/metadata-schema.md +57 -0
  253. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/report-sections.md +86 -0
  254. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/section-selection-rules.md +169 -0
  255. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/scripts/build_report_manifest.py +27 -0
  256. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/scripts/render_report.py +34 -0
  257. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/scripts/report_utils.py +1121 -0
  258. package/skills/16_Animal_Behavior/ethoclaw-animal-grounding/SKILL.md +390 -0
  259. package/skills/16_Animal_Behavior/ethoclaw-animal-grounding/reference_code.py +98 -0
  260. package/skills/16_Animal_Behavior/ethoclaw-animal-pose-estimation/SKILL.md +336 -0
  261. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/README.md +21 -0
  262. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/SKILL.md +41 -0
  263. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/batch_kinematic_generator.py +663 -0
  264. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/config.json +19 -0
  265. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/generate_kinematic_parameter.py +401 -0
  266. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/kinematic_generator.py +265 -0
  267. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/SKILL.md +72 -0
  268. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/references/config.example.toml +56 -0
  269. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/scripts/cluster_all_params.py +232 -0
  270. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/scripts/cluster_all_params_from_config.py +236 -0
  271. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-radar-generate/SKILL.md +68 -0
  272. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-radar-generate/references/notes.md +5 -0
  273. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-radar-generate/scripts/plot_h5_radar.py +513 -0
  274. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/SKILL.md +52 -0
  275. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/config.toml +81 -0
  276. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/references/stats-rule.md +18 -0
  277. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/scripts/h5_inspect.py +79 -0
  278. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/scripts/h5_violin_batch.py +624 -0
  279. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/scripts/h5_violin_stats.py +438 -0
  280. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/SKILL.md +280 -0
  281. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/core_scripts/heatmap_trajectory.py +790 -0
  282. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/core_scripts/heatmap_velocity.py +855 -0
  283. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/reference_data/reference_2d.csv +101 -0
  284. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/reference_data/reference_2d.h5 +0 -0
  285. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/reference_data/reference_data_readme.md +126 -0
@@ -0,0 +1,232 @@
1
+ #!/usr/bin/env python3
2
+ """Extract and preprocess UK Biobank phenotype data for brain-related analysis.
3
+
4
+ Adapted from UKBAnalytica_v2 variable_preprocess.R (Nan He, Southern Medical University).
5
+ Provides field ID mapping, automatic preprocessing, and covariate table generation.
6
+
7
+ Usage:
8
+ python extract_ukb_phenotype.py --input ukb_raw.csv --output phenotype.csv
9
+ python extract_ukb_phenotype.py --input ukb_raw.csv --variables sex,age,bmi,smoking --output covariates.csv
10
+ python extract_ukb_phenotype.py --input ukb_raw.csv --custom-mapping mapping.json --output custom.csv
11
+ """
12
+ import argparse
13
+ import csv
14
+ import json
15
+ import sys
16
+ from pathlib import Path
17
+ from typing import Dict, List, Optional
18
+
19
+ import pandas as pd
20
+
21
+ # UKB field ID -> column name mapping (adapted from UKBAnalytica_v2)
22
+ VARIABLE_MAPPING = {
23
+ # Demographics
24
+ "sex": {"field_id": 31, "ukb_col": "p31", "description": "Sex (0=Female, 1=Male)"},
25
+ "age": {"field_id": 21022, "ukb_col": "p21022", "description": "Age at recruitment"},
26
+ "ethnicity": {"field_id": 21000, "ukb_col": "p21000_i0", "description": "Ethnic background"},
27
+ "birth_year": {"field_id": 34, "ukb_col": "p34", "description": "Year of birth"},
28
+ "assessment_centre": {"field_id": 54, "ukb_col": "p54_i0", "description": "UK Biobank assessment centre"},
29
+ "baseline_date": {"field_id": 53, "ukb_col": "p53_i0", "description": "Date of baseline assessment"},
30
+
31
+ # Anthropometrics
32
+ "bmi": {"field_id": 21001, "ukb_col": "p21001_i0", "description": "BMI (kg/m^2)"},
33
+ "height": {"field_id": 50, "ukb_col": "p50_i0", "description": "Standing height (cm)"},
34
+ "weight": {"field_id": 21002, "ukb_col": "p21002_i0", "description": "Weight (kg)"},
35
+ "waist": {"field_id": 48, "ukb_col": "p48_i0", "description": "Waist circumference (cm)"},
36
+
37
+ # Lifestyle
38
+ "smoking": {"field_id": 20116, "ukb_col": "p20116_i0", "description": "Smoking status (0=Never, 1=Previous, 2=Current)"},
39
+ "drinking": {"field_id": 20117, "ukb_col": "p20117_i0", "description": "Alcohol drinker status"},
40
+ "sleep_duration": {"field_id": 1160, "ukb_col": "p1160_i0", "description": "Sleep duration (hours/day)"},
41
+ "physical_activity": {"field_id": 22032, "ukb_col": "p22032_i0", "description": "Physical activity level"},
42
+
43
+ # Socioeconomic
44
+ "education": {"field_id": 6138, "ukb_col": "p6138_i0", "description": "Qualifications"},
45
+ "income": {"field_id": 738, "ukb_col": "p738_i0", "description": "Average total household income"},
46
+ "townsend": {"field_id": 189, "ukb_col": "p189", "description": "Townsend deprivation index"},
47
+
48
+ # Blood Pressure
49
+ "sbp_auto": {"field_id": 4080, "ukb_col": "p4080_i0_a0", "description": "SBP automated reading"},
50
+ "dbp_auto": {"field_id": 4079, "ukb_col": "p4079_i0_a0", "description": "DBP automated reading"},
51
+
52
+ # Biomarkers
53
+ "triglycerides": {"field_id": 30870, "ukb_col": "p30870_i0", "description": "Triglycerides (mmol/L)"},
54
+ "ldl": {"field_id": 30780, "ukb_col": "p30780_i0", "description": "LDL cholesterol (mmol/L)"},
55
+ "hdl": {"field_id": 30760, "ukb_col": "p30760_i0", "description": "HDL cholesterol (mmol/L)"},
56
+ "hba1c": {"field_id": 30750, "ukb_col": "p30750_i0", "description": "HbA1c (mmol/mol)"},
57
+ "glucose": {"field_id": 30740, "ukb_col": "p30740_i0", "description": "Glucose (mmol/L)"},
58
+ "crp": {"field_id": 30710, "ukb_col": "p30710_i0", "description": "C-reactive protein"},
59
+
60
+ # Brain imaging (IDPs)
61
+ "brain_volume": {"field_id": 25000, "ukb_col": "p25000_i0", "description": "Total brain volume (GM+WM)"},
62
+ "gm_volume": {"field_id": 25001, "ukb_col": "p25001_i0", "description": "Grey matter volume"},
63
+ "wm_volume": {"field_id": 25002, "ukb_col": "p25002_i0", "description": "White matter volume"},
64
+ "hippocampus_volume": {"field_id": 25003, "ukb_col": "p25003_i0", "description": "Hippocampal volume"},
65
+ "wmh_volume": {"field_id": 25004, "ukb_col": "p25004_i0", "description": "White matter hyperintensity volume"},
66
+ "ventricular_volume": {"field_id": 25005, "ukb_col": "p25005_i0", "description": "Ventricular volume"},
67
+
68
+ # Cognition
69
+ "fluid_intelligence": {"field_id": 20016, "ukb_col": "p20016_i0", "description": "Fluid intelligence score"},
70
+ "reaction_time": {"field_id": 20023, "ukb_col": "p20023_i0", "description": "Mean reaction time"},
71
+ "memory_pairs": {"field_id": 399, "ukb_col": "p399_i0", "description": "Numeric memory (max digits)"},
72
+ "trail_making_a": {"field_id": 20156, "ukb_col": "p20156_i0", "description": "Trail making test A"},
73
+ "trail_making_b": {"field_id": 20157, "ukb_col": "p20157_i0", "description": "Trail making test B"},
74
+
75
+ # APOE genotype
76
+ "apoe": {"field_id": 22616, "ukb_col": "p22616", "description": "APOE genotype"},
77
+
78
+ # Death
79
+ "death_date": {"field_id": 40000, "ukb_col": "p40000_i0", "description": "Date of death"},
80
+ "death_cause": {"field_id": 40001, "ukb_col": "p40001_i0", "description": "Primary cause of death (ICD-10)"},
81
+
82
+ # Hospital inpatient
83
+ "icd10_primary": {"field_id": 41202, "ukb_col": "p41202", "description": "ICD-10 primary diagnoses"},
84
+ "icd10_date": {"field_id": 41280, "ukb_col": "p41280", "description": "ICD-10 diagnosis dates"},
85
+ }
86
+
87
+ # UKB invalid codes (treated as missing)
88
+ INVALID_CODES = [-1, -3, -9]
89
+
90
+
91
+ def preprocess_variable(series: pd.Series, var_name: str, invalid_codes: List[int]) -> pd.Series:
92
+ """Apply variable-specific preprocessing."""
93
+ s = series.copy()
94
+
95
+ # Replace invalid codes with NaN
96
+ if s.dtype in ("int64", "float64"):
97
+ for code in invalid_codes:
98
+ s = s.replace(code, pd.NA)
99
+
100
+ # Variable-specific transformations
101
+ if var_name == "ethnicity":
102
+ # Recode: White=0, non-White=1
103
+ s = s.apply(lambda x: 0 if x == 1 else (1 if pd.notna(x) and x > 0 else pd.NA))
104
+
105
+ elif var_name == "education":
106
+ # Recode: College/University degree -> High; A levels/GCSEs -> Medium; None -> Low
107
+ def edu_recode(x):
108
+ if pd.isna(x):
109
+ return pd.NA
110
+ x = int(x)
111
+ if x in [1, 2, 3, 4]: # College/University
112
+ return 3
113
+ elif x in [5, 6]: # A levels, O levels/GCSEs
114
+ return 2
115
+ elif x in [7]: # CSEs
116
+ return 1
117
+ else:
118
+ return 1
119
+ s = s.apply(edu_recode)
120
+
121
+ elif var_name == "smoking":
122
+ # 0=Never, 1=Previous, 2=Current
123
+ s = s.apply(lambda x: x if x in [0, 1, 2] else pd.NA)
124
+
125
+ return s
126
+
127
+
128
+ def load_custom_mapping(path: Path) -> Dict:
129
+ """Load custom variable mapping from JSON file."""
130
+ with open(path, "r", encoding="utf-8") as f:
131
+ return json.load(f)
132
+
133
+
134
+ def extract_phenotype(
135
+ input_path: Path,
136
+ variables: Optional[List[str]] = None,
137
+ custom_mapping: Optional[Dict] = None,
138
+ drop_missing: bool = False,
139
+ ) -> pd.DataFrame:
140
+ """Extract and preprocess UKB phenotype data."""
141
+ df = pd.read_csv(input_path, low_memory=False)
142
+ print(f"Loaded {len(df)} rows, {len(df.columns)} columns")
143
+
144
+ # Merge mappings
145
+ mapping = dict(VARIABLE_MAPPING)
146
+ if custom_mapping:
147
+ mapping.update(custom_mapping)
148
+
149
+ # Default variables: demographics + key covariates
150
+ if variables is None:
151
+ variables = ["sex", "age", "ethnicity", "bmi", "smoking", "education", "townsend"]
152
+
153
+ # Validate
154
+ invalid = [v for v in variables if v not in mapping]
155
+ if invalid:
156
+ print(f"[WARN] Unknown variables: {invalid}")
157
+ variables = [v for v in variables if v in mapping]
158
+
159
+ # Process each variable
160
+ result = pd.DataFrame()
161
+ result["eid"] = df["eid"]
162
+
163
+ processed = []
164
+ for var in variables:
165
+ var_info = mapping[var]
166
+ ukb_col = var_info["ukb_col"]
167
+
168
+ # Try exact column match, then prefix match
169
+ if ukb_col in df.columns:
170
+ col = ukb_col
171
+ else:
172
+ candidates = [c for c in df.columns if c.startswith(ukb_col)]
173
+ col = candidates[0] if candidates else None
174
+
175
+ if col is None:
176
+ print(f"[WARN] Column '{ukb_col}' not found for variable '{var}', skipping")
177
+ continue
178
+
179
+ result[var] = preprocess_variable(df[col], var, INVALID_CODES)
180
+ processed.append(var)
181
+
182
+ print(f"Processed {len(processed)} variables: {processed}")
183
+
184
+ if drop_missing:
185
+ before = len(result)
186
+ result = result.dropna(subset=processed)
187
+ print(f"Dropped {before - len(result)} rows with missing values")
188
+
189
+ return result
190
+
191
+
192
+ def main() -> int:
193
+ parser = argparse.ArgumentParser(description="Extract UKB phenotype data.")
194
+ parser.add_argument("--input", required=True, help="Path to UKB raw CSV")
195
+ parser.add_argument("--output", required=True, help="Output path for phenotype CSV")
196
+ parser.add_argument("--variables", help="Comma-separated variable names (default: core covariates)")
197
+ parser.add_argument("--custom-mapping", help="JSON file with custom variable mappings")
198
+ parser.add_argument("--drop-missing", action="store_true", help="Drop rows with missing values")
199
+ parser.add_argument("--list-variables", action="store_true", help="List available variables and exit")
200
+ args = parser.parse_args()
201
+
202
+ if args.list_variables:
203
+ print("Available variables:")
204
+ for name, info in VARIABLE_MAPPING.items():
205
+ print(f" {name}: {info['description']} (field {info['field_id']}, col {info['ukb_col']})")
206
+ return 0
207
+
208
+ input_path = Path(args.input).resolve()
209
+ if not input_path.exists():
210
+ print(f"Input file not found: {input_path}", file=sys.stderr)
211
+ return 1
212
+
213
+ variables = None
214
+ if args.variables:
215
+ variables = [v.strip() for v in args.variables.split(",")]
216
+
217
+ custom_mapping = None
218
+ if args.custom_mapping:
219
+ custom_mapping = load_custom_mapping(Path(args.custom_mapping).resolve())
220
+
221
+ result = extract_phenotype(input_path, variables, custom_mapping, args.drop_missing)
222
+
223
+ output_path = Path(args.output).resolve()
224
+ output_path.parent.mkdir(parents=True, exist_ok=True)
225
+ result.to_csv(output_path, index=False)
226
+ print(f"Saved {len(result)} rows, {len(result.columns)} columns -> {output_path}")
227
+
228
+ return 0
229
+
230
+
231
+ if __name__ == "__main__":
232
+ sys.exit(main())
@@ -0,0 +1,158 @@
1
+ #!/usr/bin/env python3
2
+ """Generate QC summaries for UK Biobank brain-related data.
3
+
4
+ Tracks data completeness, imaging availability, and exclusion criteria.
5
+
6
+ Usage:
7
+ python ukb_qc_summary.py --input ukb_raw.csv --output qc_summary.csv
8
+ python ukb_qc_summary.py --input ukb_raw.csv --imaging-check --output qc_imaging.csv
9
+ """
10
+ import argparse
11
+ import sys
12
+ from pathlib import Path
13
+ from typing import Dict, List
14
+
15
+ import pandas as pd
16
+
17
+
18
+ def check_completeness(df: pd.DataFrame, required_cols: List[str]) -> Dict:
19
+ """Check data completeness for required columns."""
20
+ stats = {}
21
+ for col in required_cols:
22
+ if col in df.columns:
23
+ n_missing = df[col].isna().sum()
24
+ stats[col] = {
25
+ "n_present": len(df) - n_missing,
26
+ "n_missing": n_missing,
27
+ "pct_complete": (len(df) - n_missing) / len(df) * 100,
28
+ }
29
+ else:
30
+ stats[col] = {"n_present": 0, "n_missing": len(df), "pct_complete": 0}
31
+ return stats
32
+
33
+
34
+ def check_imaging_availability(df: pd.DataFrame) -> Dict:
35
+ """Check brain imaging data availability."""
36
+ imaging_checks = {
37
+ "T1w": ["p25000_i0", "p25001_i0", "p25002_i0"], # Brain volume IDPs
38
+ "T2_FLAIR": ["p25004_i0"], # WMH volume
39
+ "dMRI": ["p25008_i0", "p25009_i0"], # DTI IDPs
40
+ "rsfMRI": ["p25010_i0", "p25011_i0"], # fMRI IDPs
41
+ }
42
+
43
+ results = {}
44
+ for modality, cols in imaging_checks.items():
45
+ available = [c for c in cols if c in df.columns]
46
+ if available:
47
+ # Has data if at least one imaging column is non-null
48
+ has_data = df[available].notna().any(axis=1).sum()
49
+ results[modality] = {"n_available": has_data, "pct": has_data / len(df) * 100}
50
+ else:
51
+ results[modality] = {"n_available": 0, "pct": 0}
52
+
53
+ return results
54
+
55
+
56
+ def generate_qc(
57
+ df: pd.DataFrame,
58
+ required_cols: List[str] = None,
59
+ imaging_check: bool = False,
60
+ age_range: tuple = None,
61
+ ) -> pd.DataFrame:
62
+ """Generate per-subject QC summary."""
63
+ if required_cols is None:
64
+ required_cols = ["p31", "p21022", "p21001_i0"] # sex, age, bmi
65
+
66
+ result = pd.DataFrame({"eid": df["eid"]})
67
+
68
+ # Age filtering
69
+ if age_range and "p21022" in df.columns:
70
+ age = df["p21022"]
71
+ result["in_age_range"] = ((age >= age_range[0]) & (age <= age_range[1])).astype(int)
72
+ else:
73
+ result["in_age_range"] = 1
74
+
75
+ # Missing data count
76
+ available_required = [c for c in required_cols if c in df.columns]
77
+ if available_required:
78
+ result["n_missing_covariates"] = df[available_required].isna().sum(axis=1)
79
+ result["complete_covariates"] = (result["n_missing_covariates"] == 0).astype(int)
80
+ else:
81
+ result["n_missing_covariates"] = 0
82
+ result["complete_covariates"] = 1
83
+
84
+ # Imaging availability
85
+ if imaging_check:
86
+ imaging_cols = {
87
+ "has_brain_volume": ["p25000_i0"],
88
+ "has_gm_volume": ["p25001_i0"],
89
+ "has_wm_volume": ["p25002_i0"],
90
+ "has_hippocampus": ["p25003_i0"],
91
+ "has_wmh": ["p25004_i0"],
92
+ }
93
+ for name, cols in imaging_cols.items():
94
+ available = [c for c in cols if c in df.columns]
95
+ if available:
96
+ result[name] = df[available].notna().any(axis=1).astype(int)
97
+ else:
98
+ result[name] = 0
99
+
100
+ # Overall QC pass
101
+ qc_pass = (result["complete_covariates"] == 1) & (result["in_age_range"] == 1)
102
+ result["qc_pass"] = qc_pass.astype(int)
103
+
104
+ return result
105
+
106
+
107
+ def main() -> int:
108
+ parser = argparse.ArgumentParser(description="Generate UKB QC summary.")
109
+ parser.add_argument("--input", required=True, help="Path to UKB raw CSV")
110
+ parser.add_argument("--output", required=True, help="Output path for QC summary CSV")
111
+ parser.add_argument("--imaging-check", action="store_true", help="Include imaging availability check")
112
+ parser.add_argument("--age-min", type=float, default=None, help="Minimum age filter")
113
+ parser.add_argument("--age-max", type=float, default=None, help="Maximum age filter")
114
+ parser.add_argument("--required-cols", help="Comma-separated required column names")
115
+ args = parser.parse_args()
116
+
117
+ input_path = Path(args.input).resolve()
118
+ if not input_path.exists():
119
+ print(f"Input file not found: {input_path}", file=sys.stderr)
120
+ return 1
121
+
122
+ df = pd.read_csv(input_path, low_memory=False)
123
+ print(f"Loaded {len(df)} subjects")
124
+
125
+ required_cols = None
126
+ if args.required_cols:
127
+ required_cols = [c.strip() for c in args.required_cols.split(",")]
128
+
129
+ age_range = None
130
+ if args.age_min is not None and args.age_max is not None:
131
+ age_range = (args.age_min, args.age_max)
132
+
133
+ result = generate_qc(df, required_cols, args.imaging_check, age_range)
134
+
135
+ # Summary
136
+ n_total = len(result)
137
+ n_pass = result["qc_pass"].sum()
138
+ print(f"\nQC Summary:")
139
+ print(f" Total subjects: {n_total}")
140
+ print(f" QC pass: {n_pass} ({n_pass/n_total*100:.1f}%)")
141
+ print(f" QC fail: {n_total - n_pass} ({(n_total-n_pass)/n_total*100:.1f}%)")
142
+
143
+ if args.imaging_check:
144
+ for col in ["has_brain_volume", "has_gm_volume", "has_wm_volume", "has_hippocampus", "has_wmh"]:
145
+ if col in result.columns:
146
+ n = result[col].sum()
147
+ print(f" {col}: {n} ({n/n_total*100:.1f}%)")
148
+
149
+ output_path = Path(args.output).resolve()
150
+ output_path.parent.mkdir(parents=True, exist_ok=True)
151
+ result.to_csv(output_path, index=False)
152
+ print(f"Saved -> {output_path}")
153
+
154
+ return 0
155
+
156
+
157
+ if __name__ == "__main__":
158
+ sys.exit(main())
@@ -0,0 +1,133 @@
1
+ ---
2
+ name: wmh-segmentation
3
+ description: "Use this skill whenever the user wants to perform automated white matter hyperintensity (WMH) segmentation on structural MRI data using the MARS-WMH nnU-Net model. Requires one FLAIR and one T1w NIfTI image (no contrast). Triggers include: 'wmh', 'white matter hyperintensities', 'WMH segmentation', 'MARS-WMH', 'wmh-nnunet', 'segment FLAIR T1', 'white matter lesions', 'vascular WMH', 'mars wmh', or any request to run nnU-Net WMH segmentation on FLAIR+T1w pair."
4
+ license: MIT License (NeuroClaw custom skill – freely modifiable within the project)
5
+ layer: base
6
+ skill_type: tool
7
+ dependencies:
8
+ - claw-shell
9
+ ---
10
+ # WMH Segmentation (MARS-WMH nnU-Net)
11
+
12
+ ## Overview
13
+ MARS-WMH is the state-of-the-art, clinically-validated deep-learning tool (nnU-Net architecture) for segmenting brain white matter hyperintensities of presumed vascular origin. It takes a FLAIR image (recommended 1 mm isotropic) and a co-registered or registrable T1w image (1 mm isotropic, no contrast) and outputs a precise WMH segmentation mask in NIfTI format (returned in the original input resolution).
14
+
15
+ This skill serves as the **NeuroClaw interface-layer wrapper** for the official MARS-WMH Docker container (`ghcr.io/miac-research/wmh-nnunet:latest`) and strictly follows the hierarchical design:
16
+
17
+ 1. Check whether Docker (with NVIDIA Container Toolkit) is installed (`docker --version` + `nvidia-smi` via `claw-shell`).
18
+ 2. If `nvidia-smi` fails → immediately print the exact NVIDIA Container Toolkit installation commands and instruct the user to run them manually before retry.
19
+ 3. If paths not provided → interactively ask the user for FLAIR and T1w full paths and confirm they exist on disk.
20
+ 4. If paths provided → verify file existence and readability.
21
+ 5. Prepare clean working directory, copy inputs, generate exact Docker pull/tag + run commands.
22
+ 6. Generate a numbered execution plan.
23
+ 7. Present the plan, estimated runtime (~5–15 min on GPU), requirements and risks → wait for explicit user confirmation (“YES” / “execute” / “proceed”).
24
+ 8. On confirmation → delegate **all** shell execution to `claw-shell`.
25
+ 9. Report completion, exact output mask location, and next steps.
26
+
27
+ **Key design principle (2026 update)**: All Docker execution is routed through `claw-shell`.
28
+
29
+ ## Quick Reference (Common Use Cases)
30
+
31
+ | Task | Recommended approach |
32
+ |-----------------------------------|-----------------------------------------------------------|
33
+ | Standard WMH segmentation | Default Docker run (nnU-Net, GPU) |
34
+ | Already co-registered images | Add `--skipRegistration` flag |
35
+ | CPU-only fallback | Remove `--gpus all` (slow) |
36
+
37
+ ## Installation Check & Setup
38
+ Installation of Docker is delegated to `dependency-planner`.
39
+
40
+ GPU check performed before every run:
41
+
42
+ - If `nvidia-smi` fails, prompt user to run:
43
+
44
+ ```bash
45
+ curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | \
46
+ sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
47
+ curl -fsSL https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
48
+ sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#' | \
49
+ sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list > /dev/null
50
+ sudo apt-get update
51
+ sudo apt-get install -y nvidia-container-toolkit
52
+ sudo nvidia-ctk runtime configure --runtime=docker
53
+ sudo systemctl restart docker
54
+ ```
55
+
56
+ **Prerequisites**:
57
+ - `dependency-planner`
58
+ - `claw-shell`
59
+ - NVIDIA GPU + drivers
60
+ - ≥8 GB VRAM
61
+
62
+ ## NeuroClaw recommended wrapper script
63
+ ```bash
64
+ # WMH Segmentation Shell Commands (execute via claw-shell)
65
+
66
+ # 0. GPU check
67
+ nvidia-smi >/dev/null 2>&1 || {
68
+ echo "GPU not detected. Run the following commands to install NVIDIA Container Toolkit:"
69
+ cat << 'EOF'
70
+ curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | \
71
+ sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
72
+ curl -fsSL https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
73
+ sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#' | \
74
+ sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list > /dev/null
75
+ sudo apt-get update
76
+ sudo apt-get install -y nvidia-container-toolkit
77
+ sudo nvidia-ctk runtime configure --runtime=docker
78
+ sudo systemctl restart docker
79
+ EOF
80
+ exit 1
81
+ }
82
+
83
+ # 1. Pull & tag
84
+ docker pull ghcr.io/miac-research/wmh-nnunet:latest
85
+ docker tag ghcr.io/miac-research/wmh-nnunet:latest mars-wmh-nnunet:latest
86
+
87
+ # 2. Prepare workspace (replace paths with user-provided FLAIR/T1w)
88
+ FLAIR="/path/to/FLAIR.nii.gz"
89
+ T1="/path/to/T1w.nii.gz"
90
+ OUTPUT_DIR="wmh_output"
91
+ mkdir -p "$OUTPUT_DIR"
92
+ cp "$FLAIR" "$OUTPUT_DIR/FLAIR.nii.gz"
93
+ cp "$T1" "$OUTPUT_DIR/T1w.nii.gz"
94
+
95
+ # 3. Fix Docker data directory permission issues (common on Ubuntu)
96
+ chmod -R 777 "$OUTPUT_DIR"
97
+
98
+ # 4. Run inference
99
+ docker run --rm --gpus all \
100
+ -v "$(pwd)/$OUTPUT_DIR:/data" \
101
+ mars-wmh-nnunet:latest \
102
+ --flair /data/FLAIR.nii.gz \
103
+ --t1 /data/T1w.nii.gz
104
+
105
+ # 5. Show output mask
106
+ ls -lh "$OUTPUT_DIR"/*.nii*
107
+ echo "WMH segmentation mask saved in $OUTPUT_DIR"
108
+ ```
109
+
110
+ ## Important Notes & Limitations
111
+ - Docker data directory permission issues are automatically fixed with `chmod -R 777` on the output directory.
112
+ - If `docker run` fails with permission denied → run `newgrp docker` first, then retry.
113
+ - First run pulls image (~several GB); subsequent runs are fast.
114
+ - Input must be NIfTI; use `dcm2nii` if starting from DICOM.
115
+ - Output mask appears in `$OUTPUT_DIR` (exact filename shown by final `ls`).
116
+
117
+ ## When to Call This Skill
118
+ - User provides FLAIR + T1w and wants WMH segmentation.
119
+ - Any mention of MARS-WMH, nnU-Net WMH, white matter lesions segmentation.
120
+
121
+ ## Complementary / Related Skills
122
+ - `dcm2nii` → convert DICOM to NIfTI input
123
+ - `dependency-planner` → install Docker and NVIDIA Container Toolkit
124
+ - `claw-shell` → safe Docker execution
125
+
126
+ ## Reference
127
+ Official repo: https://github.com/miac-research/MARS-WMH
128
+ Docker image: `ghcr.io/miac-research/wmh-nnunet:latest`
129
+ Custom NeuroClaw skill.
130
+
131
+ Created At: 2026-03-23
132
+ Last Updated At: 2026-03-26 00:29 HKT
133
+ Author: chengwang96
@@ -0,0 +1,118 @@
1
+ ---
2
+ name: detrending
3
+ description: "Use this model doc whenever the user wants to perform neuroimaging signal denoising with classical detrending methods. This is a non-deep-learning preprocessing route focused on removing low-frequency drift and linear trends from time series before downstream analysis."
4
+ license: MIT License (NeuroClaw custom skill - freely modifiable within the project)
5
+ layer: base
6
+ skill_type: model
7
+ dependencies:
8
+ - fmri-skill
9
+ - nilearn-tool
10
+ - run_models
11
+ ---
12
+ # Detrending Model Doc
13
+
14
+ ## Overview
15
+ Detrending is a classical non-deep-learning method for neuroimaging signal denoising.
16
+
17
+ - Model family: non-deep-learning preprocessing and denoising method
18
+ - Typical objectives:
19
+ - remove low-frequency drift and temporal trends
20
+ - stabilize time series before connectivity, decoding, or statistical analysis
21
+ - prepare cleaner voxel-wise or ROI-wise time series for downstream workflows
22
+ - Primary input: preprocessed fMRI time series, optional confounds, optional mask, TR
23
+ - Primary output: cleaned BOLD image, cleaned ROI time series, optional QC summaries
24
+
25
+ In NeuroClaw, this document is model-level guidance for detrending workflows rather than predictive modeling.
26
+
27
+ Upstream preparation should usually be delegated to:
28
+ - `fmri-skill` for modality-level denoising planning and validated preprocessing sequences
29
+ - `nilearn-tool` for concrete detrending and cleaned time series export
30
+
31
+ **Research use only.**
32
+
33
+ ---
34
+
35
+ ## Quick Start
36
+
37
+ ### 1) Prepare denoising inputs
38
+ Expected inputs:
39
+ - preprocessed BOLD image
40
+ - repetition time (`TR`)
41
+ - optional confounds TSV
42
+ - optional brain mask
43
+
44
+ If images are not preprocessed yet, delegate to `fmri-skill` first.
45
+
46
+ ### 2) Detrending route
47
+ Representative operations:
48
+ - load preprocessed image or extracted ROI time series
49
+ - remove constant and linear temporal trends
50
+ - optionally combine detrending with confound regression or standardization
51
+ - export cleaned image or time series table
52
+
53
+ Example execution route:
54
+ ```bash
55
+ # delegated through claw-shell after preprocessing is confirmed
56
+ python skills/nilearn-tool/scripts/denoise_timeseries_reference.py \
57
+ --bold path/to/sub-001_rest_preproc_bold.nii.gz \
58
+ --confounds path/to/sub-001_confounds.tsv \
59
+ --tr 2.0 \
60
+ --detrend \
61
+ --output-dir run_models_output/detrending
62
+ ```
63
+
64
+ ---
65
+
66
+ ## Input / Output Contract
67
+
68
+ ### Required inputs
69
+ - preprocessed BOLD image or extracted time series
70
+ - TR when combined with temporal cleaning workflow metadata
71
+
72
+ ### Optional inputs
73
+ - confounds table
74
+ - mask image
75
+ - standardization options
76
+
77
+ ### Produced outputs
78
+ - cleaned BOLD image or cleaned time series
79
+ - optional QC summary of detrending settings
80
+
81
+ ---
82
+
83
+ ## Recommended Delegation
84
+
85
+ - modality-level denoising plan -> `fmri-skill`
86
+ - concrete implementation of detrending -> `nilearn-tool`
87
+ - shell execution and logging -> `claw-shell`
88
+
89
+ No execution before explicit plan confirmation.
90
+
91
+ ---
92
+
93
+ ## When to Use Detrending
94
+
95
+ - The user wants signal cleaning rather than statistical modeling or prediction.
96
+ - The goal is to remove drift before connectivity or decoding.
97
+ - The workflow needs standardized temporal preprocessing before ROI extraction.
98
+ - A classical transparent denoising baseline is preferred over learned denoising methods.
99
+ - The user explicitly asks for detrending or drift removal.
100
+
101
+ ---
102
+
103
+ ## Limitations and Notes
104
+
105
+ - Detrending alone does not remove motion or physiological confounds unless combined with regression.
106
+ - Detrending choices should be reported because they directly affect downstream analyses.
107
+ - Aggressive cleaning sequences can alter downstream effect estimates if applied without task awareness.
108
+
109
+ ---
110
+
111
+ ## Reference
112
+
113
+ - Ciric R et al. Benchmarking of participant-level confound regression strategies for the control of motion artifact in studies of functional connectivity.
114
+ - Nilearn signal cleaning documentation: https://nilearn.github.io/stable/modules/generated/nilearn.image.clean_img.html
115
+
116
+ Created At: 2026-04-14 00:40 HKT
117
+ Last Updated At: 2026-04-14 00:45 HKT
118
+ Author: chengwang96