@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,136 @@
1
+ #!/usr/bin/env python3
2
+ """Extract and merge PNC phenotype data.
3
+
4
+ Reads PNC phenotype files (cognitive battery, psychiatric, demographics)
5
+ and produces a merged phenotype table aligned with imaging subject list.
6
+ """
7
+ import argparse
8
+ import csv
9
+ import sys
10
+ from pathlib import Path
11
+ from typing import Dict, List, Optional
12
+
13
+ COLUMN_MAP = {
14
+ "subject_id": ["subject", "Subject", "participant_id", "SubID", "bblid"],
15
+ "age": ["age", "Age", "age_at_scan"],
16
+ "sex": ["sex", "Sex", "Gender"],
17
+ "race": ["race", "Race"],
18
+ "ethnicity": ["ethnicity", "Ethnicity"],
19
+ "handedness": ["handedness", "Handedness"],
20
+ # Psychiatric
21
+ "goassess_diag": ["goassess_diag", "DX", "diagnosis"],
22
+ "goassess_diag_detail": ["goassess_diag_detail", "DX_detail"],
23
+ "psychosis_yn": ["psychosis_yn", "Psychosis"],
24
+ # Cognitive (Penn CNB)
25
+ "cpf_correct": ["CPF_correct", "cpf_correct"],
26
+ "cpt_correct": ["CPT_correct", "cpt_correct"],
27
+ "lt_correct": ["LT_correct", "lt_correct"],
28
+ "pmat_correct": ["PMAT_correct", "pmat_correct"],
29
+ "wrat_standard": ["WRAT_standard", "wrat_standard"],
30
+ "tap_correct": ["TAP_correct", "tap_correct"],
31
+ "er40_correct": ["ER40_correct", "er40_correct"],
32
+ "pvrt_correct": ["PVRT_correct", "pvrt_correct"],
33
+ }
34
+
35
+
36
+ def load_csv(path: Path) -> List[Dict[str, str]]:
37
+ delimiter = "\t" if path.suffix == ".tsv" else ","
38
+ with open(path, "r", encoding="utf-8") as f:
39
+ reader = csv.DictReader(f, delimiter=delimiter)
40
+ return list(reader)
41
+
42
+
43
+ def find_column(row: Dict[str, str], candidates: List[str]) -> Optional[str]:
44
+ for col in candidates:
45
+ if col in row:
46
+ return col
47
+ return None
48
+
49
+
50
+ def extract_phenotype(
51
+ phenotype_files: List[Path],
52
+ imaging_ids: Optional[List[str]] = None,
53
+ columns: Optional[List[str]] = None,
54
+ ) -> List[Dict[str, str]]:
55
+ all_data = []
56
+ for fpath in phenotype_files:
57
+ rows = load_csv(fpath)
58
+ all_data.extend(rows)
59
+
60
+ if not all_data:
61
+ return []
62
+
63
+ target_columns = columns if columns else list(COLUMN_MAP.keys())
64
+ merged = {}
65
+
66
+ for row in all_data:
67
+ subj_col = find_column(row, COLUMN_MAP["subject_id"])
68
+ if subj_col is None:
69
+ continue
70
+ subj_id = row[subj_col].strip()
71
+ if not subj_id:
72
+ continue
73
+
74
+ if subj_id not in merged:
75
+ merged[subj_id] = {"subject_id": subj_id}
76
+
77
+ for target_col in target_columns:
78
+ if target_col == "subject_id":
79
+ continue
80
+ if target_col in merged[subj_id] and merged[subj_id][target_col]:
81
+ continue
82
+ candidates = COLUMN_MAP.get(target_col, [target_col])
83
+ src_col = find_column(row, candidates)
84
+ if src_col and row.get(src_col, "").strip():
85
+ merged[subj_id][target_col] = row[src_col].strip()
86
+
87
+ result = list(merged.values())
88
+ if imaging_ids:
89
+ imaging_set = set(imaging_ids)
90
+ result = [r for r in result if r["subject_id"] in imaging_set]
91
+ return result
92
+
93
+
94
+ def main() -> int:
95
+ parser = argparse.ArgumentParser(description="Extract PNC phenotype data.")
96
+ parser.add_argument("--phenotype-files", required=True, nargs="+")
97
+ parser.add_argument("--output", required=True)
98
+ parser.add_argument("--imaging-ids")
99
+ parser.add_argument("--columns")
100
+ args = parser.parse_args()
101
+
102
+ phenotype_files = [Path(f).resolve() for f in args.phenotype_files]
103
+ for f in phenotype_files:
104
+ if not f.exists():
105
+ print(f"File not found: {f}", file=sys.stderr)
106
+ return 1
107
+
108
+ imaging_ids = None
109
+ if args.imaging_ids:
110
+ id_file = Path(args.imaging_ids).resolve()
111
+ if id_file.exists():
112
+ imaging_ids = [l.strip() for l in id_file.read_text().splitlines() if l.strip()]
113
+
114
+ columns = None
115
+ if args.columns:
116
+ columns = [c.strip() for c in args.columns.split(",")]
117
+
118
+ merged = extract_phenotype(phenotype_files, imaging_ids, columns)
119
+ if not merged:
120
+ print("[ERROR] No phenotype data extracted.", file=sys.stderr)
121
+ return 1
122
+
123
+ output_path = Path(args.output).resolve()
124
+ output_path.parent.mkdir(parents=True, exist_ok=True)
125
+ fieldnames = list(merged[0].keys())
126
+ with open(output_path, "w", newline="", encoding="utf-8") as f:
127
+ writer = csv.DictWriter(f, fieldnames=fieldnames)
128
+ writer.writeheader()
129
+ writer.writerows(merged)
130
+
131
+ print(f"Phenotype: {len(merged)} subjects, {len(fieldnames)} columns -> {output_path}")
132
+ return 0
133
+
134
+
135
+ if __name__ == "__main__":
136
+ sys.exit(main())
@@ -0,0 +1,116 @@
1
+ #!/usr/bin/env python3
2
+ """Generate per-subject QC summaries for PNC processing.
3
+
4
+ Pediatric-specific: uses higher FD threshold (0.4mm) for developmental data.
5
+ """
6
+ import argparse
7
+ import csv
8
+ import sys
9
+ from pathlib import Path
10
+ from typing import Dict, List
11
+
12
+
13
+ def load_confounds(confounds_path: Path) -> Dict[str, float]:
14
+ metrics = {"fd_mean": float("nan"), "fd_max": float("nan")}
15
+ try:
16
+ import pandas as pd
17
+ df = pd.read_csv(confounds_path, sep="\t")
18
+ if "framewise_displacement" in df.columns:
19
+ fd = df["framewise_displacement"].dropna()
20
+ metrics["fd_mean"] = float(fd.mean())
21
+ metrics["fd_max"] = float(fd.max())
22
+ except Exception:
23
+ pass
24
+ return metrics
25
+
26
+
27
+ def check_exclusion(metrics: Dict[str, float], fd_threshold: float = 0.4) -> List[str]:
28
+ reasons = []
29
+ if not (metrics["fd_mean"] != metrics["fd_mean"]):
30
+ if metrics["fd_mean"] > fd_threshold:
31
+ reasons.append(f"FD mean {metrics['fd_mean']:.3f} > {fd_threshold}")
32
+ return reasons
33
+
34
+
35
+ def main() -> int:
36
+ parser = argparse.ArgumentParser(description="Generate QC summaries for PNC processing.")
37
+ parser.add_argument("--fmriprep-dir", help="Path to fMRIPrep output directory")
38
+ parser.add_argument("--output", required=True)
39
+ parser.add_argument("--exclude-output")
40
+ parser.add_argument("--fd-threshold", type=float, default=0.4,
41
+ help="FD threshold (default: 0.4mm, higher for pediatric)")
42
+ parser.add_argument("--phenotype-file", help="CSV with age/diagnosis info")
43
+ args = parser.parse_args()
44
+
45
+ output_path = Path(args.output).resolve()
46
+ output_path.parent.mkdir(parents=True, exist_ok=True)
47
+
48
+ phenotype_map = {}
49
+ if args.phenotype_file:
50
+ pheno_path = Path(args.phenotype_file).resolve()
51
+ if pheno_path.exists():
52
+ with open(pheno_path, "r", encoding="utf-8") as f:
53
+ reader = csv.DictReader(f)
54
+ for row in reader:
55
+ subj = row.get("subject_id") or row.get("Subject", "")
56
+ if subj:
57
+ phenotype_map[subj] = row
58
+
59
+ subjects = set()
60
+ if args.fmriprep_dir:
61
+ fmriprep_dir = Path(args.fmriprep_dir).resolve()
62
+ if fmriprep_dir.exists():
63
+ for d in fmriprep_dir.glob("sub-*"):
64
+ if d.is_dir():
65
+ subjects.add(d.name)
66
+
67
+ if not subjects:
68
+ print("[WARN] No subjects found.", file=sys.stderr)
69
+ return 1
70
+
71
+ results = []
72
+ excluded = []
73
+ for subj in sorted(subjects):
74
+ metrics = {"subject_id": subj}
75
+
76
+ if subj in phenotype_map:
77
+ pheno = phenotype_map[subj]
78
+ if "age" in pheno:
79
+ metrics["age"] = pheno["age"]
80
+ if "goassess_diag" in pheno:
81
+ metrics["diagnosis"] = pheno["goassess_diag"]
82
+
83
+ if args.fmriprep_dir:
84
+ confounds_files = list(Path(args.fmriprep_dir).glob(f"{subj}/func/*_desc-confounds_timeseries.tsv"))
85
+ if confounds_files:
86
+ metrics.update(load_confounds(confounds_files[0]))
87
+
88
+ exclusion_reasons = check_exclusion(metrics, args.fd_threshold)
89
+ metrics["excluded"] = len(exclusion_reasons) > 0
90
+ metrics["exclusion_reasons"] = "; ".join(exclusion_reasons)
91
+
92
+ results.append(metrics)
93
+ if exclusion_reasons:
94
+ excluded.append({"subject_id": subj, "reasons": "; ".join(exclusion_reasons)})
95
+
96
+ if results:
97
+ fieldnames = list(results[0].keys())
98
+ with open(output_path, "w", newline="", encoding="utf-8") as f:
99
+ writer = csv.DictWriter(f, fieldnames=fieldnames)
100
+ writer.writeheader()
101
+ writer.writerows(results)
102
+ print(f"QC: {len(results)} subjects, {len(excluded)} excluded -> {output_path}")
103
+
104
+ if args.exclude_output and excluded:
105
+ exclude_path = Path(args.exclude_output).resolve()
106
+ exclude_path.parent.mkdir(parents=True, exist_ok=True)
107
+ with open(exclude_path, "w", newline="", encoding="utf-8") as f:
108
+ writer = csv.DictWriter(f, fieldnames=["subject_id", "reasons"])
109
+ writer.writeheader()
110
+ writer.writerows(excluded)
111
+
112
+ return 0
113
+
114
+
115
+ if __name__ == "__main__":
116
+ sys.exit(main())
@@ -0,0 +1,120 @@
1
+ #!/usr/bin/env python3
2
+ """Validate PNC BIDS structure and generate compliance report.
3
+
4
+ Checks directory structure, modality completeness, and task paradigm presence.
5
+ """
6
+ import argparse
7
+ import csv
8
+ import sys
9
+ from pathlib import Path
10
+ from typing import Dict, List
11
+
12
+ EXPECTED_TASKS = ["rest", "gonogo", "emotion", "lineorientation", "wordmemory"]
13
+
14
+
15
+ def validate_subject(subject_dir: Path) -> Dict[str, any]:
16
+ report = {
17
+ "subject": subject_dir.name,
18
+ "anat_complete": False,
19
+ "rs_fMRI_present": False,
20
+ "task_fMRI_present": False,
21
+ "dwi_present": False,
22
+ "n_task_runs": 0,
23
+ "tasks_found": [],
24
+ "missing_files": [],
25
+ "warnings": [],
26
+ }
27
+
28
+ # Check anat
29
+ anat_dir = subject_dir / "anat"
30
+ if anat_dir.exists():
31
+ t1w_files = list(anat_dir.glob("*_T1w.nii.gz"))
32
+ report["anat_complete"] = len(t1w_files) > 0
33
+ if not t1w_files:
34
+ report["missing_files"].append("anat/*_T1w.nii.gz")
35
+ else:
36
+ report["missing_files"].append("anat/")
37
+
38
+ # Check func
39
+ func_dir = subject_dir / "func"
40
+ if func_dir.exists():
41
+ bold_files = list(func_dir.glob("*_bold.nii.gz"))
42
+ report["n_task_runs"] = len(bold_files)
43
+
44
+ tasks_found = set()
45
+ for f in bold_files:
46
+ name = f.name
47
+ for task in EXPECTED_TASKS:
48
+ if f"task-{task}" in name:
49
+ tasks_found.add(task)
50
+ report["tasks_found"] = sorted(tasks_found)
51
+ report["rs_fMRI_present"] = "rest" in tasks_found
52
+ report["task_fMRI_present"] = len(tasks_found - {"rest"}) > 0
53
+ else:
54
+ report["missing_files"].append("func/")
55
+
56
+ # Check dwi
57
+ dwi_dir = subject_dir / "dwi"
58
+ if dwi_dir.exists():
59
+ dwi_files = list(dwi_dir.glob("*_dwi.nii.gz"))
60
+ report["dwi_present"] = len(dwi_files) > 0
61
+ else:
62
+ report["warnings"].append("No dwi directory")
63
+
64
+ return report
65
+
66
+
67
+ def main() -> int:
68
+ parser = argparse.ArgumentParser(description="Validate PNC BIDS structure.")
69
+ parser.add_argument("--input", required=True)
70
+ parser.add_argument("--output", required=True)
71
+ args = parser.parse_args()
72
+
73
+ input_dir = Path(args.input).resolve()
74
+ if not input_dir.exists():
75
+ print(f"Input directory not found: {input_dir}", file=sys.stderr)
76
+ return 1
77
+
78
+ subjects = sorted([d for d in input_dir.glob("sub-*") if d.is_dir()])
79
+ print(f"Found {len(subjects)} subjects in {input_dir}")
80
+
81
+ if not subjects:
82
+ print("[ERROR] No subjects found.", file=sys.stderr)
83
+ return 1
84
+
85
+ results = []
86
+ for sub_dir in subjects:
87
+ report = validate_subject(sub_dir)
88
+ results.append(report)
89
+
90
+ output_path = Path(args.output).resolve()
91
+ output_path.parent.mkdir(parents=True, exist_ok=True)
92
+
93
+ fieldnames = [
94
+ "subject", "anat_complete", "rs_fMRI_present", "task_fMRI_present",
95
+ "dwi_present", "n_task_runs", "tasks_found", "missing_files", "warnings",
96
+ ]
97
+ with open(output_path, "w", newline="", encoding="utf-8") as f:
98
+ writer = csv.DictWriter(f, fieldnames=fieldnames)
99
+ writer.writeheader()
100
+ for r in results:
101
+ r["tasks_found"] = "; ".join(r["tasks_found"])
102
+ r["missing_files"] = "; ".join(r["missing_files"])
103
+ r["warnings"] = "; ".join(r["warnings"])
104
+ writer.writerow(r)
105
+
106
+ complete = sum(1 for r in results if r["anat_complete"] and r["rs_fMRI_present"])
107
+ print(f"\nValidation Summary:")
108
+ print(f" Total subjects: {len(results)}")
109
+ print(f" Complete (anat + rs-fMRI): {complete}")
110
+ print(f" With T1w: {sum(1 for r in results if r['anat_complete'])}")
111
+ print(f" With rs-fMRI: {sum(1 for r in results if r['rs_fMRI_present'])}")
112
+ print(f" With task-fMRI: {sum(1 for r in results if r['task_fMRI_present'])}")
113
+ print(f" With dMRI: {sum(1 for r in results if r['dwi_present'])}")
114
+ print(f" Output: {output_path}")
115
+
116
+ return 0
117
+
118
+
119
+ if __name__ == "__main__":
120
+ sys.exit(main())
@@ -0,0 +1,209 @@
1
+ ---
2
+ name: ppmi-skill
3
+ description: "Use this skill whenever the user wants an end-to-end workflow for the Parkinson's Progression Markers Initiative (PPMI) dataset, including BIDS validation, multimodal processing of sMRI, rs-fMRI, and dMRI, phenotype extraction, and QC integration. Triggers include: 'PPMI', 'Parkinson', 'Parkinson disease', 'process PPMI data', 'PPMI fMRI', or any request to run the PPMI 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
+ - brain-visualization
15
+ - pet-skill
16
+ ---
17
+ # PPMI Skill (Dataset-Orchestration Layer)
18
+
19
+ ## Overview
20
+
21
+ `ppmi-skill` is the NeuroClaw orchestration skill for the **Parkinson's Progression Markers Initiative (PPMI)** dataset, launched by The Michael J. Fox Foundation.
22
+
23
+ It strictly follows the NeuroClaw hierarchical design principles:
24
+ - This skill **only describes WHAT needs to be done** and **which tool skill to delegate to**.
25
+ - It contains **no implementation code or concrete commands**.
26
+ - All concrete execution is delegated to existing base/tool skills via `claw-shell`.
27
+ - Companion scripts in `scripts/` provide reference implementations for BIDS validation, phenotype extraction, and QC.
28
+
29
+ **Core workflow (never bypassed):**
30
+ 1. Identify input PPMI data and target modalities.
31
+ 2. Generate a **numbered execution plan** clearly stating WHAT needs to be done and which tool skill will handle each step.
32
+ 3. Present the full plan, estimated runtime, resource requirements, and risks to the user and wait for explicit confirmation ("YES" / "execute" / "proceed").
33
+ 4. On confirmation, delegate every step to the appropriate skill via `claw-shell`.
34
+ 5. After execution, save all outputs in a clean directory structure (`ppmi_output/`).
35
+
36
+ **Research use only.**
37
+
38
+ ---
39
+
40
+ ## Quick Reference
41
+
42
+ | Task | What needs to be done | Delegate to | Expected output |
43
+ |---|---|---|---|
44
+ | BIDS validation | Validate PPMI BIDS structure | `scripts/validate_ppmi.py` | Validation report |
45
+ | sMRI processing | Brain extraction, tissue segmentation | `smri-skill` | `smri_output/` derivatives |
46
+ | rs-fMRI processing | Preprocessing, denoising, connectivity | `fmri-skill` | `fmri_output/` connectivity |
47
+ | dMRI processing | Diffusion preprocessing, tensor metrics | `dwi-skill` | `dwi_output/` metrics |
48
+ | Phenotype extraction | Motor scores, cognitive, biomarkers | `scripts/extract_ppmi_phenotype.py` | Merged phenotype CSV |
49
+ | QC summary | Per-subject quality control | `scripts/ppmi_qc_summary.py` | QC summary + exclusion list |
50
+
51
+ ---
52
+
53
+ ## Dataset Characteristics
54
+
55
+ - **Cohort**: ~2,000+ participants
56
+ - **PD patients**: Parkinson's disease (early stage, drug-naive)
57
+ - **Prodromal**: REM sleep behavior disorder, hyposmia
58
+ - **Healthy controls**: Age-matched
59
+ - **Scanner**: 3T Siemens (multi-site)
60
+ - **Modalities**: T1w sMRI, rs-fMRI, dMRI/DTI, DaTscan SPECT
61
+ - **Clinical**: MDS-UPDRS, MoCA, UPSIT, REM sleep, DAT imaging
62
+ - **Access**: LONI IDA (ida.loni.usc.edu), PPMI data portal
63
+ - **Format**: BIDS-compliant (community conversion)
64
+ - **Reference**: Marek et al. (2011), Lancet Neurology
65
+
66
+ ---
67
+
68
+ ## Supported Modalities
69
+
70
+ | Modality | Description | Details |
71
+ |---|---|---|
72
+ | T1w | High-resolution structural MRI | 1mm isotropic, substantia nigra volumetry |
73
+ | rs-fMRI | Resting-state functional MRI | Basal ganglia connectivity |
74
+ | dMRI | Diffusion-weighted imaging | DTI, nigrostriatal tract integrity |
75
+ | DaTscan | SPECT dopamine transporter | Striatal binding ratios |
76
+
77
+ ---
78
+
79
+ ## PPMI Clinical Measures
80
+
81
+ | Measure | Description | Domain |
82
+ |---|---|---|
83
+ | MDS-UPDRS | Movement Disorder Society Unified PD Rating Scale | Motor function |
84
+ | MoCA | Montreal Cognitive Assessment | Global cognition |
85
+ | UPSIT | University of Pennsylvania Smell Identification Test | Olfaction |
86
+ | RBD | REM Sleep Behavior Disorder screening | Sleep |
87
+ | H&Y | Hoehn and Yahr staging | Disease stage |
88
+ | DAT | Dopamine transporter binding (SPECT) | Dopaminergic function |
89
+
90
+ ---
91
+
92
+ ## BIDS Preparation
93
+
94
+ ### Script: `scripts/validate_ppmi.py`
95
+
96
+ Validates PPMI BIDS structure and generates a compliance report.
97
+
98
+ ```bash
99
+ python skills/ppmi-skill/scripts/validate_ppmi.py \
100
+ --input /path/to/PPMI/bids \
101
+ --output /path/to/ppmi_output/qc/bids_validation.csv
102
+ ```
103
+
104
+ Features:
105
+ - BIDS directory structure validation
106
+ - Diagnostic group completeness (PD, prodromal, control)
107
+ - Modality completeness (T1w, rs-fMRI, dMRI)
108
+ - Clinical measure availability check
109
+
110
+ ---
111
+
112
+ ## Core Workflow (Never Bypassed)
113
+
114
+ 1. Identify user target: full PPMI processing, imaging subset, phenotype extraction, or BIDS validation only.
115
+ 2. Generate a numbered plan with tools, outputs, runtime, storage, and risks.
116
+ 3. Wait for explicit confirmation (`YES` / `execute` / `proceed`).
117
+ 4. On confirmation, run BIDS validation using `scripts/validate_ppmi.py`.
118
+ 5. Delegate to `smri-skill` for structural MRI processing.
119
+ 6. Delegate to `fmri-skill` for rs-fMRI processing.
120
+ 7. Delegate to `dwi-skill` for dMRI processing.
121
+ 8. If phenotype extraction is requested, run `scripts/extract_ppmi_phenotype.py`.
122
+ 9. If QC summary is requested, run `scripts/ppmi_qc_summary.py`.
123
+ 10. Save outputs into `ppmi_output/`.
124
+
125
+ ---
126
+
127
+ ## Modality Processing Delegation
128
+
129
+ | Modality | Delegated skill | Typical tasks | Main outputs |
130
+ |---|---|---|---|
131
+ | sMRI (T1w) | `smri-skill` | brain extraction, tissue segmentation | `smri_output/` derivatives |
132
+ | rs-fMRI | `fmri-skill` | preprocessing, denoising, connectivity | `fmri_output/` connectivity |
133
+ | dMRI | `dwi-skill` | diffusion preprocessing, tensor metrics | `dwi_output/` metrics |
134
+
135
+ ---
136
+
137
+ ## Standard Output Layout
138
+
139
+ ```
140
+ ppmi_output/
141
+ ├── bids/ # BIDS-staged data (or validation report)
142
+ ├── smri/ # Structural MRI derivatives
143
+ ├── fmri/ # Functional MRI derivatives (rs-fMRI connectivity)
144
+ ├── dwi/ # Diffusion MRI derivatives (DTI metrics)
145
+ ├── phenotype/ # Merged phenotype tables (motor, cognitive, biomarkers)
146
+ ├── qc/ # QC summaries and exclusion lists
147
+ └── logs/ # Processing logs
148
+ ```
149
+
150
+ ---
151
+
152
+ ## Benchmark Adapter Guidance
153
+
154
+ For benchmark-style prompts, do not force the full orchestration when the task only asks for local PPMI data validation.
155
+
156
+ - If the task starts from PPMI data already present on disk and only asks for BIDS validation:
157
+ - Skip the download stage
158
+ - Default to the narrow path `local PPMI discovery -> BIDS validation -> report`
159
+ - In benchmark mode, do not require explicit confirmation before presenting the validation solution.
160
+
161
+ ---
162
+
163
+ ## Safety and Execution Policy
164
+ - No execution before explicit plan confirmation.
165
+ - All execution must be routed via `claw-shell`.
166
+ - Missing dependencies must be resolved by `dependency-planner` before running.
167
+
168
+ ---
169
+
170
+ ## Important Notes and Limitations
171
+ - PPMI is a multi-site study; site effects should be modeled in group analyses.
172
+ - Early-stage PD patients are often drug-naive, which is valuable for studying untreated disease.
173
+ - DaTscan SPECT provides dopaminergic imaging but may not follow standard BIDS conventions.
174
+ - Longitudinal design enables progression modeling.
175
+ - Large sample size and rich clinical phenotyping make PPMI ideal for biomarker discovery.
176
+ - `ppmi-skill` is orchestration-only; detailed preprocessing logic remains in modality skills.
177
+
178
+ ---
179
+
180
+ ## When to Call This Skill
181
+ - User asks for end-to-end PPMI workflow.
182
+ - User asks to process PPMI neuroimaging data.
183
+ - User needs BIDS validation for PPMI data.
184
+ - User asks to extract PPMI phenotype data (MDS-UPDRS, MoCA, DAT).
185
+ - User asks for Parkinson's disease neuroimaging analysis.
186
+
187
+ ---
188
+
189
+ ## Complementary / Related Skills
190
+ - `smri-skill` → structural MRI preprocessing
191
+ - `fmri-skill` → functional MRI preprocessing and analysis
192
+ - `dwi-skill` → diffusion MRI preprocessing
193
+ - `pet-skill` → PET imaging (if available)
194
+ - `bids-organizer` → BIDS validation and organization
195
+ - `brain-visualization` → visualization of derivatives
196
+ - `dependency-planner` → dependency resolution
197
+ - `conda-env-manager` → environment management
198
+ - `claw-shell` → command execution
199
+
200
+ ---
201
+
202
+ ## Reference
203
+ - PPMI: https://www.ppmi-info.org/
204
+ - Marek et al. (2011): The Parkinson Progression Marker Initiative (PPMI). Lancet Neurology.
205
+ - LONI IDA: https://ida.loni.usc.edu/
206
+
207
+ Created At: 2026-05-06 13:55 HKT
208
+ Last Updated At: 2026-05-06 13:55 HKT
209
+ Author: chengwang96