@brainpilot/skills 0.0.6 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (285) hide show
  1. package/package.json +2 -2
  2. package/skills/01_Meta-Skills/academic-research-hub/SKILL.md +108 -0
  3. package/skills/01_Meta-Skills/academic-research-hub/scripts/requirements.txt +17 -0
  4. package/skills/01_Meta-Skills/academic-research-hub/scripts/research.py +781 -0
  5. package/skills/01_Meta-Skills/beautiful-log/SKILL.md +64 -0
  6. package/skills/01_Meta-Skills/beautiful-log/scripts/beautiful_log.py +274 -0
  7. package/skills/01_Meta-Skills/ethoclaw-daily-paper/SKILL.md +130 -0
  8. package/skills/01_Meta-Skills/ethoclaw-daily-paper/assets/config.template.yaml +54 -0
  9. package/skills/01_Meta-Skills/ethoclaw-daily-paper/assets/top5_digest_template.md +5 -0
  10. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/build_top5_digest.py +300 -0
  11. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/common.py +137 -0
  12. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/merge_results.py +106 -0
  13. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/run_pipeline.py +177 -0
  14. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/search_arxiv.py +162 -0
  15. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/search_pubmed.py +202 -0
  16. package/skills/01_Meta-Skills/ethoclaw-normalize-tabular/SKILL.md +173 -0
  17. package/skills/01_Meta-Skills/ethoclaw-normalize-tabular/scripts/normalize_data.py +874 -0
  18. package/skills/01_Meta-Skills/ethoclaw-pdf-research/SKILL.md +134 -0
  19. package/skills/01_Meta-Skills/ethoclaw-pdf-research/references/confirmation-prompts.md +31 -0
  20. package/skills/01_Meta-Skills/ethoclaw-pdf-research/references/output-patterns.md +45 -0
  21. package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/build_markdown_deliverables.py +41 -0
  22. package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/build_research_log.py +84 -0
  23. package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/build_summary_md.py +63 -0
  24. package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/extract_pdf_bundle.py +140 -0
  25. package/skills/01_Meta-Skills/experiment-controller/SKILL.md +140 -0
  26. package/skills/01_Meta-Skills/knowledge-graph-builder/SKILL.md +366 -0
  27. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/entity_resolution.py +120 -0
  28. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/extraction_prompt_template.txt +19 -0
  29. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/graph_query.py +106 -0
  30. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/hypothesis_cli_reference.py +42 -0
  31. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/new_data_source_template.py +116 -0
  32. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/requirements.txt +15 -0
  33. package/skills/01_Meta-Skills/method-design/SKILL.md +61 -0
  34. package/skills/01_Meta-Skills/multi-search-engine/SKILL.md +119 -0
  35. package/skills/01_Meta-Skills/research-idea/SKILL.md +65 -0
  36. package/skills/05_EEG_ERP/eeg-skill/SKILL.md +197 -0
  37. package/skills/05_EEG_ERP/meg-skill/SKILL.md +188 -0
  38. package/skills/05_EEG_ERP/meg-skill/scripts/time_frequency.py +223 -0
  39. package/skills/05_EEG_ERP/mne-eeg-tool/SKILL.md +165 -0
  40. package/skills/05_EEG_ERP/mne-eeg-tool/scripts/eeg_pipeline_reference.py +231 -0
  41. package/skills/05_EEG_ERP/seed-iv-skill/SKILL.md +184 -0
  42. package/skills/05_EEG_ERP/seed-iv-skill/scripts/classify_seed_iv.py +154 -0
  43. package/skills/05_EEG_ERP/seed-iv-skill/scripts/extract_seed_iv_features.py +190 -0
  44. package/skills/05_EEG_ERP/seed-iv-skill/scripts/validate_seed_iv.py +102 -0
  45. package/skills/05_EEG_ERP/seed-vig-skill/SKILL.md +182 -0
  46. package/skills/05_EEG_ERP/seed-vig-skill/scripts/classify_seed_vig.py +165 -0
  47. package/skills/05_EEG_ERP/seed-vig-skill/scripts/extract_seed_vig_features.py +185 -0
  48. package/skills/05_EEG_ERP/seed-vig-skill/scripts/validate_seed_vig.py +88 -0
  49. package/skills/06_fMRI_Neuroimaging/abcd-skill/SKILL.md +308 -0
  50. package/skills/06_fMRI_Neuroimaging/abcd-skill/scripts/abcd_qc_summary.py +449 -0
  51. package/skills/06_fMRI_Neuroimaging/abcd-skill/scripts/extract_abcd_phenotype.py +292 -0
  52. package/skills/06_fMRI_Neuroimaging/abcd-skill/scripts/reorganize_abcd.py +387 -0
  53. package/skills/06_fMRI_Neuroimaging/abide-skill/SKILL.md +302 -0
  54. package/skills/06_fMRI_Neuroimaging/abide-skill/scripts/abide_qc_summary.py +317 -0
  55. package/skills/06_fMRI_Neuroimaging/abide-skill/scripts/extract_abide_phenotype.py +267 -0
  56. package/skills/06_fMRI_Neuroimaging/abide-skill/scripts/reorganize_abide.py +387 -0
  57. package/skills/06_fMRI_Neuroimaging/adhd200-skill/SKILL.md +244 -0
  58. package/skills/06_fMRI_Neuroimaging/adhd200-skill/scripts/adhd200_qc_summary.py +98 -0
  59. package/skills/06_fMRI_Neuroimaging/adhd200-skill/scripts/extract_adhd200_phenotype.py +134 -0
  60. package/skills/06_fMRI_Neuroimaging/adhd200-skill/scripts/reorganize_adhd200.py +206 -0
  61. package/skills/06_fMRI_Neuroimaging/adni-skill/SKILL.md +358 -0
  62. package/skills/06_fMRI_Neuroimaging/adni-skill/scripts/generate_adni_task_files.py +1305 -0
  63. package/skills/06_fMRI_Neuroimaging/adni-skill/scripts/generate_vqa_from_tasks.py +766 -0
  64. package/skills/06_fMRI_Neuroimaging/adni-skill/scripts/reorganize_adni.py +491 -0
  65. package/skills/06_fMRI_Neuroimaging/aibl-skill/SKILL.md +295 -0
  66. package/skills/06_fMRI_Neuroimaging/aibl-skill/scripts/aibl_qc_summary.py +260 -0
  67. package/skills/06_fMRI_Neuroimaging/aibl-skill/scripts/extract_aibl_phenotype.py +365 -0
  68. package/skills/06_fMRI_Neuroimaging/aibl-skill/scripts/reorganize_aibl.py +394 -0
  69. package/skills/06_fMRI_Neuroimaging/aomic-skill/SKILL.md +292 -0
  70. package/skills/06_fMRI_Neuroimaging/aomic-skill/scripts/aomic_qc_summary.py +258 -0
  71. package/skills/06_fMRI_Neuroimaging/aomic-skill/scripts/extract_aomic_phenotype.py +284 -0
  72. package/skills/06_fMRI_Neuroimaging/aomic-skill/scripts/reorganize_aomic.py +322 -0
  73. package/skills/06_fMRI_Neuroimaging/asl-skill/SKILL.md +168 -0
  74. package/skills/06_fMRI_Neuroimaging/asl-skill/scripts/compute_cbf.py +224 -0
  75. package/skills/06_fMRI_Neuroimaging/bids-organizer/SKILL.md +241 -0
  76. package/skills/06_fMRI_Neuroimaging/bold5000-skill/SKILL.md +186 -0
  77. package/skills/06_fMRI_Neuroimaging/bold5000-skill/scripts/bold5000_qc_summary.py +96 -0
  78. package/skills/06_fMRI_Neuroimaging/bold5000-skill/scripts/extract_bold5000_stimulus.py +125 -0
  79. package/skills/06_fMRI_Neuroimaging/bold5000-skill/scripts/reorganize_bold5000.py +102 -0
  80. package/skills/06_fMRI_Neuroimaging/camcan-skill/SKILL.md +213 -0
  81. package/skills/06_fMRI_Neuroimaging/camcan-skill/scripts/camcan_qc_summary.py +131 -0
  82. package/skills/06_fMRI_Neuroimaging/camcan-skill/scripts/extract_camcan_phenotype.py +145 -0
  83. package/skills/06_fMRI_Neuroimaging/camcan-skill/scripts/validate_camcan.py +141 -0
  84. package/skills/06_fMRI_Neuroimaging/cobre-skill/SKILL.md +201 -0
  85. package/skills/06_fMRI_Neuroimaging/cobre-skill/scripts/cobre_qc_summary.py +95 -0
  86. package/skills/06_fMRI_Neuroimaging/cobre-skill/scripts/extract_cobre_phenotype.py +104 -0
  87. package/skills/06_fMRI_Neuroimaging/cobre-skill/scripts/reorganize_cobre.py +140 -0
  88. package/skills/06_fMRI_Neuroimaging/conn-tool/SKILL.md +180 -0
  89. package/skills/06_fMRI_Neuroimaging/dcm2nii/SKILL.md +189 -0
  90. package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/SKILL.md +183 -0
  91. package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/scripts/dmt_har_med_qc_summary.py +96 -0
  92. package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/scripts/extract_dmt_har_med_phenotype.py +121 -0
  93. package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/scripts/reorganize_dmt_har_med.py +125 -0
  94. package/skills/06_fMRI_Neuroimaging/dwi-skill/SKILL.md +359 -0
  95. package/skills/06_fMRI_Neuroimaging/fmri-skill/SKILL.md +371 -0
  96. package/skills/06_fMRI_Neuroimaging/fmriprep-tool/SKILL.md +228 -0
  97. package/skills/06_fMRI_Neuroimaging/freesurfer-tool/SKILL.md +286 -0
  98. package/skills/06_fMRI_Neuroimaging/freesurfer-tool/scripts/freesurfer_processor.py +145 -0
  99. package/skills/06_fMRI_Neuroimaging/fsl-tool/SKILL.md +208 -0
  100. package/skills/06_fMRI_Neuroimaging/hbn-skill/SKILL.md +271 -0
  101. package/skills/06_fMRI_Neuroimaging/hbn-skill/scripts/extract_hbn_phenotype.py +107 -0
  102. package/skills/06_fMRI_Neuroimaging/hbn-skill/scripts/hbn_qc_summary.py +96 -0
  103. package/skills/06_fMRI_Neuroimaging/hbn-skill/scripts/reorganize_hbn.py +150 -0
  104. package/skills/06_fMRI_Neuroimaging/hcpa-skill/SKILL.md +210 -0
  105. package/skills/06_fMRI_Neuroimaging/hcpa-skill/scripts/extract_hcpa_phenotype.py +146 -0
  106. package/skills/06_fMRI_Neuroimaging/hcpa-skill/scripts/hcpa_qc_summary.py +120 -0
  107. package/skills/06_fMRI_Neuroimaging/hcpa-skill/scripts/reorganize_hcpa.py +155 -0
  108. package/skills/06_fMRI_Neuroimaging/hcpd-skill/SKILL.md +210 -0
  109. package/skills/06_fMRI_Neuroimaging/hcpd-skill/scripts/extract_hcpd_phenotype.py +148 -0
  110. package/skills/06_fMRI_Neuroimaging/hcpd-skill/scripts/hcpd_qc_summary.py +125 -0
  111. package/skills/06_fMRI_Neuroimaging/hcpd-skill/scripts/reorganize_hcpd.py +146 -0
  112. package/skills/06_fMRI_Neuroimaging/hcpep-skill/SKILL.md +215 -0
  113. package/skills/06_fMRI_Neuroimaging/hcpep-skill/scripts/extract_hcpep_phenotype.py +157 -0
  114. package/skills/06_fMRI_Neuroimaging/hcpep-skill/scripts/hcpep_qc_summary.py +143 -0
  115. package/skills/06_fMRI_Neuroimaging/hcpep-skill/scripts/reorganize_hcpep.py +146 -0
  116. package/skills/06_fMRI_Neuroimaging/hcppipeline-tool/SKILL.md +217 -0
  117. package/skills/06_fMRI_Neuroimaging/hcpya-skill/SKILL.md +214 -0
  118. package/skills/06_fMRI_Neuroimaging/hcpya-skill/scripts/extract_hcpya_phenotype.py +190 -0
  119. package/skills/06_fMRI_Neuroimaging/hcpya-skill/scripts/hcpya_qc_summary.py +152 -0
  120. package/skills/06_fMRI_Neuroimaging/hcpya-skill/scripts/reorganize_hcpya.py +203 -0
  121. package/skills/06_fMRI_Neuroimaging/ixi-skill/SKILL.md +198 -0
  122. package/skills/06_fMRI_Neuroimaging/ixi-skill/scripts/ixi_qc_summary.py +137 -0
  123. package/skills/06_fMRI_Neuroimaging/ixi-skill/scripts/reorganize_ixi.py +190 -0
  124. package/skills/06_fMRI_Neuroimaging/mnd-skill/SKILL.md +191 -0
  125. package/skills/06_fMRI_Neuroimaging/mnd-skill/scripts/extract_mnd_phenotype.py +143 -0
  126. package/skills/06_fMRI_Neuroimaging/mnd-skill/scripts/mnd_qc_summary.py +120 -0
  127. package/skills/06_fMRI_Neuroimaging/mnd-skill/scripts/validate_mnd.py +107 -0
  128. package/skills/06_fMRI_Neuroimaging/mschallenge-skill/SKILL.md +203 -0
  129. package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/analyze_lesions.py +119 -0
  130. package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/longitudinal_lesion.py +148 -0
  131. package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/mschallenge_qc_summary.py +132 -0
  132. package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/validate_mschallenge.py +116 -0
  133. package/skills/06_fMRI_Neuroimaging/nibabel-skill/SKILL.md +184 -0
  134. package/skills/06_fMRI_Neuroimaging/nibabel-skill/scripts/atlas_coordinate_reference.py +61 -0
  135. package/skills/06_fMRI_Neuroimaging/nibabel-skill/scripts/freesurfer_io_reference.py +34 -0
  136. package/skills/06_fMRI_Neuroimaging/nibabel-skill/scripts/nifti_inspection_reference.py +35 -0
  137. package/skills/06_fMRI_Neuroimaging/nifd-skill/SKILL.md +205 -0
  138. package/skills/06_fMRI_Neuroimaging/nifd-skill/scripts/extract_nifd_phenotype.py +132 -0
  139. package/skills/06_fMRI_Neuroimaging/nifd-skill/scripts/nifd_qc_summary.py +111 -0
  140. package/skills/06_fMRI_Neuroimaging/nifd-skill/scripts/validate_nifd.py +111 -0
  141. package/skills/06_fMRI_Neuroimaging/nii2dcm/SKILL.md +143 -0
  142. package/skills/06_fMRI_Neuroimaging/nilearn-tool/SKILL.md +266 -0
  143. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/connectome_reference.py +65 -0
  144. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/denoise_timeseries_reference.py +58 -0
  145. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/hierarchical_parcellation_reference.py +53 -0
  146. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/kmeans_parcellation_reference.py +53 -0
  147. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/preprocess_bold_reference.py +76 -0
  148. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/rest_dictlearning_reference.py +56 -0
  149. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/rest_ica_reference.py +59 -0
  150. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/second_level_glm_reference.py +58 -0
  151. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/spacenet_classifier_reference.py +59 -0
  152. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/svm_classifier_reference.py +60 -0
  153. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/task_glm_reference.py +63 -0
  154. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/zalff_summary_reference.py +109 -0
  155. package/skills/06_fMRI_Neuroimaging/nsd-skill/SKILL.md +210 -0
  156. package/skills/06_fMRI_Neuroimaging/nsd-skill/scripts/extract_nsd_stimulus.py +171 -0
  157. package/skills/06_fMRI_Neuroimaging/nsd-skill/scripts/nsd_qc_summary.py +142 -0
  158. package/skills/06_fMRI_Neuroimaging/nsd-skill/scripts/validate_nsd.py +142 -0
  159. package/skills/06_fMRI_Neuroimaging/oasis-skill/SKILL.md +205 -0
  160. package/skills/06_fMRI_Neuroimaging/oasis-skill/scripts/extract_oasis_phenotype.py +126 -0
  161. package/skills/06_fMRI_Neuroimaging/oasis-skill/scripts/oasis_qc_summary.py +115 -0
  162. package/skills/06_fMRI_Neuroimaging/oasis-skill/scripts/validate_oasis.py +119 -0
  163. package/skills/06_fMRI_Neuroimaging/pet-skill/SKILL.md +173 -0
  164. package/skills/06_fMRI_Neuroimaging/pet-skill/scripts/compute_suvr.py +202 -0
  165. package/skills/06_fMRI_Neuroimaging/pnc-skill/SKILL.md +206 -0
  166. package/skills/06_fMRI_Neuroimaging/pnc-skill/scripts/extract_pnc_phenotype.py +136 -0
  167. package/skills/06_fMRI_Neuroimaging/pnc-skill/scripts/pnc_qc_summary.py +116 -0
  168. package/skills/06_fMRI_Neuroimaging/pnc-skill/scripts/validate_pnc.py +120 -0
  169. package/skills/06_fMRI_Neuroimaging/ppmi-skill/SKILL.md +209 -0
  170. package/skills/06_fMRI_Neuroimaging/ppmi-skill/scripts/extract_ppmi_phenotype.py +138 -0
  171. package/skills/06_fMRI_Neuroimaging/ppmi-skill/scripts/ppmi_qc_summary.py +111 -0
  172. package/skills/06_fMRI_Neuroimaging/ppmi-skill/scripts/validate_ppmi.py +117 -0
  173. package/skills/06_fMRI_Neuroimaging/qsiprep-tool/SKILL.md +320 -0
  174. package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/SKILL.md +215 -0
  175. package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/extract_rest_mdd_phenotype.py +132 -0
  176. package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/harmonize_sites.py +152 -0
  177. package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/rest_mdd_qc_summary.py +124 -0
  178. package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/validate_rest_mdd.py +103 -0
  179. package/skills/06_fMRI_Neuroimaging/smri-skill/SKILL.md +302 -0
  180. package/skills/06_fMRI_Neuroimaging/tcp-skill/SKILL.md +204 -0
  181. package/skills/06_fMRI_Neuroimaging/tcp-skill/scripts/extract_tcp_phenotype.py +139 -0
  182. package/skills/06_fMRI_Neuroimaging/tcp-skill/scripts/tcp_qc_summary.py +111 -0
  183. package/skills/06_fMRI_Neuroimaging/tcp-skill/scripts/validate_tcp.py +99 -0
  184. package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/SKILL.md +217 -0
  185. package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/scripts/extract_ucla_cnp_phenotype.py +145 -0
  186. package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/scripts/ucla_cnp_qc_summary.py +111 -0
  187. package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/scripts/validate_ucla_cnp.py +113 -0
  188. package/skills/06_fMRI_Neuroimaging/ukb-skill/SKILL.md +310 -0
  189. package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/build_ukb_survival.py +210 -0
  190. package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/extract_ukb_cases.py +308 -0
  191. package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/extract_ukb_phenotype.py +232 -0
  192. package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/ukb_qc_summary.py +158 -0
  193. package/skills/06_fMRI_Neuroimaging/wmh-segmentation/SKILL.md +133 -0
  194. package/skills/07_Computational_Modeling/detrending/SKILL.md +118 -0
  195. package/skills/07_Computational_Modeling/dictlearning/SKILL.md +122 -0
  196. package/skills/07_Computational_Modeling/filtering/SKILL.md +121 -0
  197. package/skills/07_Computational_Modeling/glm/SKILL.md +153 -0
  198. package/skills/07_Computational_Modeling/hierarchical/SKILL.md +121 -0
  199. package/skills/07_Computational_Modeling/ica/SKILL.md +122 -0
  200. package/skills/07_Computational_Modeling/kmeans/SKILL.md +119 -0
  201. package/skills/07_Computational_Modeling/run_models/SKILL.md +427 -0
  202. package/skills/07_Computational_Modeling/spacenet/SKILL.md +122 -0
  203. package/skills/07_Computational_Modeling/svm/SKILL.md +120 -0
  204. package/skills/08_Computational_Neuroscience/brain_gnn/SKILL.md +183 -0
  205. package/skills/08_Computational_Neuroscience/dipy-tool/SKILL.md +239 -0
  206. package/skills/08_Computational_Neuroscience/dipy-tool/scripts/dti_metrics_reference.py +70 -0
  207. package/skills/08_Computational_Neuroscience/dipy-tool/scripts/load_and_mask_reference.py +76 -0
  208. package/skills/08_Computational_Neuroscience/dipy-tool/scripts/roi_stats_reference.py +59 -0
  209. package/skills/08_Computational_Neuroscience/fm_app/SKILL.md +195 -0
  210. package/skills/08_Computational_Neuroscience/neurostorm/SKILL.md +151 -0
  211. package/skills/13_Visualization/brain-visualization/SKILL.md +191 -0
  212. package/skills/13_Visualization/brain-visualization/scripts/connectome_reference.py +108 -0
  213. package/skills/13_Visualization/brain-visualization/scripts/freesurfer_ply_reference.py +54 -0
  214. package/skills/13_Visualization/brain-visualization/scripts/zalff_summary_reference.py +116 -0
  215. package/skills/13_Visualization/ethoclaw-paper-figure-layout/SKILL.md +78 -0
  216. package/skills/13_Visualization/ethoclaw-paper-figure-layout/assets/naturecomm_figures.tex +74 -0
  217. package/skills/13_Visualization/ethoclaw-paper-figure-layout/scripts/layout_results_foldered.py +579 -0
  218. package/skills/14_Writing/overleaf-skill/SKILL.md +184 -0
  219. package/skills/14_Writing/overleaf-skill/scripts/install.sh +30 -0
  220. package/skills/14_Writing/paper-writing/SKILL.md +146 -0
  221. package/skills/14_Writing/paper-writing/scripts/data_statement_templates.py +164 -0
  222. package/skills/14_Writing/paper-writing/scripts/figure_templates.py +315 -0
  223. package/skills/14_Writing/paper-writing/scripts/nature_figure_style.py +214 -0
  224. package/skills/14_Writing/paper-writing/scripts/section_phrasebank.py +246 -0
  225. package/skills/16_Animal_Behavior/deeplabcut/SKILL.md +154 -0
  226. package/skills/16_Animal_Behavior/deeplabcut/references/3d-pose.md +89 -0
  227. package/skills/16_Animal_Behavior/deeplabcut/references/maDLC.md +123 -0
  228. package/skills/16_Animal_Behavior/deeplabcut/references/modelzoo.md +98 -0
  229. package/skills/16_Animal_Behavior/deeplabcut/references/standard-pipeline.md +165 -0
  230. package/skills/16_Animal_Behavior/deeplabcut/references/utilities.md +146 -0
  231. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/SKILL.md +274 -0
  232. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/report_template_en.html +112 -0
  233. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/report_template_en.md +21 -0
  234. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/cluster-section.md +5 -0
  235. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/heatmap-section.md +5 -0
  236. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/integrated-interpretation.md +3 -0
  237. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/overview.md +3 -0
  238. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/project-summary.md +3 -0
  239. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/radar-section.md +5 -0
  240. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/raw-trajectory.md +3 -0
  241. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/sample-check.md +3 -0
  242. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/single-subject-section.md +3 -0
  243. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/stats-section.md +5 -0
  244. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/epm.md +52 -0
  245. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/fst.md +37 -0
  246. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/nor.md +39 -0
  247. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/oft.md +43 -0
  248. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/tcst.md +45 -0
  249. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/tst.md +36 -0
  250. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/input-types.md +59 -0
  251. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/interpretation-guardrails.md +45 -0
  252. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/metadata-schema.md +57 -0
  253. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/report-sections.md +86 -0
  254. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/section-selection-rules.md +169 -0
  255. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/scripts/build_report_manifest.py +27 -0
  256. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/scripts/render_report.py +34 -0
  257. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/scripts/report_utils.py +1121 -0
  258. package/skills/16_Animal_Behavior/ethoclaw-animal-grounding/SKILL.md +390 -0
  259. package/skills/16_Animal_Behavior/ethoclaw-animal-grounding/reference_code.py +98 -0
  260. package/skills/16_Animal_Behavior/ethoclaw-animal-pose-estimation/SKILL.md +336 -0
  261. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/README.md +21 -0
  262. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/SKILL.md +41 -0
  263. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/batch_kinematic_generator.py +663 -0
  264. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/config.json +19 -0
  265. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/generate_kinematic_parameter.py +401 -0
  266. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/kinematic_generator.py +265 -0
  267. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/SKILL.md +72 -0
  268. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/references/config.example.toml +56 -0
  269. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/scripts/cluster_all_params.py +232 -0
  270. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/scripts/cluster_all_params_from_config.py +236 -0
  271. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-radar-generate/SKILL.md +68 -0
  272. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-radar-generate/references/notes.md +5 -0
  273. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-radar-generate/scripts/plot_h5_radar.py +513 -0
  274. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/SKILL.md +52 -0
  275. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/config.toml +81 -0
  276. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/references/stats-rule.md +18 -0
  277. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/scripts/h5_inspect.py +79 -0
  278. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/scripts/h5_violin_batch.py +624 -0
  279. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/scripts/h5_violin_stats.py +438 -0
  280. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/SKILL.md +280 -0
  281. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/core_scripts/heatmap_trajectory.py +790 -0
  282. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/core_scripts/heatmap_velocity.py +855 -0
  283. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/reference_data/reference_2d.csv +101 -0
  284. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/reference_data/reference_2d.h5 +0 -0
  285. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/reference_data/reference_data_readme.md +126 -0
@@ -0,0 +1,215 @@
1
+ ---
2
+ name: hcpep-skill
3
+ description: "Use this skill whenever the user wants an end-to-end workflow for the HCP Early Psychosis (HCP-EP) dataset, including dataset download, BIDS organization, and multimodal processing of sMRI, fMRI, and dMRI. Triggers include: 'HCP Early Psychosis', 'HCP-EP', 'process HCP Early Psychosis data', 'HCP EP sMRI fMRI', or any request to run the HCP-EP 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-EP Skill (Dataset-Orchestration Layer)
17
+
18
+ ## Overview
19
+
20
+ `hcpep-skill` is the NeuroClaw orchestration skill for the **HCP Early Psychosis (HCP-EP)** 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-EP 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 (`hcpep_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-EP from ConnectomeDB | `claw-shell` | Raw HCP-EP files |
44
+ | BIDS staging | Reorganize HCP-EP native layout to BIDS | `scripts/reorganize_hcpep.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 | Clinical, diagnostic, cognitive data | `scripts/extract_hcpep_phenotype.py` | Merged phenotype CSV |
49
+ | QC summary | Per-subject quality control | `scripts/hcpep_qc_summary.py` | QC summary + exclusion list |
50
+
51
+ ---
52
+
53
+ ## Download Stage (Mandatory First Step)
54
+
55
+ ### Source
56
+ HCP-EP data is distributed through **ConnectomeDB**:
57
+ - Website: https://db.humanconnectome.org/
58
+ - Requires ConnectomeDB account and data use agreement
59
+ - Part of the HCP Clinical initiative
60
+
61
+ ### Dataset Characteristics
62
+ - **Cohort**: ~250 participants (early psychosis and healthy controls)
63
+ - **Modalities**: T1w, T2w, dMRI, rs-fMRI, task-fMRI
64
+ - **Focus**: Early psychosis (schizophrenia spectrum, bipolar disorder), neural circuit disruptions
65
+ - **Unique feature**: Clinical cohort with matched healthy controls for case-control comparisons
66
+
67
+ ### Diagnostic Groups
68
+ - Early psychosis patients (schizophrenia spectrum, bipolar with psychotic features)
69
+ - Healthy controls (age-, sex-, and education-matched)
70
+ - All patients are within 5 years of psychosis onset
71
+
72
+ ### Download Inputs to Confirm in Plan
73
+ - ConnectomeDB credentials/token
74
+ - Target modalities (all, structural, functional, diffusion)
75
+ - Subject list scope (full or custom subset)
76
+ - Destination directory with sufficient disk space
77
+
78
+ ---
79
+
80
+ ## HCP-EP Task Paradigms
81
+
82
+ | Task | Description | Duration |
83
+ |---|---|---|
84
+ | MOTOR | Finger tapping, toe movement, tongue movement | ~3 min |
85
+ | EMOTION | Faces and shapes matching | ~2 min |
86
+ | GAMBLING | Card guessing with reward/loss | ~3 min |
87
+ | LANGUAGE | Story comprehension and math | ~4 min |
88
+ | RELATIONAL | Relational reasoning matching | ~3 min |
89
+ | SOCIAL | Social cognition (mentalizing) movie clips | ~3 min |
90
+ | WM | Working memory (faces, places, tools, body parts) | ~5 min |
91
+ | REST | Resting-state (eyes open) | ~15 min × 4 runs |
92
+
93
+ ---
94
+
95
+ ## BIDS Preparation
96
+
97
+ ### Script: `scripts/reorganize_hcpep.py`
98
+
99
+ Converts HCP-EP native directory structure to BIDS-compliant layout.
100
+
101
+ ```bash
102
+ python skills/hcpep-skill/scripts/reorganize_hcpep.py \
103
+ --input /path/to/HCPEP/raw \
104
+ --output /path/to/HCPEP/bids \
105
+ --participants /path/to/subject_list.txt
106
+ ```
107
+
108
+ Features:
109
+ - Subject ID normalization: HCP format to BIDS `sub-` labels
110
+ - Diagnostic group labeling (patient vs. control)
111
+ - Modality routing: T1w, T2w, dMRI, rs-fMRI, task-fMRI
112
+ - Sidecar JSON generation from HCP metadata
113
+ - `dataset_description.json` and `participants.tsv` generation
114
+ - Dry-run mode: `--dry-run` to preview without copying
115
+
116
+ ---
117
+
118
+ ## Core Workflow (Never Bypassed)
119
+
120
+ 1. Identify user target: full HCP-EP processing, imaging subset, phenotype extraction, or BIDS staging only.
121
+ 2. Generate a numbered plan with tools, outputs, runtime, storage, and risks.
122
+ 3. Wait for explicit confirmation (`YES` / `execute` / `proceed`).
123
+ 4. On confirmation, run download stage first (if needed).
124
+ 5. After download success, run BIDS preparation using `scripts/reorganize_hcpep.py`.
125
+ 6. Delegate to `smri-skill` for structural MRI processing.
126
+ 7. Delegate to `fmri-skill` for functional MRI processing.
127
+ 8. Delegate to `dwi-skill` for diffusion MRI processing.
128
+ 9. If phenotype extraction is requested, run `scripts/extract_hcpep_phenotype.py`.
129
+ 10. If QC summary is requested, run `scripts/hcpep_qc_summary.py`.
130
+ 11. Save outputs into `hcpep_output/`.
131
+
132
+ ---
133
+
134
+ ## Modality Processing Delegation
135
+
136
+ | Modality | Delegated skill | Typical tasks | Main outputs |
137
+ |---|---|---|---|
138
+ | sMRI (T1w/T2w) | `smri-skill` | brain extraction, tissue segmentation, cortical reconstruction, ROI morphometry | `smri_output/` derivatives |
139
+ | fMRI (rs-fMRI/task-fMRI) | `fmri-skill` | preprocessing, denoising, ROI time series, connectivity, task GLM | `fmri_output/` derivatives |
140
+ | dMRI (DWI) | `dwi-skill` | eddy correction, tensor metrics, tractography, connectome | `dwi_output/` metrics |
141
+
142
+ ---
143
+
144
+ ## Standard Output Layout
145
+
146
+ ```
147
+ hcpep_output/
148
+ ├── raw/ # Downloaded original HCP-EP files
149
+ ├── bids/ # BIDS-staged data
150
+ ├── smri/ # Structural MRI derivatives
151
+ ├── fmri/ # Functional MRI derivatives
152
+ ├── dwi/ # Diffusion MRI derivatives
153
+ ├── phenotype/ # Merged phenotype tables (diagnosis, clinical, cognitive)
154
+ ├── qc/ # QC summaries and exclusion lists
155
+ └── logs/ # Download + orchestration logs
156
+ ```
157
+
158
+ ---
159
+
160
+ ## Benchmark Adapter Guidance
161
+
162
+ For benchmark-style prompts, do not force the full orchestration when the task only asks for local HCP-EP data staging.
163
+
164
+ - If the task starts from raw HCP-EP data already present on disk and only asks for BIDS-style staging:
165
+ - Skip the mandatory download stage
166
+ - Default to the narrow path `local raw HCP-EP discovery -> BIDS-style staging -> minimal metadata -> validation/report`
167
+ - In benchmark mode, do not require explicit confirmation before presenting the direct staging solution.
168
+
169
+ ---
170
+
171
+ ## Safety and Execution Policy
172
+ - No execution before explicit plan confirmation.
173
+ - All execution must be routed via `claw-shell`.
174
+ - Missing dependencies must be resolved by `dependency-planner` before running.
175
+
176
+ ---
177
+
178
+ ## Important Notes and Limitations
179
+ - HCP-EP is a clinical cohort; patient data requires careful handling and de-identification.
180
+ - Early psychosis patients may have higher motion artifacts; QC thresholds may need adjustment.
181
+ - Case-control matching should be verified before group comparisons.
182
+ - For HCP-native preprocessing, optionally delegate to `hcppipeline-tool`.
183
+ - `hcpep-skill` is orchestration-only; detailed preprocessing logic remains in modality skills.
184
+
185
+ ---
186
+
187
+ ## When to Call This Skill
188
+ - User asks for end-to-end HCP Early Psychosis workflow.
189
+ - User asks to download HCP-EP and run sMRI/fMRI/DTI processing.
190
+ - User needs BIDS staging for HCP-EP data.
191
+ - User asks to extract HCP-EP phenotype data (diagnosis, clinical, cognitive).
192
+
193
+ ---
194
+
195
+ ## Complementary / Related Skills
196
+ - `smri-skill` → structural MRI preprocessing
197
+ - `fmri-skill` → functional MRI preprocessing and analysis
198
+ - `dwi-skill` → diffusion MRI preprocessing and analysis
199
+ - `hcppipeline-tool` → HCP-native minimal preprocessing pipelines
200
+ - `bids-organizer` → BIDS validation and organization
201
+ - `brain-visualization` → visualization of derivatives
202
+ - `dependency-planner` → dependency resolution
203
+ - `conda-env-manager` → environment management
204
+ - `claw-shell` → command execution
205
+
206
+ ---
207
+
208
+ ## Reference
209
+ - HCP Early Psychosis: https://www.humanconnectome.org/study/hcp-early-psychosis
210
+ - ConnectomeDB: https://db.humanconnectome.org/
211
+ - Heckers et al. (2024): The HCP Early Psychosis project
212
+
213
+ Created At: 2026-05-06 13:02 HKT
214
+ Last Updated At: 2026-05-06 13:02 HKT
215
+ Author: chengwang96
@@ -0,0 +1,157 @@
1
+ #!/usr/bin/env python3
2
+ """Extract and merge HCP Early Psychosis phenotype data.
3
+
4
+ Focuses on clinical measures: diagnosis, symptom severity, medication,
5
+ cognitive assessment, and functional outcomes for early psychosis research.
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
+ # Clinical diagnosis
21
+ "diagnosis": ["Diagnosis", "Group"],
22
+ "diagnosis_detail": ["Diagnosis_Detail"],
23
+ "patient_control": ["Patient_Control"],
24
+ # Symptom measures
25
+ "panss_positive": ["PANSS_Positive"],
26
+ "panss_negative": ["PANSS_Negative"],
27
+ "panss_general": ["PANSS_General"],
28
+ "panss_total": ["PANSS_Total"],
29
+ "bprs_total": ["BPRS_Total"],
30
+ "bprs_positive": ["BPRS_Positive"],
31
+ "bprs_negative": ["BPRS_Negative"],
32
+ "gaf_score": ["GAF_Score"],
33
+ "saps_total": ["SAPS_Total"],
34
+ "sans_total": ["SANS_Total"],
35
+ # Medication
36
+ "medication_status": ["Medication", "Med_Status"],
37
+ "chlorpromazine_eq": ["CPZ_Equivalent", "Chlorpromazine_Eq"],
38
+ # Functional measures
39
+ "functioning_gaf": ["GAF_Functioning"],
40
+ "role_functioning": ["Role_Functioning"],
41
+ "social_functioning": ["Social_Functioning"],
42
+ # Cognitive measures
43
+ "matrics_overall": ["MCCB_Overall", "MATRICS_Overall"],
44
+ "matrics_speed": ["MCCB_Speed", "Processing_Speed"],
45
+ "matrics_attention": ["MCCB_Attention", "Attention_Vigilance"],
46
+ "matrics_working_mem": ["MCCB_Working_Memory"],
47
+ "matrics_verbal": ["MCCB_Verbal_Learning"],
48
+ "matrics_visual": ["MCCB_Visual_Learning"],
49
+ "matrics_reasoning": ["MCCB_Reasoning"],
50
+ "matrics_social_cog": ["MCCB_Social_Cognition"],
51
+ # Duration of illness
52
+ "duration_illness": ["Duration_Illness", "DUI"],
53
+ "duration_untreated": ["Duration_Untreated", "DUP"],
54
+ "age_onset": ["Age_Onset"],
55
+ }
56
+
57
+
58
+ def load_csv(path: Path) -> List[Dict[str, str]]:
59
+ delimiter = "\t" if path.suffix == ".tsv" else ","
60
+ with open(path, "r", encoding="utf-8") as f:
61
+ reader = csv.DictReader(f, delimiter=delimiter)
62
+ return list(reader)
63
+
64
+
65
+ def find_column(row: Dict[str, str], candidates: List[str]) -> Optional[str]:
66
+ for col in candidates:
67
+ if col in row:
68
+ return col
69
+ return None
70
+
71
+
72
+ def extract_phenotype(
73
+ phenotype_files: List[Path],
74
+ imaging_ids: Optional[List[str]] = None,
75
+ columns: Optional[List[str]] = None,
76
+ ) -> List[Dict[str, str]]:
77
+ all_data = []
78
+ for fpath in phenotype_files:
79
+ all_data.extend(load_csv(fpath))
80
+
81
+ if not all_data:
82
+ return []
83
+
84
+ target_columns = columns if columns else list(COLUMN_MAP.keys())
85
+ merged = {}
86
+
87
+ for row in all_data:
88
+ subj_col = find_column(row, COLUMN_MAP["subject_id"])
89
+ if subj_col is None:
90
+ continue
91
+ subj_id = row[subj_col].strip()
92
+ if not subj_id:
93
+ continue
94
+
95
+ if subj_id not in merged:
96
+ merged[subj_id] = {"subject_id": subj_id}
97
+
98
+ for target_col in target_columns:
99
+ if target_col == "subject_id":
100
+ continue
101
+ if target_col in merged[subj_id] and merged[subj_id][target_col]:
102
+ continue
103
+ candidates = COLUMN_MAP.get(target_col, [target_col])
104
+ src_col = find_column(row, candidates)
105
+ if src_col and row.get(src_col, "").strip():
106
+ merged[subj_id][target_col] = row[src_col].strip()
107
+
108
+ result = list(merged.values())
109
+ if imaging_ids:
110
+ imaging_set = set(imaging_ids)
111
+ result = [r for r in result if r["subject_id"] in imaging_set]
112
+ return result
113
+
114
+
115
+ def main() -> int:
116
+ parser = argparse.ArgumentParser(description="Extract HCP Early Psychosis phenotype data.")
117
+ parser.add_argument("--phenotype-files", required=True, nargs="+")
118
+ parser.add_argument("--output", required=True)
119
+ parser.add_argument("--imaging-ids")
120
+ parser.add_argument("--columns")
121
+ args = parser.parse_args()
122
+
123
+ phenotype_files = [Path(f).resolve() for f in args.phenotype_files]
124
+ for f in phenotype_files:
125
+ if not f.exists():
126
+ print(f"File not found: {f}", file=sys.stderr)
127
+ return 1
128
+
129
+ imaging_ids = None
130
+ if args.imaging_ids:
131
+ id_file = Path(args.imaging_ids).resolve()
132
+ if id_file.exists():
133
+ imaging_ids = [l.strip() for l in id_file.read_text().splitlines() if l.strip()]
134
+
135
+ columns = None
136
+ if args.columns:
137
+ columns = [c.strip() for c in args.columns.split(",")]
138
+
139
+ merged = extract_phenotype(phenotype_files, imaging_ids, columns)
140
+ if not merged:
141
+ print("[ERROR] No phenotype data extracted.", file=sys.stderr)
142
+ return 1
143
+
144
+ output_path = Path(args.output).resolve()
145
+ output_path.parent.mkdir(parents=True, exist_ok=True)
146
+ fieldnames = list(merged[0].keys())
147
+ with open(output_path, "w", newline="", encoding="utf-8") as f:
148
+ writer = csv.DictWriter(f, fieldnames=fieldnames)
149
+ writer.writeheader()
150
+ writer.writerows(merged)
151
+
152
+ print(f"Phenotype: {len(merged)} subjects, {len(fieldnames)} columns -> {output_path}")
153
+ return 0
154
+
155
+
156
+ if __name__ == "__main__":
157
+ sys.exit(main())
@@ -0,0 +1,143 @@
1
+ #!/usr/bin/env python3
2
+ """Generate per-subject QC summaries for HCP Early Psychosis processing.
3
+
4
+ Clinical-specific: adjusted thresholds for patient data, diagnostic group tracking.
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.3) -> List[str]:
43
+ """Check exclusion criteria. Same threshold for patients and controls."""
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-EP.")
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.3)
58
+ parser.add_argument("--diagnosis-file", help="CSV with subject diagnosis info")
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
+ # Load diagnosis info if available
65
+ diagnosis_map = {}
66
+ if args.diagnosis_file:
67
+ diag_path = Path(args.diagnosis_file).resolve()
68
+ if diag_path.exists():
69
+ import csv as csv_mod
70
+ with open(diag_path, "r", encoding="utf-8") as f:
71
+ reader = csv_mod.DictReader(f)
72
+ for row in reader:
73
+ subj = row.get("subject_id") or row.get("Subject", "")
74
+ diag = row.get("diagnosis") or row.get("Diagnosis") or row.get("Group", "")
75
+ if subj and diag:
76
+ diagnosis_map[subj] = diag
77
+
78
+ subjects = set()
79
+ if args.fmriprep_dir:
80
+ fmriprep_dir = Path(args.fmriprep_dir).resolve()
81
+ if fmriprep_dir.exists():
82
+ for d in fmriprep_dir.glob("sub-*"):
83
+ if d.is_dir():
84
+ subjects.add(d.name)
85
+
86
+ if args.freesurfer_dir:
87
+ fs_dir = Path(args.freesurfer_dir).resolve()
88
+ if fs_dir.exists():
89
+ for d in fs_dir.iterdir():
90
+ if d.is_dir() and not d.name.startswith("."):
91
+ subjects.add(f"sub-{d.name}" if not d.name.startswith("sub-") else d.name)
92
+
93
+ if not subjects:
94
+ print("[WARN] No subjects found.", file=sys.stderr)
95
+ return 1
96
+
97
+ results = []
98
+ excluded = []
99
+ for subj in sorted(subjects):
100
+ metrics = {"subject_id": subj}
101
+
102
+ # Add diagnosis if available
103
+ if diagnosis_map:
104
+ metrics["diagnosis"] = diagnosis_map.get(subj, "unknown")
105
+
106
+ if args.fmriprep_dir:
107
+ confounds_files = list(Path(args.fmriprep_dir).glob(f"{subj}/func/*_desc-confounds_timeseries.tsv"))
108
+ if confounds_files:
109
+ metrics.update(load_confounds(confounds_files[0]))
110
+
111
+ if args.freesurfer_dir:
112
+ fs_id = subj.replace("sub-", "")
113
+ metrics.update(load_freesurfer_qc(Path(args.freesurfer_dir), fs_id))
114
+
115
+ exclusion_reasons = check_exclusion(metrics, args.fd_threshold)
116
+ metrics["excluded"] = len(exclusion_reasons) > 0
117
+ metrics["exclusion_reasons"] = "; ".join(exclusion_reasons)
118
+
119
+ results.append(metrics)
120
+ if exclusion_reasons:
121
+ excluded.append({"subject_id": subj, "reasons": "; ".join(exclusion_reasons)})
122
+
123
+ if results:
124
+ fieldnames = list(results[0].keys())
125
+ with open(output_path, "w", newline="", encoding="utf-8") as f:
126
+ writer = csv.DictWriter(f, fieldnames=fieldnames)
127
+ writer.writeheader()
128
+ writer.writerows(results)
129
+ print(f"QC: {len(results)} subjects, {len(excluded)} excluded -> {output_path}")
130
+
131
+ if args.exclude_output and excluded:
132
+ exclude_path = Path(args.exclude_output).resolve()
133
+ exclude_path.parent.mkdir(parents=True, exist_ok=True)
134
+ with open(exclude_path, "w", newline="", encoding="utf-8") as f:
135
+ writer = csv.DictWriter(f, fieldnames=["subject_id", "reasons"])
136
+ writer.writeheader()
137
+ writer.writerows(excluded)
138
+
139
+ return 0
140
+
141
+
142
+ if __name__ == "__main__":
143
+ sys.exit(main())
@@ -0,0 +1,146 @@
1
+ #!/usr/bin/env python3
2
+ """Reorganize HCP Early Psychosis 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 Early Psychosis",
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 Early Psychosis project.",
95
+ "ReferencesAndLinks": ["https://www.humanconnectome.org/study/hcp-early-psychosis"],
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-EP 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) % 50 == 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())