@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,322 @@
1
+ #!/usr/bin/env python3
2
+ """Validate and reorganize AOMIC data into BIDS-compliant directory structure.
3
+
4
+ AOMIC (Amsterdam Open MRI Collection) data is typically already in BIDS format.
5
+ This script validates structure, handles edge cases, and normalizes across
6
+ sub-datasets (ID1000, PIOP1, PIOP2).
7
+ """
8
+ import argparse
9
+ import json
10
+ import os
11
+ import re
12
+ import shutil
13
+ import sys
14
+ from collections import defaultdict
15
+ from pathlib import Path
16
+ from typing import Dict, List, Optional, Tuple
17
+
18
+ # AOMIC task names recognized in BIDS
19
+ AOMIC_TASKS = [
20
+ "rest",
21
+ "emotion",
22
+ "gambling",
23
+ "motor",
24
+ "language",
25
+ "workingmemory",
26
+ "stroop",
27
+ ]
28
+
29
+ SIDECAR_EXTENSIONS = [".json", ".bval", ".bvec", ".tsv", ".txt"]
30
+
31
+
32
+ def validate_subject_id(subject_dir_name: str) -> Optional[str]:
33
+ """Validate and normalize AOMIC subject ID to BIDS label.
34
+
35
+ AOMIC uses sub-XXXX format already.
36
+ """
37
+ name = subject_dir_name.strip()
38
+ if name.startswith("sub-"):
39
+ label = name[4:]
40
+ else:
41
+ label = name
42
+
43
+ # Must be alphanumeric
44
+ clean = re.sub(r"[^a-zA-Z0-9]", "", label)
45
+ if not clean:
46
+ return None
47
+ return f"sub-{clean}"
48
+
49
+
50
+ def detect_task_from_filename(filename: str) -> Optional[str]:
51
+ """Extract BIDS task name from filename."""
52
+ match = re.search(r"task-([a-zA-Z0-9]+)", filename)
53
+ if match:
54
+ return match.group(1).lower()
55
+ return None
56
+
57
+
58
+ def validate_bids_filename(filename: str) -> bool:
59
+ """Check if filename follows BIDS naming conventions."""
60
+ # Must have sub- prefix for subject
61
+ if not re.search(r"sub-[a-zA-Z0-9]+", filename):
62
+ return False
63
+ # Must end with known extensions
64
+ valid_exts = [".nii", ".nii.gz", ".json", ".tsv", ".bval", ".bvec", ".txt", ".eeg", ".vhdr", ".vmrk"]
65
+ return any(filename.endswith(ext) for ext in valid_exts)
66
+
67
+
68
+ def find_nifti_files(directory: Path) -> List[Path]:
69
+ """Find all NIfTI files in a directory."""
70
+ results = []
71
+ for f in sorted(directory.rglob("*")):
72
+ if f.is_file() and (f.name.endswith(".nii") or f.name.endswith(".nii.gz")):
73
+ results.append(f)
74
+ return results
75
+
76
+
77
+ def copy_with_sidecars(src_nifti: Path, dst_dir: Path, dst_stem: str) -> List[Path]:
78
+ """Copy NIfTI file and its sidecar files to destination."""
79
+ dst_dir.mkdir(parents=True, exist_ok=True)
80
+ copied = []
81
+
82
+ ext = ".nii.gz" if src_nifti.name.endswith(".nii.gz") else ".nii"
83
+ dst_nifti = dst_dir / f"{dst_stem}{ext}"
84
+ if not dst_nifti.exists():
85
+ shutil.copy2(str(src_nifti), str(dst_nifti))
86
+ copied.append(dst_nifti)
87
+
88
+ src_stem = src_nifti.name
89
+ if src_stem.endswith(".nii.gz"):
90
+ src_stem = src_stem[:-7]
91
+ elif src_stem.endswith(".nii"):
92
+ src_stem = src_stem[:-4]
93
+
94
+ for sidecar_ext in SIDECAR_EXTENSIONS:
95
+ src_sidecar = src_nifti.parent / f"{src_stem}{sidecar_ext}"
96
+ if src_sidecar.exists():
97
+ dst_sidecar = dst_dir / f"{dst_stem}{sidecar_ext}"
98
+ if not dst_sidecar.exists():
99
+ shutil.copy2(str(src_sidecar), str(dst_sidecar))
100
+ copied.append(dst_sidecar)
101
+
102
+ return copied
103
+
104
+
105
+ def write_dataset_description(bids_root: Path, sub_dataset: str = "AOMIC") -> None:
106
+ """Write BIDS dataset_description.json."""
107
+ desc = {
108
+ "Name": f"Amsterdam Open MRI Collection ({sub_dataset})",
109
+ "BIDSVersion": "1.8.0",
110
+ "DatasetType": "raw",
111
+ "GeneratedBy": [
112
+ {
113
+ "Name": "NeuroClaw aomic-skill",
114
+ "Description": f"AOMIC ({sub_dataset}) data validated and reorganized to BIDS structure",
115
+ "Version": "1.0.0",
116
+ }
117
+ ],
118
+ }
119
+ desc_path = bids_root / "dataset_description.json"
120
+ with open(desc_path, "w", encoding="utf-8") as f:
121
+ json.dump(desc, f, indent=2, ensure_ascii=False)
122
+ print(f"[OK] Wrote {desc_path}")
123
+
124
+
125
+ def write_participants_tsv(bids_root: Path, subject_ids: List[str]) -> None:
126
+ """Write BIDS participants.tsv header."""
127
+ tsv_path = bids_root / "participants.tsv"
128
+ with open(tsv_path, "w", encoding="utf-8") as f:
129
+ f.write("participant_id\n")
130
+ for sid in sorted(set(subject_ids)):
131
+ f.write(f"{sid}\n")
132
+ print(f"[OK] Wrote {tsv_path} ({len(set(subject_ids))} participants)")
133
+
134
+
135
+ def process_aomic_subject(
136
+ subject_dir: Path,
137
+ bids_root: Path,
138
+ sub_label: str,
139
+ dry_run: bool = False,
140
+ copy_mode: bool = False,
141
+ ) -> Tuple[int, int, int]:
142
+ """Process a single AOMIC subject directory.
143
+
144
+ AOMIC data is typically already in BIDS layout. This function validates
145
+ and optionally copies/reorganizes.
146
+
147
+ Returns (converted, skipped, failed).
148
+ """
149
+ converted = 0
150
+ skipped = 0
151
+ failed = 0
152
+
153
+ # Check for standard BIDS subdirectories
154
+ anat_dir = subject_dir / "anat"
155
+ func_dir = subject_dir / "func"
156
+ dwi_dir = subject_dir / "dwi"
157
+
158
+ nifti_files = find_nifti_files(subject_dir)
159
+
160
+ if not nifti_files:
161
+ print(f"[WARN] {sub_label}: no NIfTI files found")
162
+ return 0, 0, 1
163
+
164
+ for nifti in nifti_files:
165
+ # Determine BIDS folder from relative path
166
+ try:
167
+ rel_path = nifti.relative_to(subject_dir)
168
+ except ValueError:
169
+ rel_path = Path(nifti.name)
170
+
171
+ parts = rel_path.parts
172
+ if len(parts) > 1:
173
+ bids_folder = parts[0] # anat, func, dwi
174
+ bids_filename = parts[-1]
175
+ else:
176
+ bids_filename = nifti.name
177
+ # Try to detect folder from filename
178
+ if "T1w" in bids_filename or "T2w" in bids_filename:
179
+ bids_folder = "anat"
180
+ elif "bold" in bids_filename or "task-" in bids_filename:
181
+ bids_folder = "func"
182
+ elif "dwi" in bids_filename:
183
+ bids_folder = "dwi"
184
+ else:
185
+ bids_folder = "anat"
186
+
187
+ # Ensure filename has subject prefix
188
+ if not bids_filename.startswith(sub_label):
189
+ # Try to fix
190
+ bids_filename = f"{sub_label}_{bids_filename.split('_', 1)[-1]}" if "_" in bids_filename else f"{sub_label}_{bids_filename}"
191
+
192
+ dst_dir = bids_root / sub_label / bids_folder
193
+ dst_stem = bids_filename.rsplit(".nii", 1)[0]
194
+ if dst_stem.endswith("."):
195
+ dst_stem = dst_stem[:-1]
196
+
197
+ ext = ".nii.gz" if nifti.name.endswith(".nii.gz") else ".nii"
198
+ if (dst_dir / f"{dst_stem}{ext}").exists():
199
+ skipped += 1
200
+ continue
201
+
202
+ if dry_run:
203
+ print(f"[DRY] {sub_label}/{bids_folder}/{dst_stem}")
204
+ converted += 1
205
+ elif copy_mode:
206
+ copy_with_sidecars(nifti, dst_dir, dst_stem)
207
+ print(f"[OK] {sub_label}/{bids_folder}/{dst_stem}")
208
+ converted += 1
209
+ else:
210
+ # Validation-only mode
211
+ if validate_bids_filename(bids_filename):
212
+ print(f"[VALID] {sub_label}/{bids_folder}/{bids_filename}")
213
+ converted += 1
214
+ else:
215
+ print(f"[WARN] {sub_label}/{bids_folder}/{bids_filename}: non-standard naming")
216
+ failed += 1
217
+
218
+ return converted, skipped, failed
219
+
220
+
221
+ def main() -> int:
222
+ parser = argparse.ArgumentParser(
223
+ description="Validate and reorganize AOMIC data into BIDS-compliant structure."
224
+ )
225
+ parser.add_argument(
226
+ "--input",
227
+ required=True,
228
+ help="Path to AOMIC data directory",
229
+ )
230
+ parser.add_argument(
231
+ "--output",
232
+ required=True,
233
+ help="Path to output BIDS directory",
234
+ )
235
+ parser.add_argument(
236
+ "--sub-dataset",
237
+ default="ID1000",
238
+ choices=["ID1000", "PIOP1", "PIOP2", "all"],
239
+ help="AOMIC sub-dataset (default: ID1000)",
240
+ )
241
+ parser.add_argument(
242
+ "--participants-file",
243
+ help="Optional: path to phenotype file for participant metadata",
244
+ )
245
+ parser.add_argument(
246
+ "--copy",
247
+ action="store_true",
248
+ help="Copy files to output directory (default: validation only)",
249
+ )
250
+ parser.add_argument(
251
+ "--dry-run",
252
+ action="store_true",
253
+ help="Preview without processing files",
254
+ )
255
+ args = parser.parse_args()
256
+
257
+ input_dir = Path(args.input).resolve()
258
+ output_dir = Path(args.output).resolve()
259
+
260
+ if not input_dir.exists() or not input_dir.is_dir():
261
+ print(f"Input directory does not exist: {input_dir}", file=sys.stderr)
262
+ return 1
263
+
264
+ output_dir.mkdir(parents=True, exist_ok=True)
265
+ participants: List[str] = []
266
+
267
+ print(f"Sub-dataset: {args.sub_dataset}")
268
+ print(f"Input: {input_dir}")
269
+ print(f"Output: {output_dir}")
270
+ print(f"Mode: {'DRY RUN' if args.dry_run else 'COPY' if args.copy else 'VALIDATE'}")
271
+ print()
272
+
273
+ # Find subject directories
274
+ subject_dirs = sorted(
275
+ [p for p in input_dir.iterdir() if p.is_dir() and (p.name.startswith("sub-") or re.match(r"^\d+$", p.name))]
276
+ )
277
+
278
+ if not subject_dirs:
279
+ # Try nested structure (e.g., ID1000/sub-0001/)
280
+ for child in sorted(input_dir.iterdir()):
281
+ if child.is_dir():
282
+ nested = sorted(
283
+ [p for p in child.iterdir() if p.is_dir() and (p.name.startswith("sub-") or re.match(r"^\d+$", p.name))]
284
+ )
285
+ subject_dirs.extend(nested)
286
+
287
+ if not subject_dirs:
288
+ print("[ERROR] No subject directories found.", file=sys.stderr)
289
+ return 1
290
+
291
+ print(f"Found {len(subject_dirs)} subject directories\n")
292
+
293
+ total_converted = 0
294
+ total_skipped = 0
295
+ total_failed = 0
296
+
297
+ for subject_dir in subject_dirs:
298
+ sub_label = validate_subject_id(subject_dir.name)
299
+ if not sub_label:
300
+ print(f"[WARN] Skipping invalid directory: {subject_dir.name}")
301
+ total_failed += 1
302
+ continue
303
+
304
+ participants.append(sub_label)
305
+ converted, skipped, failed = process_aomic_subject(
306
+ subject_dir, output_dir, sub_label, args.dry_run, args.copy
307
+ )
308
+ total_converted += converted
309
+ total_skipped += skipped
310
+ total_failed += failed
311
+
312
+ # Write BIDS metadata
313
+ if not args.dry_run and (args.copy or total_converted > 0):
314
+ write_dataset_description(output_dir, args.sub_dataset)
315
+ write_participants_tsv(output_dir, participants)
316
+
317
+ print(f"\nDone. Converted={total_converted}, Skipped={total_skipped}, Failed={total_failed}")
318
+ return 0 if total_failed == 0 else 2
319
+
320
+
321
+ if __name__ == "__main__":
322
+ sys.exit(main())
@@ -0,0 +1,168 @@
1
+ ---
2
+ name: asl-skill
3
+ description: "Use this skill whenever the user wants to process Arterial Spin Labeling (ASL) perfusion MRI data including CBF (cerebral blood flow) quantification, ASL preprocessing (motion correction, partial volume correction, M0 normalization), or ASL-based brain perfusion analysis. Triggers include: 'ASL', 'ASL processing', 'CBF', 'cerebral blood flow', 'perfusion MRI', 'arterial spin labeling', 'pCASL', 'CASL', 'PASL', or any request involving ASL perfusion data."
4
+ license: MIT License (NeuroClaw custom skill – freely modifiable within the project)
5
+ layer: subagent
6
+ skill_type: modality
7
+ dependencies:
8
+ - fsl-tool
9
+ - nibabel-skill
10
+ - claw-shell
11
+ complementary_skills:
12
+ - smri-skill
13
+ - fmri-skill
14
+ ---
15
+ # ASL Skill (Modality Layer)
16
+
17
+ ## Overview
18
+
19
+ `asl-skill` is the NeuroClaw **modality-layer** interface skill responsible for all Arterial Spin Labeling (ASL) perfusion MRI data processing tasks.
20
+
21
+ It strictly follows the NeuroClaw hierarchical design principles:
22
+ - This skill **only describes WHAT needs to be done** and **which tool skill to delegate to**.
23
+ - It contains **no implementation code or concrete commands**.
24
+ - All concrete execution is delegated to existing base/tool skills: `fsl-tool`, `nibabel-skill`, and `claw-shell`.
25
+ - Companion scripts in `scripts/` provide reference implementations for CBF quantification.
26
+
27
+ **Core workflow (never bypassed):**
28
+ 1. Identify input ASL data and labeling strategy (pCASL, CASL, or PASL).
29
+ 2. Ensure T1w structural data is available (via `smri-skill` if not yet processed).
30
+ 3. Generate a **numbered execution plan** clearly stating WHAT needs to be done and which tool skill will handle each step.
31
+ 4. Present the full plan, estimated runtime, resource requirements, and risks to the user and wait for explicit confirmation ("YES" / "execute" / "proceed").
32
+ 5. On confirmation, delegate every step to the appropriate skill via `claw-shell`.
33
+ 6. After execution, save all outputs in a clean directory structure (`asl_output/`).
34
+
35
+ **Research use only.**
36
+
37
+ ---
38
+
39
+ ## Quick Reference (Common ASL Tasks)
40
+
41
+ | Task | What needs to be done | Delegate to which tool skill | Expected output |
42
+ |---|---|---|---|
43
+ | ASL preprocessing | Motion correction, masking, registration to T1w | `fsl-tool` (ASL_PREPCORE) | Preprocessed ASL in T1w space |
44
+ | M0 normalization | Divide ASL difference image by M0 reference image to get perfusion signal | `fsl-tool` or `scripts/compute_cbf.py` | Normalized perfusion map |
45
+ | CBF quantification | Convert perfusion signal to absolute CBF (mL/100g/min) using Buxton model | `scripts/compute_cbf.py` | CBF map (NIfTI) + ROI summary (CSV) |
46
+ | Partial volume correction | Correct CBF for gray/white matter partial volume effects | `fsl-tool` + tissue segmentation | PVC-corrected CBF map |
47
+ | ASL-to-MNI normalization | Warp CBF map to MNI152 template for group analysis | `fsl-tool` (FNIRT) or `smri-skill` | CBF in MNI152 space |
48
+ | ROI-based CBF extraction | Extract mean CBF from atlas-defined ROIs | `fsl-tool` + atlas | Per-region CBF values (CSV) |
49
+ | Quality control | Check for outliers, low SNR, motion artifacts in ASL series | `scripts/compute_cbf.py` (--qc) | QC report |
50
+
51
+ ---
52
+
53
+ ## ASL Labeling Strategies
54
+
55
+ | Strategy | Description | Typical Parameters |
56
+ |---|---|---|
57
+ | **pCASL** (pseudo-Continuous ASL) | Most common; single PLD, good SNR | Label duration: 1.5–2.0 s, PLD: 1.5–2.0 s |
58
+ | **CASL** (Continuous ASL) | Longer labeling, higher SNR but more sensitive to transit effects | Label duration: 2–4 s, PLD: 1–2 s |
59
+ | **PASL** (Pulsed ASL) | Short labeling, lower SNR, no separate M0 needed (QUIPSS II) | Bolus thickness: 10–15 cm, TI1/TI2: 700/1800 ms |
60
+
61
+ ---
62
+
63
+ ## Core CBF Quantification Model
64
+
65
+ The Buxton single-compartment model for pCASL:
66
+
67
+ ```
68
+ CBF = (6000 * ΔM * λ) / (2 * α * M0 * T1b * (exp(-w/T1b) - exp(-(τ+w)/T1b))) [mL/100g/min]
69
+ ```
70
+
71
+ Where:
72
+ - ΔM = ASL difference image (control - label)
73
+ - M0 = equilibrium magnetization of arterial blood
74
+ - λ = blood-tissue water partition coefficient (0.9 mL/g)
75
+ - α = labeling efficiency (0.85 for pCASL, 0.95 for CASL, 0.98 for PASL)
76
+ - T1b = T1 of arterial blood at 3T (~1.65 s) or 1.5T (~1.35 s)
77
+ - w = post-labeling delay (PLD)
78
+ - τ = label duration
79
+
80
+ ---
81
+
82
+ ## Scripts
83
+
84
+ ### `scripts/compute_cbf.py`
85
+ Computes CBF maps from ASL difference images and M0 reference.
86
+
87
+ ```bash
88
+ python skills/asl-skill/scripts/compute_cbf.py \
89
+ --diff /path/to/asl_diff.nii.gz \
90
+ --m0 /path/to/m0_reference.nii.gz \
91
+ --output /path/to/asl_output/cbf_map.nii.gz \
92
+ --roi-summary /path/to/asl_output/cbf_roi.csv \
93
+ --roi-atlas /path/to/atlas_in_asl_space.nii.gz \
94
+ --label-strategy pcasl \
95
+ --pld 1.8 \
96
+ --label-duration 1.8 \
97
+ --field-strength 3.0
98
+ ```
99
+
100
+ ---
101
+
102
+ ## Standard Output Layout
103
+
104
+ ```
105
+ asl_output/
106
+ ├── preprocessed/ # Motion-corrected, registered ASL
107
+ ├── cbf/ # CBF maps
108
+ │ ├── cbf_map.nii.gz
109
+ │ ├── cbf_roi.csv
110
+ │ └── cbf_mni.nii.gz # (if normalization requested)
111
+ ├── pvc/ # Partial volume corrected CBF (if requested)
112
+ ├── qc/ # Quality control reports
113
+ │ └── asl_qc_report.csv
114
+ └── logs/
115
+ ```
116
+
117
+ ---
118
+
119
+ ## Installation (Handled by dependency-planner)
120
+
121
+ No manual installation required at this layer.
122
+ When first used, `asl-skill` automatically calls `dependency-planner` to ensure `fsl-tool`, `nibabel-skill`, and `claw-shell` are ready.
123
+
124
+ ---
125
+
126
+ ## Important Notes & Limitations
127
+
128
+ - ASL has inherently low SNR compared to BOLD fMRI; averaging multiple control-label pairs is recommended.
129
+ - M0 image is required for absolute CBF quantification; if absent, only relative CBF can be computed.
130
+ - PLD and labeling duration must be known from the acquisition protocol; incorrect values invalidate CBF.
131
+ - At 3T, T1b ≈ 1.65 s; at 1.5T, T1b ≈ 1.35 s.
132
+ - Partial volume correction is important for ASL due to its low resolution (~3–4 mm).
133
+ - ASLPrep (https://aslprep.readthedocs.io/) is the recommended automated pipeline for large cohorts.
134
+ - This skill is for research workflows; not for clinical decision-making.
135
+
136
+ ---
137
+
138
+ ## When to Call This Skill
139
+
140
+ - After `smri-skill` when T1w structural preprocessing is complete and ASL data needs processing.
141
+ - When the user needs CBF quantification from pCASL, CASL, or PASL data.
142
+ - When ASL-to-T1w coregistration or normalization to MNI space is required.
143
+ - When partial volume correction is requested for ASL perfusion analysis.
144
+ - When dataset skills (e.g., PNC) delegate ASL processing.
145
+
146
+ ---
147
+
148
+ ## Complementary / Related Skills
149
+
150
+ - `smri-skill` → T1w structural preprocessing (brain extraction, tissue segmentation for PVC)
151
+ - `fmri-skill` → if ASL is used alongside BOLD for multimodal analysis
152
+ - `fsl-tool` → ASL_PREPCORE (preprocessing), FLIRT/FNIRT (registration/normalization), BASIL (CBF quantification)
153
+ - `nibabel-skill` → NIfTI I/O for mask manipulation
154
+ - `nilearn-tool` → ROI-based CBF extraction
155
+ - `brain-visualization` → CBF map visualization
156
+
157
+ ---
158
+
159
+ ## Reference
160
+ - Alsop et al. (2015): Recommended implementation of ASL (Magnetic Resonance in Medicine)
161
+ - Buxton et al. (1998): General kinetic model for ASL (Journal of Cerebral Blood Flow & Metabolism)
162
+ - ASLPrep: https://aslprep.readthedocs.io/
163
+ - FSL BASIL: https://fsl.fmrib.ox.ac.uk/fsl/fslwiki/BASIL
164
+ - BIDS ASL extension: https://bids-specification.readthedocs.io/en/stable/04-modality-specific-files/11-arterial-spin-labeling.html
165
+
166
+ Created At: 2026-05-06 12:19 HKT
167
+ Last Updated At: 2026-05-06 12:19 HKT
168
+ Author: chengwang96