@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,302 @@
1
+ ---
2
+ name: abide-skill
3
+ description: "Use this skill whenever the user wants an end-to-end workflow for the ABIDE (Autism Brain Imaging Data Exchange) dataset, including download, BIDS organization, and processing of sMRI and rs-fMRI data. Triggers include: 'ABIDE', 'ABIDE data', 'process ABIDE', 'ABIDE fMRI', 'ABIDE sMRI', 'autism imaging', or any request to run the ABIDE pipeline. This is the NeuroClaw dataset-orchestration layer for ABIDE."
4
+ license: MIT License (NeuroClaw custom skill - freely modifiable within the project)
5
+ layer: subagent
6
+ skill_type: dataset
7
+ dependencies:
8
+ - smri-skill
9
+ - fmri-skill
10
+ - bids-organizer
11
+ - claw-shell
12
+ ---
13
+ # ABIDE Skill (Dataset-Orchestration Layer)
14
+
15
+ ## Overview
16
+ `abide-skill` is the NeuroClaw orchestration skill for the **ABIDE (Autism Brain Imaging Data Exchange)** dataset.
17
+
18
+ It coordinates a fixed three-phase workflow:
19
+ 1. Download ABIDE data from the FCP/INDI repository or NITRC.
20
+ 2. Prepare and validate BIDS-style data organization for downstream processing.
21
+ 3. Delegate modality pipelines to `smri-skill` and `fmri-skill`.
22
+
23
+ It also provides **phenotype extraction** and **QC integration** paths:
24
+ - Extract and merge ABIDE phenotype tables (diagnosis, age, sex, site, FIQ, ADOS, etc.).
25
+ - Generate per-subject QC summaries with exclusion lists.
26
+
27
+ This skill follows NeuroClaw hierarchy:
28
+ - Defines **WHAT to do**, not low-level implementation details.
29
+ - Does **not** execute direct shell commands itself.
30
+ - Delegates all execution via `claw-shell` to base/tool skills.
31
+
32
+ **Research use only.**
33
+
34
+ ---
35
+
36
+ ## Download Stage (Mandatory First Step)
37
+
38
+ ### Source
39
+ ABIDE data is distributed through the **FCP/INDI** repository:
40
+ - ABIDE I: https://fcon_1000.projects.nitrc.org/indi/abide/
41
+ - ABIDE II: https://fcon_1000.projects.nitrc.org/indi/abide_II.html
42
+ - NITRC mirror: https://www.nitrc.org/projects/fcp_indi/
43
+
44
+ ### Supported ABIDE Data Packages
45
+ - **ABIDE I**: 1,112 subjects from 17 international sites (539 ASD, 573 controls)
46
+ - **ABIDE II**: 1,044 subjects from 19 sites
47
+ - **Phenotype data**: CSV files with demographics, diagnosis, cognitive scores
48
+ - **Preprocessed derivatives** (optional): CPAC, DPARSF, CCS, NeuroMark pipelines
49
+
50
+ ### Delegation Rules for Download
51
+ - Environment/setup checks: `dependency-planner` + `conda-env-manager`
52
+ - Download tool installation and execution: `claw-shell`
53
+ - Optional raw-data organization to BIDS-style staging: `bids-organizer`
54
+
55
+ ### Download Inputs to Confirm in Plan
56
+ - Target ABIDE version (I, II, or both)
57
+ - Target subset (full cohort, specific sites, or ASD/control only)
58
+ - Subject list scope (full or custom IDs)
59
+ - Whether to download raw data or preprocessed derivatives
60
+ - Destination directory with sufficient disk space
61
+
62
+ ---
63
+
64
+ ## Narrow Path: ABIDE Raw NIfTI -> BIDS Staging
65
+
66
+ Use this path when the task only asks to reorganize raw ABIDE NIfTI files into a BIDS-style dataset and does not require preprocessing, ROI extraction, phenotype merging, or downstream analysis.
67
+
68
+ ### When this narrow path should dominate
69
+ - The task objective is limited to ABIDE NIfTI staging, BIDS renaming, sidecar handling, and dataset-level metadata.
70
+ - Inputs are already local ABIDE NIfTI files or ABIDE-style subject/site folders.
71
+ - The required deliverable is a direct staging script or command sequence, not a plan for fMRIPrep or downstream analysis.
72
+
73
+ ### Narrow-path contract
74
+ - Do not widen the solution to fMRIPrep, ROI extraction, phenotype merging, or downstream analysis unless the task explicitly requires them.
75
+ - Treat this as a direct file-organization problem: scan ABIDE subject/site layout, normalize subject labels, map modalities to BIDS names, copy or symlink NIfTI plus matching sidecars, and write dataset-level metadata plus staging logs.
76
+ - If the task is benchmark-style, prefer a single direct end-to-end staging script over a confirmation-first orchestration plan.
77
+
78
+ ### Expected narrow-path behavior
79
+ 1. Detect ABIDE-style subject IDs (numeric, e.g., `0050642`) and normalize to BIDS labels such as `sub-0050642`.
80
+ 2. Detect site information and encode as BIDS session or metadata (e.g., `ses-NYU`, or site column in `participants.tsv`).
81
+ 3. Route modalities:
82
+ - T1w -> `anat/*_T1w`
83
+ - rs-fMRI/BOLD -> `func/*_task-rest_bold`
84
+ 4. Preserve or rename matching JSON sidecars when available; if metadata is absent, create only the minimal dataset files required by the task and log the limitation.
85
+ 5. Emit dataset-level outputs such as `dataset_description.json`, `participants.tsv`, `README`, and a manifest or skipped-file report.
86
+
87
+ ---
88
+
89
+ ## Core Workflow (Never Bypassed)
90
+ 1. Identify user target: full ABIDE download, imaging subset, phenotype extraction, or BIDS staging only.
91
+ 2. Generate a numbered plan with tools, outputs, runtime, storage, and risks.
92
+ 3. Wait for explicit confirmation (`YES` / `execute` / `proceed`).
93
+ 4. On confirmation, run download stage first (if needed).
94
+ 5. After download success, run BIDS preparation using `scripts/reorganize_abide.py`.
95
+ 6. Delegate to modality skills:
96
+ - `smri-skill` for structural MRI (T1w)
97
+ - `fmri-skill` for resting-state fMRI (rs-fMRI)
98
+ 7. If phenotype extraction is requested, run `scripts/extract_abide_phenotype.py`.
99
+ 8. If QC summary is requested, run `scripts/abide_qc_summary.py`.
100
+ 9. Save outputs into an ABIDE-centered structure under `abide_output/`.
101
+
102
+ ---
103
+
104
+ ## Input Layout (Example)
105
+
106
+ Subject `0050642` from site NYU:
107
+
108
+ ```
109
+ abide_raw/
110
+ NYU/
111
+ 0050642/
112
+ session_1/
113
+ anat_1/
114
+ anat.nii.gz
115
+ func_1/
116
+ func.nii.gz
117
+ phenotype/
118
+ ABIDE_phenotypic.csv
119
+ ```
120
+
121
+ Or flat layout:
122
+
123
+ ```
124
+ abide_raw/
125
+ 0050642/
126
+ anat/
127
+ T1w.nii.gz
128
+ func/
129
+ rest_bold.nii.gz
130
+ ```
131
+
132
+ ---
133
+
134
+ ## BIDS Preparation
135
+
136
+ ### Script: `scripts/reorganize_abide.py`
137
+
138
+ Converts ABIDE raw directory structure to BIDS-compliant layout.
139
+
140
+ ```bash
141
+ python skills/abide-skill/scripts/reorganize_abide.py \
142
+ --input /path/to/abide_raw \
143
+ --output /path/to/abide_bids \
144
+ --phenotype /path/to/abide_raw/phenotype/ABIDE_phenotypic.csv
145
+ ```
146
+
147
+ Features:
148
+ - Subject ID normalization: numeric ABIDE IDs to BIDS `sub-NNNNNNN`
149
+ - Site extraction and encoding in `participants.tsv`
150
+ - Modality routing: T1w, rs-fMRI
151
+ - Sidecar JSON preservation and validation
152
+ - `dataset_description.json` and `participants.tsv` generation with phenotype metadata
153
+ - Dry-run mode: `--dry-run` to preview without copying
154
+
155
+ ---
156
+
157
+ ## Multimodal Processing Delegation
158
+
159
+ After BIDS staging completes, `abide-skill` delegates by modality:
160
+
161
+ | Modality | Delegated skill | Typical tasks | Main outputs |
162
+ |---|---|---|---|
163
+ | sMRI (T1w) | `smri-skill` | brain extraction, tissue segmentation, cortical reconstruction, ROI morphometry | `smri_output/` derivatives and stats |
164
+ | rs-fMRI | `fmri-skill` | preprocessing, denoising, ROI time series, connectivity | `fmri_output/` derivatives, timeseries, connectivity |
165
+
166
+ ### Delegation Strategy
167
+ - If user asks for full ABIDE analysis: run sMRI -> fMRI in ordered phases.
168
+ - If user asks for one modality only: call only the corresponding modality skill.
169
+ - If compute resources are adequate and the user approves parallel runs: run modality pipelines in parallel.
170
+
171
+ ---
172
+
173
+ ## Phenotype Extraction
174
+
175
+ ### Script: `scripts/extract_abide_phenotype.py`
176
+
177
+ Extracts and merges ABIDE phenotype tables for downstream analysis.
178
+
179
+ ```bash
180
+ python skills/abide-skill/scripts/extract_abide_phenotype.py \
181
+ --phenotype-dir /path/to/abide_raw/phenotype \
182
+ --output /path/to/abide_output/phenotype/merged_phenotype.csv \
183
+ --columns subject,DX_GROUP,AGE_AT_SCAN,SEX,FIQ,VIQ,PIQ,site \
184
+ --imaging-ids /path/to/abide_output/bids/participants.tsv
185
+ ```
186
+
187
+ Features:
188
+ - Reads ABIDE phenotype CSV files (ABIDE I and II compatible)
189
+ - Standardizes column names (DX_GROUP: 1=ASD, 2=control)
190
+ - Column selection and renaming
191
+ - Site encoding and grouping
192
+ - Missing value handling
193
+ - Cross-reference with imaging subject list
194
+ - Outputs merged CSV ready for statistical analysis or model training
195
+
196
+ ---
197
+
198
+ ## QC Integration
199
+
200
+ ### Script: `scripts/abide_qc_summary.py`
201
+
202
+ Generates per-subject QC summaries and exclusion lists.
203
+
204
+ ```bash
205
+ python skills/abide-skill/scripts/abide_qc_summary.py \
206
+ --fmriprep-dir /path/to/abide_output/fmriprep \
207
+ --freesurfer-dir /path/to/abide_output/smri/freesurfer \
208
+ --raw-qc /path/to/abide_raw/phenotype/ABIDE_phenotypic.csv \
209
+ --output /path/to/abide_output/qc/qc_summary.csv \
210
+ --exclude-output /path/to/abide_output/qc/exclude_list.csv \
211
+ --fd-threshold 0.3 \
212
+ --coverage-threshold 0.8
213
+ ```
214
+
215
+ Features:
216
+ - Reads fMRIPrep confounds (framewise displacement, DVARS)
217
+ - Reads FreeSurfer recon-all QC metrics
218
+ - Incorporates ABIDE QC flags (QC_RATER_1, func_perc_fd, anat_rater_1, etc.)
219
+ - Applies exclusion criteria: motion threshold (FD), coverage threshold, structural quality
220
+ - Per-site QC summary for site-effect assessment
221
+ - Outputs per-subject QC summary CSV and exclusion list CSV
222
+
223
+ ---
224
+
225
+ ## Recommended Output Layout
226
+ All assets should be organized under `./abide_output/`:
227
+ - `abide_output/raw/` (downloaded original ABIDE files)
228
+ - `abide_output/bids/` (staged BIDS data)
229
+ - `abide_output/staging/` (optional normalized staging intermediate)
230
+ - `abide_output/smri/` (links or copies from `smri_output/`)
231
+ - `abide_output/fmri/` (links or copies from `fmri_output/`)
232
+ - `abide_output/phenotype/` (merged phenotype tables)
233
+ - `abide_output/qc/` (QC summaries and exclusion lists)
234
+ - `abide_output/logs/` (download + orchestration logs)
235
+
236
+ ---
237
+
238
+ ## Benchmark Adapter Guidance
239
+
240
+ For benchmark-style prompts, do not force the full `download -> staging -> multimodal processing` orchestration when the task is only asking for local ABIDE data staging or organization.
241
+
242
+ - If the task starts from raw ABIDE data already present on disk and only asks for BIDS-style staging / organization:
243
+ - skip the mandatory download stage
244
+ - do not automatically delegate to `smri-skill` or `fmri-skill`
245
+ - default to the narrow path `local raw ABIDE discovery -> BIDS-style staging -> minimal metadata -> validation/report`
246
+ - In benchmark mode, do not require explicit confirmation before presenting the direct staging solution.
247
+ - Preserve the ABIDE-centered output contract under `abide_output/bids/` when the task is specifically a staging benchmark.
248
+ - Only use the full multimodal orchestration and confirmation-heavy workflow when the prompt explicitly asks for download, end-to-end ABIDE processing, or post-staging structural / functional analysis.
249
+
250
+ ---
251
+
252
+ ## Safety and Execution Policy
253
+ - No execution before explicit plan confirmation.
254
+ - All execution must be routed via `claw-shell`.
255
+ - Missing dependencies must be resolved by `dependency-planner` before running.
256
+ - If download fails for partial subjects, continue batch with clear failure report and retry list.
257
+
258
+ ---
259
+
260
+ ## Important Notes and Limitations
261
+ - ABIDE data from different sites may have varying acquisition parameters; site effects should be accounted for in analysis.
262
+ - ABIDE subject IDs are numeric and vary in length across sites.
263
+ - ABIDE I and II have different phenotype table formats; the extraction script handles both.
264
+ - ABIDE provides preprocessed derivatives from multiple pipelines (CPAC, DPARSF, CCS); raw data processing via fMRIPrep is recommended for reproducibility.
265
+ - ABIDE data does not include task-fMRI; only resting-state fMRI is available.
266
+ - `abide-skill` is orchestration-only; detailed preprocessing logic remains in `smri-skill` and `fmri-skill`.
267
+
268
+ ---
269
+
270
+ ## When to Call This Skill
271
+ - User asks for end-to-end ABIDE workflow.
272
+ - User asks to download ABIDE data and then run sMRI/rs-fMRI processing.
273
+ - User needs BIDS staging for raw ABIDE NIfTI files.
274
+ - User asks to extract and merge ABIDE phenotype tables.
275
+ - User asks for ABIDE-specific QC summaries and exclusion lists.
276
+ - User needs a single entry point for ABIDE multimodal orchestration.
277
+
278
+ ---
279
+
280
+ ## Complementary / Related Skills
281
+ - `smri-skill`
282
+ - `fmri-skill`
283
+ - `bids-organizer`
284
+ - `fmriprep-tool`
285
+ - `freesurfer-tool`
286
+ - `neurostorm`
287
+ - `brain_gnn`
288
+ - `dependency-planner`
289
+ - `conda-env-manager`
290
+ - `claw-shell`
291
+
292
+ ---
293
+
294
+ ## Reference
295
+ - ABIDE I: https://fcon_1000.projects.nitrc.org/indi/abide/
296
+ - ABIDE II: https://fcon_1000.projects.nitrc.org/indi/abide_II.html
297
+ - Di Martino et al., 2014, *The autism brain imaging data exchange: towards a large-scale evaluation of the intrinsic brain architecture in autism*
298
+ - BIDS spec: https://bids.neuroimaging.io/
299
+
300
+ Created At: 2026-05-06 01:45 HKT
301
+ Last Updated At: 2026-05-06 01:45 HKT
302
+ Author: chengwang96
@@ -0,0 +1,317 @@
1
+ #!/usr/bin/env python3
2
+ """Generate per-subject QC summaries and exclusion lists for ABIDE.
3
+
4
+ Combines fMRIPrep confounds, FreeSurfer recon-all metrics, and ABIDE native
5
+ QC flags to produce a unified QC report with configurable exclusion criteria.
6
+ """
7
+ import argparse
8
+ import csv
9
+ import sys
10
+ from pathlib import Path
11
+ from typing import Dict, List, Optional, Set, Tuple
12
+
13
+ try:
14
+ import pandas as pd
15
+ except ImportError:
16
+ print("Error: pandas is required. Install with: pip install pandas", file=sys.stderr)
17
+ sys.exit(1)
18
+
19
+
20
+ def detect_delimiter(file_path: Path) -> str:
21
+ """Detect whether file uses tab or comma delimiter."""
22
+ with open(file_path, "r", encoding="utf-8") as f:
23
+ first_line = f.readline()
24
+ if "\t" in first_line:
25
+ return "\t"
26
+ return ","
27
+
28
+
29
+ def collect_fmriprep_qc(fmriprep_dir: Path) -> Dict[str, Dict[str, float]]:
30
+ """Collect QC metrics from fMRIPrep outputs."""
31
+ qc = {}
32
+
33
+ confounds_patterns = [
34
+ "**/desc-confounds_timeseries.tsv",
35
+ "**/*_desc-confounds_timeseries.tsv",
36
+ "**/confounds.tsv",
37
+ ]
38
+
39
+ confounds_files = []
40
+ for pattern in confounds_patterns:
41
+ confounds_files.extend(fmriprep_dir.rglob(pattern))
42
+
43
+ for confounds_file in confounds_files:
44
+ subject_id = None
45
+ for part in confounds_file.parts:
46
+ if part.startswith("sub-"):
47
+ subject_id = part
48
+ break
49
+ if not subject_id:
50
+ continue
51
+
52
+ delimiter = detect_delimiter(confounds_file)
53
+ try:
54
+ df = pd.read_csv(confounds_file, sep=delimiter, low_memory=False)
55
+ except Exception as e:
56
+ print(f"[WARN] Failed to read {confounds_file}: {e}", file=sys.stderr)
57
+ continue
58
+
59
+ fd_col = None
60
+ for col_name in ["framewise_displacement", "fd", "FD"]:
61
+ if col_name in df.columns:
62
+ fd_col = col_name
63
+ break
64
+
65
+ dvars_col = None
66
+ for col_name in ["dvars", "DVARS", "std_dvars"]:
67
+ if col_name in df.columns:
68
+ dvars_col = col_name
69
+ break
70
+
71
+ metrics = {"n_volumes": len(df)}
72
+
73
+ if fd_col:
74
+ fd_values = pd.to_numeric(df[fd_col], errors="coerce").dropna()
75
+ if len(fd_values) > 0:
76
+ metrics["mean_fd"] = float(fd_values.mean())
77
+ metrics["max_fd"] = float(fd_values.max())
78
+ metrics["median_fd"] = float(fd_values.median())
79
+ else:
80
+ metrics["mean_fd"] = 0.0
81
+ metrics["max_fd"] = 0.0
82
+ metrics["median_fd"] = 0.0
83
+
84
+ if dvars_col:
85
+ dvars_values = pd.to_numeric(df[dvars_col], errors="coerce").dropna()
86
+ if len(dvars_values) > 0:
87
+ metrics["mean_dvars"] = float(dvars_values.mean())
88
+
89
+ if subject_id in qc:
90
+ existing = qc[subject_id]
91
+ existing["mean_fd"] = max(existing.get("mean_fd", 0), metrics.get("mean_fd", 0))
92
+ existing["max_fd"] = max(existing.get("max_fd", 0), metrics.get("max_fd", 0))
93
+ existing["n_volumes"] = existing.get("n_volumes", 0) + metrics.get("n_volumes", 0)
94
+ else:
95
+ qc[subject_id] = metrics
96
+
97
+ return qc
98
+
99
+
100
+ def collect_freesurfer_qc(freesurfer_dir: Path) -> Dict[str, Dict[str, float]]:
101
+ """Collect QC metrics from FreeSurfer recon-all outputs."""
102
+ qc = {}
103
+
104
+ for recon_log in freesurfer_dir.rglob("**/recon-all.log"):
105
+ # Extract subject ID from path
106
+ subject_id = None
107
+ for part in recon_log.parts:
108
+ if part.startswith("sub-"):
109
+ subject_id = part
110
+ break
111
+ if not subject_id:
112
+ continue
113
+
114
+ completed = False
115
+ try:
116
+ with open(recon_log, "r", encoding="utf-8", errors="ignore") as f:
117
+ content = f.read()
118
+ completed = "finished without error" in content.lower() or "recon-all -done" in content.lower()
119
+ except Exception:
120
+ pass
121
+
122
+ metrics = {"completed": completed}
123
+
124
+ # Try to read aseg.stats
125
+ aseg_matches = list(freesurfer_dir.rglob(f"{subject_id}**/aseg.stats"))
126
+ if aseg_matches:
127
+ try:
128
+ with open(aseg_matches[0], "r", encoding="utf-8", errors="ignore") as f:
129
+ for line in f:
130
+ if "EstimatedTotalIntraCranialVol" in line:
131
+ parts = line.split()
132
+ if len(parts) >= 4:
133
+ try:
134
+ metrics["etiv"] = float(parts[3])
135
+ except ValueError:
136
+ pass
137
+ elif "BrainSegVol" in line and "Not" not in line:
138
+ parts = line.split()
139
+ if len(parts) >= 4:
140
+ try:
141
+ metrics["total_brain_volume"] = float(parts[3])
142
+ except ValueError:
143
+ pass
144
+ except Exception:
145
+ pass
146
+
147
+ qc[subject_id] = metrics
148
+
149
+ return qc
150
+
151
+
152
+ def collect_abide_native_qc(phenotype_file: Path) -> Dict[str, Dict[str, float]]:
153
+ """Collect ABIDE native QC flags from phenotype file."""
154
+ qc = {}
155
+ if not phenotype_file.exists():
156
+ return qc
157
+
158
+ try:
159
+ df = pd.read_csv(phenotype_file, sep=None, engine="python", low_memory=False)
160
+ except Exception as e:
161
+ print(f"[WARN] Failed to read {phenotype_file}: {e}", file=sys.stderr)
162
+ return qc
163
+
164
+ id_col = None
165
+ for col_name in ["SUBJECT_ID", "subject", "Subject", "SUBJECT_KEY"]:
166
+ if col_name in df.columns:
167
+ id_col = col_name
168
+ break
169
+ if not id_col:
170
+ return qc
171
+
172
+ # Look for QC columns
173
+ qc_cols = [c for c in df.columns if "qc" in c.lower() or "rater" in c.lower() or "perc_fd" in c.lower()]
174
+
175
+ for _, row in df.iterrows():
176
+ sid = str(row[id_col]).strip()
177
+ metrics = {}
178
+ for col in qc_cols:
179
+ val = row.get(col)
180
+ if pd.notna(val):
181
+ try:
182
+ metrics[col] = float(val)
183
+ except (ValueError, TypeError):
184
+ metrics[col] = str(val)
185
+ qc[f"sub-{sid}"] = metrics
186
+
187
+ return qc
188
+
189
+
190
+ def generate_qc_summary(
191
+ fmriprep_qc: Dict[str, Dict[str, float]],
192
+ freesurfer_qc: Dict[str, Dict[str, float]],
193
+ abide_qc: Dict[str, Dict[str, float]],
194
+ fd_threshold: float = 0.3,
195
+ max_fd_threshold: float = 5.0,
196
+ coverage_threshold: float = 0.8,
197
+ ) -> Tuple["pd.DataFrame", List[str]]:
198
+ """Generate QC summary DataFrame and exclusion list."""
199
+ all_subjects = set()
200
+ all_subjects.update(fmriprep_qc.keys())
201
+ all_subjects.update(freesurfer_qc.keys())
202
+ all_subjects.update(abide_qc.keys())
203
+
204
+ rows = []
205
+ excluded = []
206
+
207
+ for sub_id in sorted(all_subjects):
208
+ row = {"subject_id": sub_id}
209
+ exclude_reasons = []
210
+
211
+ fp = fmriprep_qc.get(sub_id, {})
212
+ row["mean_fd"] = fp.get("mean_fd", None)
213
+ row["max_fd"] = fp.get("max_fd", None)
214
+ row["median_fd"] = fp.get("median_fd", None)
215
+ row["mean_dvars"] = fp.get("mean_dvars", None)
216
+ row["n_volumes"] = fp.get("n_volumes", None)
217
+
218
+ fs = freesurfer_qc.get(sub_id, {})
219
+ row["fs_completed"] = fs.get("completed", None)
220
+ row["total_brain_volume"] = fs.get("total_brain_volume", None)
221
+ row["etiv"] = fs.get("etiv", None)
222
+
223
+ abcd = abide_qc.get(sub_id, {})
224
+ for key, val in abcd.items():
225
+ row[f"abide_{key}"] = val
226
+
227
+ if row["mean_fd"] is not None and row["mean_fd"] > fd_threshold:
228
+ exclude_reasons.append(f"mean_fd={row['mean_fd']:.3f}>{fd_threshold}")
229
+
230
+ if row["max_fd"] is not None and row["max_fd"] > max_fd_threshold:
231
+ exclude_reasons.append(f"max_fd={row['max_fd']:.3f}>{max_fd_threshold}")
232
+
233
+ if row["fs_completed"] is False:
234
+ exclude_reasons.append("FreeSurfer recon-all incomplete")
235
+
236
+ row["exclude"] = len(exclude_reasons) > 0
237
+ row["exclude_reasons"] = "; ".join(exclude_reasons) if exclude_reasons else ""
238
+
239
+ if exclude_reasons:
240
+ excluded.append(sub_id)
241
+
242
+ rows.append(row)
243
+
244
+ df = pd.DataFrame(rows)
245
+ return df, excluded
246
+
247
+
248
+ def main() -> int:
249
+ parser = argparse.ArgumentParser(
250
+ description="Generate per-subject QC summaries and exclusion lists for ABIDE."
251
+ )
252
+ parser.add_argument("--fmriprep-dir", help="Path to fMRIPrep output directory")
253
+ parser.add_argument("--freesurfer-dir", help="Path to FreeSurfer output directory")
254
+ parser.add_argument("--raw-qc", help="Path to ABIDE phenotype CSV with QC flags")
255
+ parser.add_argument("--output", required=True, help="Output path for QC summary CSV")
256
+ parser.add_argument("--exclude-output", help="Output path for exclusion list CSV")
257
+ parser.add_argument("--fd-threshold", type=float, default=0.3, help="Mean FD threshold (default: 0.3)")
258
+ parser.add_argument("--max-fd-threshold", type=float, default=5.0, help="Max FD threshold (default: 5.0)")
259
+ parser.add_argument("--coverage-threshold", type=float, default=0.8, help="Coverage threshold (default: 0.8)")
260
+ args = parser.parse_args()
261
+
262
+ fmriprep_qc = {}
263
+ freesurfer_qc = {}
264
+ abide_qc = {}
265
+
266
+ if args.fmriprep_dir:
267
+ fp_dir = Path(args.fmriprep_dir).resolve()
268
+ if fp_dir.exists():
269
+ print(f"Collecting fMRIPrep QC from {fp_dir}...")
270
+ fmriprep_qc = collect_fmriprep_qc(fp_dir)
271
+ print(f" Found {len(fmriprep_qc)} subjects")
272
+
273
+ if args.freesurfer_dir:
274
+ fs_dir = Path(args.freesurfer_dir).resolve()
275
+ if fs_dir.exists():
276
+ print(f"Collecting FreeSurfer QC from {fs_dir}...")
277
+ freesurfer_qc = collect_freesurfer_qc(fs_dir)
278
+ print(f" Found {len(freesurfer_qc)} subjects")
279
+
280
+ if args.raw_qc:
281
+ raw_qc_path = Path(args.raw_qc).resolve()
282
+ if raw_qc_path.exists():
283
+ print(f"Collecting ABIDE native QC from {raw_qc_path}...")
284
+ abide_qc = collect_abide_native_qc(raw_qc_path)
285
+ print(f" Found {len(abide_qc)} subjects")
286
+
287
+ if not fmriprep_qc and not freesurfer_qc and not abide_qc:
288
+ print("[ERROR] No QC data collected. Check input paths.", file=sys.stderr)
289
+ return 1
290
+
291
+ summary_df, excluded = generate_qc_summary(
292
+ fmriprep_qc=fmriprep_qc,
293
+ freesurfer_qc=freesurfer_qc,
294
+ abide_qc=abide_qc,
295
+ fd_threshold=args.fd_threshold,
296
+ max_fd_threshold=args.max_fd_threshold,
297
+ coverage_threshold=args.coverage_threshold,
298
+ )
299
+
300
+ output_path = Path(args.output).resolve()
301
+ output_path.parent.mkdir(parents=True, exist_ok=True)
302
+ summary_df.to_csv(output_path, index=False)
303
+ print(f"\nQC Summary: {len(summary_df)} subjects -> {output_path}")
304
+ print(f" Excluded: {len(excluded)} / {len(summary_df)} ({100*len(excluded)/max(len(summary_df),1):.1f}%)")
305
+
306
+ if args.exclude_output:
307
+ exclude_path = Path(args.exclude_output).resolve()
308
+ exclude_path.parent.mkdir(parents=True, exist_ok=True)
309
+ exclude_df = summary_df[summary_df["exclude"] == True][["subject_id", "exclude_reasons"]]
310
+ exclude_df.to_csv(exclude_path, index=False)
311
+ print(f" Exclusion list: {exclude_path}")
312
+
313
+ return 0
314
+
315
+
316
+ if __name__ == "__main__":
317
+ sys.exit(main())