@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,210 @@
1
+ ---
2
+ name: hcpd-skill
3
+ description: "Use this skill whenever the user wants an end-to-end workflow for the HCP Development (HCP-D) dataset, including dataset download, BIDS organization, and multimodal processing of sMRI, fMRI, and dMRI. Triggers include: 'HCP Development', 'HCP-D', 'process HCP Development data', 'HCP Development sMRI fMRI', or any request to run the HCP-D multimodal pipeline."
4
+ license: MIT License (NeuroClaw custom skill - freely modifiable within the project)
5
+ layer: subagent
6
+ skill_type: dataset
7
+ dependencies:
8
+ - smri-skill
9
+ - fmri-skill
10
+ - dwi-skill
11
+ - bids-organizer
12
+ - claw-shell
13
+ complementary_skills:
14
+ - hcppipeline-tool
15
+ ---
16
+ # HCP-D Skill (Dataset-Orchestration Layer)
17
+
18
+ ## Overview
19
+
20
+ `hcpd-skill` is the NeuroClaw orchestration skill for the **HCP Development (HCP-D)** dataset.
21
+
22
+ It strictly follows the NeuroClaw hierarchical design principles:
23
+ - This skill **only describes WHAT needs to be done** and **which tool skill to delegate to**.
24
+ - It contains **no implementation code or concrete commands**.
25
+ - All concrete execution is delegated to existing base/tool skills via `claw-shell`.
26
+ - Companion scripts in `scripts/` provide reference implementations for data reorganization, phenotype extraction, and QC.
27
+
28
+ **Core workflow (never bypassed):**
29
+ 1. Identify input HCP-D data and target modalities.
30
+ 2. Generate a **numbered execution plan** clearly stating WHAT needs to be done and which tool skill will handle each step.
31
+ 3. Present the full plan, estimated runtime, resource requirements, and risks to the user and wait for explicit confirmation ("YES" / "execute" / "proceed").
32
+ 4. On confirmation, delegate every step to the appropriate skill via `claw-shell`.
33
+ 5. After execution, save all outputs in a clean directory structure (`hcpd_output/`).
34
+
35
+ **Research use only.**
36
+
37
+ ---
38
+
39
+ ## Quick Reference
40
+
41
+ | Task | What needs to be done | Delegate to | Expected output |
42
+ |---|---|---|---|
43
+ | Data download | Download HCP-D from ConnectomeDB | `claw-shell` | Raw HCP-D files |
44
+ | BIDS staging | Reorganize HCP-D native layout to BIDS | `scripts/reorganize_hcpd.py` | BIDS-compliant dataset |
45
+ | sMRI processing | Brain extraction, tissue segmentation, cortical reconstruction | `smri-skill` | `smri_output/` derivatives |
46
+ | fMRI processing | Preprocessing, denoising, connectivity, task GLM | `fmri-skill` | `fmri_output/` derivatives |
47
+ | dMRI processing | Eddy correction, tensor metrics, tractography | `dwi-skill` | `dwi_output/` metrics |
48
+ | Phenotype extraction | Cognitive, behavioral, developmental data | `scripts/extract_hcpd_phenotype.py` | Merged phenotype CSV |
49
+ | QC summary | Per-subject quality control | `scripts/hcpd_qc_summary.py` | QC summary + exclusion list |
50
+
51
+ ---
52
+
53
+ ## Download Stage (Mandatory First Step)
54
+
55
+ ### Source
56
+ HCP-D data is distributed through **ConnectomeDB**:
57
+ - Website: https://db.humanconnectome.org/
58
+ - Requires ConnectomeDB account and data use agreement
59
+ - Part of the HCP Lifespan initiative
60
+
61
+ ### Dataset Characteristics
62
+ - **Cohort**: ~600+ children and adolescents ages 5-21 years
63
+ - **Modalities**: T1w, T2w, dMRI, rs-fMRI, task-fMRI
64
+ - **Focus**: Brain development, maturation of neural circuits, cognitive and emotional development
65
+ - **Unique feature**: Covers the developmental period from childhood to early adulthood
66
+
67
+ ### Download Inputs to Confirm in Plan
68
+ - ConnectomeDB credentials/token
69
+ - Target modalities (all, structural, functional, diffusion)
70
+ - Subject list scope (full or custom subset)
71
+ - Destination directory with sufficient disk space
72
+
73
+ ---
74
+
75
+ ## HCP-D Task Paradigms
76
+
77
+ | Task | Description | Duration |
78
+ |---|---|---|
79
+ | MOTOR | Finger tapping, toe movement, tongue movement | ~3 min |
80
+ | EMOTION | Faces and shapes matching | ~2 min |
81
+ | GAMBLING | Card guessing with reward/loss | ~3 min |
82
+ | LANGUAGE | Story comprehension and math | ~4 min |
83
+ | RELATIONAL | Relational reasoning matching | ~3 min |
84
+ | SOCIAL | Social cognition (mentalizing) movie clips | ~3 min |
85
+ | WM | Working memory (faces, places, tools, body parts) | ~5 min |
86
+ | REST | Resting-state (eyes open) | ~15 min × 4 runs |
87
+
88
+ ---
89
+
90
+ ## BIDS Preparation
91
+
92
+ ### Script: `scripts/reorganize_hcpd.py`
93
+
94
+ Converts HCP-D native directory structure to BIDS-compliant layout.
95
+
96
+ ```bash
97
+ python skills/hcpd-skill/scripts/reorganize_hcpd.py \
98
+ --input /path/to/HCPD/raw \
99
+ --output /path/to/HCPD/bids \
100
+ --participants /path/to/subject_list.txt
101
+ ```
102
+
103
+ Features:
104
+ - Subject ID normalization: HCP format to BIDS `sub-` labels
105
+ - Age-band session handling if applicable
106
+ - Modality routing: T1w, T2w, dMRI, rs-fMRI, task-fMRI
107
+ - Sidecar JSON generation from HCP metadata
108
+ - `dataset_description.json` and `participants.tsv` generation
109
+ - Dry-run mode: `--dry-run` to preview without copying
110
+
111
+ ---
112
+
113
+ ## Core Workflow (Never Bypassed)
114
+
115
+ 1. Identify user target: full HCP-D processing, imaging subset, phenotype extraction, or BIDS staging only.
116
+ 2. Generate a numbered plan with tools, outputs, runtime, storage, and risks.
117
+ 3. Wait for explicit confirmation (`YES` / `execute` / `proceed`).
118
+ 4. On confirmation, run download stage first (if needed).
119
+ 5. After download success, run BIDS preparation using `scripts/reorganize_hcpd.py`.
120
+ 6. Delegate to `smri-skill` for structural MRI processing.
121
+ 7. Delegate to `fmri-skill` for functional MRI processing.
122
+ 8. Delegate to `dwi-skill` for diffusion MRI processing.
123
+ 9. If phenotype extraction is requested, run `scripts/extract_hcpd_phenotype.py`.
124
+ 10. If QC summary is requested, run `scripts/hcpd_qc_summary.py`.
125
+ 11. Save outputs into `hcpd_output/`.
126
+
127
+ ---
128
+
129
+ ## Modality Processing Delegation
130
+
131
+ | Modality | Delegated skill | Typical tasks | Main outputs |
132
+ |---|---|---|---|
133
+ | sMRI (T1w/T2w) | `smri-skill` | brain extraction, tissue segmentation, cortical reconstruction, ROI morphometry | `smri_output/` derivatives |
134
+ | fMRI (rs-fMRI/task-fMRI) | `fmri-skill` | preprocessing, denoising, ROI time series, connectivity, task GLM | `fmri_output/` derivatives |
135
+ | dMRI (DWI) | `dwi-skill` | eddy correction, tensor metrics, tractography, connectome | `dwi_output/` metrics |
136
+
137
+ ---
138
+
139
+ ## Standard Output Layout
140
+
141
+ ```
142
+ hcpd_output/
143
+ ├── raw/ # Downloaded original HCP-D files
144
+ ├── bids/ # BIDS-staged data
145
+ ├── smri/ # Structural MRI derivatives
146
+ ├── fmri/ # Functional MRI derivatives
147
+ ├── dwi/ # Diffusion MRI derivatives
148
+ ├── phenotype/ # Merged phenotype tables
149
+ ├── qc/ # QC summaries and exclusion lists
150
+ └── logs/ # Download + orchestration logs
151
+ ```
152
+
153
+ ---
154
+
155
+ ## Benchmark Adapter Guidance
156
+
157
+ For benchmark-style prompts, do not force the full orchestration when the task only asks for local HCP-D data staging.
158
+
159
+ - If the task starts from raw HCP-D data already present on disk and only asks for BIDS-style staging:
160
+ - Skip the mandatory download stage
161
+ - Default to the narrow path `local raw HCP-D discovery -> BIDS-style staging -> minimal metadata -> validation/report`
162
+ - In benchmark mode, do not require explicit confirmation before presenting the direct staging solution.
163
+
164
+ ---
165
+
166
+ ## Safety and Execution Policy
167
+ - No execution before explicit plan confirmation.
168
+ - All execution must be routed via `claw-shell`.
169
+ - Missing dependencies must be resolved by `dependency-planner` before running.
170
+
171
+ ---
172
+
173
+ ## Important Notes and Limitations
174
+ - HCP-D covers ages 5-21 years; pediatric processing may require age-specific templates and atlases.
175
+ - Head motion is typically higher in pediatric populations; QC thresholds may need adjustment.
176
+ - HCP-D complements HCP-YA (22-35) and HCP-A (36-100) to cover the full lifespan.
177
+ - For HCP-native preprocessing, optionally delegate to `hcppipeline-tool`.
178
+ - `hcpd-skill` is orchestration-only; detailed preprocessing logic remains in modality skills.
179
+
180
+ ---
181
+
182
+ ## When to Call This Skill
183
+ - User asks for end-to-end HCP Development workflow.
184
+ - User asks to download HCP-D and run sMRI/fMRI/DTI processing.
185
+ - User needs BIDS staging for HCP-D data.
186
+ - User asks to extract HCP-D phenotype data (cognitive, behavioral, developmental).
187
+
188
+ ---
189
+
190
+ ## Complementary / Related Skills
191
+ - `smri-skill` → structural MRI preprocessing
192
+ - `fmri-skill` → functional MRI preprocessing and analysis
193
+ - `dwi-skill` → diffusion MRI preprocessing and analysis
194
+ - `hcppipeline-tool` → HCP-native minimal preprocessing pipelines
195
+ - `bids-organizer` → BIDS validation and organization
196
+ - `brain-visualization` → visualization of derivatives
197
+ - `dependency-planner` → dependency resolution
198
+ - `conda-env-manager` → environment management
199
+ - `claw-shell` → command execution
200
+
201
+ ---
202
+
203
+ ## Reference
204
+ - HCP Development: https://www.humanconnectome.org/study/hcp-lifespan-development
205
+ - ConnectomeDB: https://db.humanconnectome.org/
206
+ - Somerville et al. (2018): The Lifespan Human Connectome Project in Development
207
+
208
+ Created At: 2026-05-06 13:02 HKT
209
+ Last Updated At: 2026-05-06 13:02 HKT
210
+ Author: chengwang96
@@ -0,0 +1,148 @@
1
+ #!/usr/bin/env python3
2
+ """Extract and merge HCP Development phenotype data.
3
+
4
+ Focuses on developmental measures: cognitive maturation, behavioral
5
+ assessment, pubertal status, and age-appropriate cognitive tasks.
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", "PIN"],
15
+ "age": ["Age_in_Yrs", "Age"],
16
+ "sex": ["Gender", "Sex"],
17
+ "handedness": ["Handedness"],
18
+ "race": ["Race"],
19
+ "ethnicity": ["Ethnicity"],
20
+ # Developmental measures
21
+ "pubertal_status": ["PDS_PubertalStatus", "PubertalStatus"],
22
+ "pubertal_category": ["PDS_Category"],
23
+ # Cognitive measures (age-appropriate)
24
+ "pmat24_a_cr": ["PMAT24_A_CR"],
25
+ "cardsort_unadj": ["CardSort_Unadj"],
26
+ "flanker_unadj": ["Flanker_Unadj"],
27
+ "list_unadj": ["List_Unadj"],
28
+ "picvocab_unadj": ["PicVocab_Unadj"],
29
+ "procsp_unadj": ["ProcSpeed_Unadj"],
30
+ "readeng_unadj": ["ReadEng_Unadj"],
31
+ "picseq_unadj": ["PicSeq_Unadj"],
32
+ "pattern_unadj": ["Pattern_Unadj"],
33
+ # Behavioral
34
+ "cbcl_internalizing": ["CBCL_Internalizing"],
35
+ "cbcl_externalizing": ["CBCL_Externalizing"],
36
+ "cbcl_total": ["CBCL_Total"],
37
+ "upps_negative_urgency": ["UPPS_Negative_Urgency"],
38
+ "upps_lack_perseverance": ["UPPS_Lack_Perseverance"],
39
+ "upps_positive_urgency": ["UPPS_Positive_Urgency"],
40
+ "upps_sensation_seeking": ["UPPS_Sensation_Seeking"],
41
+ "upps_lack_planning": ["UPPS_Lack_Planning"],
42
+ # Physical measures
43
+ "height": ["Height", "Height_In"],
44
+ "weight": ["Weight", "BMI"],
45
+ "bmi_percentile": ["BMI_Percentile"],
46
+ }
47
+
48
+
49
+ def load_csv(path: Path) -> List[Dict[str, str]]:
50
+ delimiter = "\t" if path.suffix == ".tsv" else ","
51
+ with open(path, "r", encoding="utf-8") as f:
52
+ reader = csv.DictReader(f, delimiter=delimiter)
53
+ return list(reader)
54
+
55
+
56
+ def find_column(row: Dict[str, str], candidates: List[str]) -> Optional[str]:
57
+ for col in candidates:
58
+ if col in row:
59
+ return col
60
+ return None
61
+
62
+
63
+ def extract_phenotype(
64
+ phenotype_files: List[Path],
65
+ imaging_ids: Optional[List[str]] = None,
66
+ columns: Optional[List[str]] = None,
67
+ ) -> List[Dict[str, str]]:
68
+ all_data = []
69
+ for fpath in phenotype_files:
70
+ all_data.extend(load_csv(fpath))
71
+
72
+ if not all_data:
73
+ return []
74
+
75
+ target_columns = columns if columns else list(COLUMN_MAP.keys())
76
+ merged = {}
77
+
78
+ for row in all_data:
79
+ subj_col = find_column(row, COLUMN_MAP["subject_id"])
80
+ if subj_col is None:
81
+ continue
82
+ subj_id = row[subj_col].strip()
83
+ if not subj_id:
84
+ continue
85
+
86
+ if subj_id not in merged:
87
+ merged[subj_id] = {"subject_id": subj_id}
88
+
89
+ for target_col in target_columns:
90
+ if target_col == "subject_id":
91
+ continue
92
+ if target_col in merged[subj_id] and merged[subj_id][target_col]:
93
+ continue
94
+ candidates = COLUMN_MAP.get(target_col, [target_col])
95
+ src_col = find_column(row, candidates)
96
+ if src_col and row.get(src_col, "").strip():
97
+ merged[subj_id][target_col] = row[src_col].strip()
98
+
99
+ result = list(merged.values())
100
+ if imaging_ids:
101
+ imaging_set = set(imaging_ids)
102
+ result = [r for r in result if r["subject_id"] in imaging_set]
103
+ return result
104
+
105
+
106
+ def main() -> int:
107
+ parser = argparse.ArgumentParser(description="Extract HCP Development phenotype data.")
108
+ parser.add_argument("--phenotype-files", required=True, nargs="+")
109
+ parser.add_argument("--output", required=True)
110
+ parser.add_argument("--imaging-ids")
111
+ parser.add_argument("--columns")
112
+ args = parser.parse_args()
113
+
114
+ phenotype_files = [Path(f).resolve() for f in args.phenotype_files]
115
+ for f in phenotype_files:
116
+ if not f.exists():
117
+ print(f"File not found: {f}", file=sys.stderr)
118
+ return 1
119
+
120
+ imaging_ids = None
121
+ if args.imaging_ids:
122
+ id_file = Path(args.imaging_ids).resolve()
123
+ if id_file.exists():
124
+ imaging_ids = [l.strip() for l in id_file.read_text().splitlines() if l.strip()]
125
+
126
+ columns = None
127
+ if args.columns:
128
+ columns = [c.strip() for c in args.columns.split(",")]
129
+
130
+ merged = extract_phenotype(phenotype_files, imaging_ids, columns)
131
+ if not merged:
132
+ print("[ERROR] No phenotype data extracted.", file=sys.stderr)
133
+ return 1
134
+
135
+ output_path = Path(args.output).resolve()
136
+ output_path.parent.mkdir(parents=True, exist_ok=True)
137
+ fieldnames = list(merged[0].keys())
138
+ with open(output_path, "w", newline="", encoding="utf-8") as f:
139
+ writer = csv.DictWriter(f, fieldnames=fieldnames)
140
+ writer.writeheader()
141
+ writer.writerows(merged)
142
+
143
+ print(f"Phenotype: {len(merged)} subjects, {len(fieldnames)} columns -> {output_path}")
144
+ return 0
145
+
146
+
147
+ if __name__ == "__main__":
148
+ sys.exit(main())
@@ -0,0 +1,125 @@
1
+ #!/usr/bin/env python3
2
+ """Generate per-subject QC summaries for HCP Development processing.
3
+
4
+ Pediatric-specific: higher motion thresholds, age-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 load_freesurfer_qc(fs_dir: Path, subject_id: str) -> Dict[str, float]:
28
+ metrics = {"fs_eTIV": float("nan")}
29
+ stats_file = fs_dir / subject_id / "stats" / "aseg.stats"
30
+ if stats_file.exists():
31
+ try:
32
+ for line in stats_file.read_text().splitlines():
33
+ if "EstimatedTotalIntraCranialVol" in line:
34
+ parts = line.split(",")
35
+ if len(parts) > 4:
36
+ metrics["fs_eTIV"] = float(parts[4].strip())
37
+ except Exception:
38
+ pass
39
+ return metrics
40
+
41
+
42
+ def check_exclusion(metrics: Dict[str, float], fd_threshold: float = 0.4) -> List[str]:
43
+ """Check exclusion criteria. Higher threshold for pediatric data."""
44
+ reasons = []
45
+ if not (metrics["fd_mean"] != metrics["fd_mean"]):
46
+ if metrics["fd_mean"] > fd_threshold:
47
+ reasons.append(f"FD mean {metrics['fd_mean']:.3f} > {fd_threshold}")
48
+ return reasons
49
+
50
+
51
+ def main() -> int:
52
+ parser = argparse.ArgumentParser(description="Generate QC summaries for HCP-D.")
53
+ parser.add_argument("--fmriprep-dir")
54
+ parser.add_argument("--freesurfer-dir")
55
+ parser.add_argument("--output", required=True)
56
+ parser.add_argument("--exclude-output")
57
+ parser.add_argument("--fd-threshold", type=float, default=0.4,
58
+ help="FD threshold (default: 0.4 mm, higher for pediatric)")
59
+ args = parser.parse_args()
60
+
61
+ output_path = Path(args.output).resolve()
62
+ output_path.parent.mkdir(parents=True, exist_ok=True)
63
+
64
+ subjects = set()
65
+ if args.fmriprep_dir:
66
+ fmriprep_dir = Path(args.fmriprep_dir).resolve()
67
+ if fmriprep_dir.exists():
68
+ for d in fmriprep_dir.glob("sub-*"):
69
+ if d.is_dir():
70
+ subjects.add(d.name)
71
+
72
+ if args.freesurfer_dir:
73
+ fs_dir = Path(args.freesurfer_dir).resolve()
74
+ if fs_dir.exists():
75
+ for d in fs_dir.iterdir():
76
+ if d.is_dir() and not d.name.startswith("."):
77
+ subjects.add(f"sub-{d.name}" if not d.name.startswith("sub-") else d.name)
78
+
79
+ if not subjects:
80
+ print("[WARN] No subjects found.", file=sys.stderr)
81
+ return 1
82
+
83
+ results = []
84
+ excluded = []
85
+ for subj in sorted(subjects):
86
+ metrics = {"subject_id": subj}
87
+
88
+ if args.fmriprep_dir:
89
+ confounds_files = list(Path(args.fmriprep_dir).glob(f"{subj}/func/*_desc-confounds_timeseries.tsv"))
90
+ if confounds_files:
91
+ metrics.update(load_confounds(confounds_files[0]))
92
+
93
+ if args.freesurfer_dir:
94
+ fs_id = subj.replace("sub-", "")
95
+ metrics.update(load_freesurfer_qc(Path(args.freesurfer_dir), fs_id))
96
+
97
+ exclusion_reasons = check_exclusion(metrics, args.fd_threshold)
98
+ metrics["excluded"] = len(exclusion_reasons) > 0
99
+ metrics["exclusion_reasons"] = "; ".join(exclusion_reasons)
100
+
101
+ results.append(metrics)
102
+ if exclusion_reasons:
103
+ excluded.append({"subject_id": subj, "reasons": "; ".join(exclusion_reasons)})
104
+
105
+ if results:
106
+ fieldnames = list(results[0].keys())
107
+ with open(output_path, "w", newline="", encoding="utf-8") as f:
108
+ writer = csv.DictWriter(f, fieldnames=fieldnames)
109
+ writer.writeheader()
110
+ writer.writerows(results)
111
+ print(f"QC: {len(results)} subjects, {len(excluded)} excluded -> {output_path}")
112
+
113
+ if args.exclude_output and excluded:
114
+ exclude_path = Path(args.exclude_output).resolve()
115
+ exclude_path.parent.mkdir(parents=True, exist_ok=True)
116
+ with open(exclude_path, "w", newline="", encoding="utf-8") as f:
117
+ writer = csv.DictWriter(f, fieldnames=["subject_id", "reasons"])
118
+ writer.writeheader()
119
+ writer.writerows(excluded)
120
+
121
+ return 0
122
+
123
+
124
+ if __name__ == "__main__":
125
+ sys.exit(main())
@@ -0,0 +1,146 @@
1
+ #!/usr/bin/env python3
2
+ """Reorganize HCP Development native layout to BIDS structure."""
3
+ import argparse
4
+ import json
5
+ import shutil
6
+ import sys
7
+ from pathlib import Path
8
+
9
+ TASK_MAP = {
10
+ "tfMRI_MOTOR": {"label": "motor", "name": "Motor"},
11
+ "tfMRI_EMOTION": {"label": "emotion", "name": "Emotion"},
12
+ "tfMRI_GAMBLING": {"label": "gambling", "name": "Gambling"},
13
+ "tfMRI_LANGUAGE": {"label": "language", "name": "Language"},
14
+ "tfMRI_RELATIONAL": {"label": "relational", "name": "Relational"},
15
+ "tfMRI_SOCIAL": {"label": "social", "name": "Social"},
16
+ "tfMRI_WM": {"label": "wm", "name": "WorkingMemory"},
17
+ "rfMRI_REST": {"label": "rest", "name": "RestingState"},
18
+ }
19
+
20
+
21
+ def normalize_subject_id(hcp_id: str) -> str:
22
+ return f"sub-{hcp_id.strip()}"
23
+
24
+
25
+ def find_subjects(input_dir: Path, participant_list: list = None) -> list:
26
+ subjects = []
27
+ for d in sorted(input_dir.iterdir()):
28
+ if d.is_dir() and d.name.isdigit():
29
+ if participant_list is None or d.name in participant_list:
30
+ subjects.append(d)
31
+ return subjects
32
+
33
+
34
+ def reorganize_subject(subject_dir: Path, output_dir: Path, dry_run: bool = False) -> dict:
35
+ hcp_id = subject_dir.name
36
+ bids_id = normalize_subject_id(hcp_id)
37
+ sub_dir = output_dir / bids_id
38
+ report = {"subject": hcp_id, "files_created": 0, "warnings": []}
39
+
40
+ if not dry_run:
41
+ (sub_dir / "anat").mkdir(parents=True, exist_ok=True)
42
+ (sub_dir / "func").mkdir(parents=True, exist_ok=True)
43
+ (sub_dir / "dwi").mkdir(parents=True, exist_ok=True)
44
+
45
+ mninonlinear = subject_dir / "MNINonLinear"
46
+
47
+ for suffix in ["T1w.nii.gz", "T2w.nii.gz"]:
48
+ src = mninonlinear / suffix
49
+ if src.exists():
50
+ modality = suffix.split(".")[0].lower()
51
+ dst = sub_dir / "anat" / f"{bids_id}_{modality}.nii.gz"
52
+ if not dry_run:
53
+ shutil.copy2(src, dst)
54
+ report["files_created"] += 1
55
+ else:
56
+ report["warnings"].append(f"{suffix} not found")
57
+
58
+ for task_dir_name, task_info in TASK_MAP.items():
59
+ task_dir = subject_dir / task_dir_name
60
+ if not task_dir.exists():
61
+ task_dir = mninonlinear / "Results" / task_dir_name
62
+ if task_dir.exists():
63
+ bold_candidates = list(task_dir.glob("*_bold.nii.gz"))
64
+ if not bold_candidates:
65
+ bold_candidates = list(task_dir.glob("*.nii.gz"))
66
+ for bold_src in bold_candidates:
67
+ dst_name = f"{bids_id}_task-{task_info['label']}_run-01_bold.nii.gz"
68
+ dst = sub_dir / "func" / dst_name
69
+ if not dry_run:
70
+ shutil.copy2(bold_src, dst)
71
+ report["files_created"] += 1
72
+
73
+ dmri_dir = subject_dir / "T1w" / "Diffusion"
74
+ if dmri_dir.exists():
75
+ for suffix in ["data.nii.gz", "bval", "bvec"]:
76
+ src = dmri_dir / suffix
77
+ if src.exists():
78
+ bids_suffix = suffix.replace("data.nii.gz", "dwi.nii.gz")
79
+ dst = sub_dir / "dwi" / f"{bids_id}_{bids_suffix}"
80
+ if not dry_run:
81
+ shutil.copy2(src, dst)
82
+ report["files_created"] += 1
83
+
84
+ return report
85
+
86
+
87
+ def create_dataset_description(output_dir: Path, n_subjects: int):
88
+ desc = {
89
+ "Name": "HCP Development",
90
+ "BIDSVersion": "1.8.0",
91
+ "DatasetType": "raw",
92
+ "License": "HCP Data Use Terms",
93
+ "Authors": ["Human Connectome Project"],
94
+ "HowToAcknowledge": "Please cite the HCP Development project.",
95
+ "ReferencesAndLinks": ["https://www.humanconnectome.org/study/hcp-lifespan-development"],
96
+ "Subjects": n_subjects
97
+ }
98
+ with open(output_dir / "dataset_description.json", "w", encoding="utf-8") as f:
99
+ json.dump(desc, f, indent=2)
100
+
101
+
102
+ def main() -> int:
103
+ parser = argparse.ArgumentParser(description="Reorganize HCP-D native layout to BIDS.")
104
+ parser.add_argument("--input", required=True)
105
+ parser.add_argument("--output", required=True)
106
+ parser.add_argument("--participants")
107
+ parser.add_argument("--dry-run", action="store_true")
108
+ args = parser.parse_args()
109
+
110
+ input_dir = Path(args.input).resolve()
111
+ output_dir = Path(args.output).resolve()
112
+
113
+ if not input_dir.exists():
114
+ print(f"Input not found: {input_dir}", file=sys.stderr)
115
+ return 1
116
+
117
+ participant_list = None
118
+ if args.participants:
119
+ p_file = Path(args.participants).resolve()
120
+ if p_file.exists():
121
+ participant_list = [l.strip() for l in p_file.read_text().splitlines() if l.strip()]
122
+
123
+ subjects = find_subjects(input_dir, participant_list)
124
+ print(f"Found {len(subjects)} subjects")
125
+
126
+ if not args.dry_run:
127
+ output_dir.mkdir(parents=True, exist_ok=True)
128
+
129
+ total_files = 0
130
+ for i, sub_dir in enumerate(subjects):
131
+ report = reorganize_subject(sub_dir, output_dir, dry_run=args.dry_run)
132
+ total_files += report["files_created"]
133
+ if (i + 1) % 100 == 0 or (i + 1) == len(subjects):
134
+ print(f" Processed {i + 1}/{len(subjects)} subjects")
135
+
136
+ if not args.dry_run:
137
+ create_dataset_description(output_dir, len(subjects))
138
+
139
+ print(f"\nBIDS Staging: {len(subjects)} subjects, {total_files} files -> {output_dir}")
140
+ if args.dry_run:
141
+ print(" [DRY RUN]")
142
+ return 0
143
+
144
+
145
+ if __name__ == "__main__":
146
+ sys.exit(main())