@brainpilot/skills 0.0.6 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (285) hide show
  1. package/package.json +2 -2
  2. package/skills/01_Meta-Skills/academic-research-hub/SKILL.md +108 -0
  3. package/skills/01_Meta-Skills/academic-research-hub/scripts/requirements.txt +17 -0
  4. package/skills/01_Meta-Skills/academic-research-hub/scripts/research.py +781 -0
  5. package/skills/01_Meta-Skills/beautiful-log/SKILL.md +64 -0
  6. package/skills/01_Meta-Skills/beautiful-log/scripts/beautiful_log.py +274 -0
  7. package/skills/01_Meta-Skills/ethoclaw-daily-paper/SKILL.md +130 -0
  8. package/skills/01_Meta-Skills/ethoclaw-daily-paper/assets/config.template.yaml +54 -0
  9. package/skills/01_Meta-Skills/ethoclaw-daily-paper/assets/top5_digest_template.md +5 -0
  10. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/build_top5_digest.py +300 -0
  11. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/common.py +137 -0
  12. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/merge_results.py +106 -0
  13. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/run_pipeline.py +177 -0
  14. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/search_arxiv.py +162 -0
  15. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/search_pubmed.py +202 -0
  16. package/skills/01_Meta-Skills/ethoclaw-normalize-tabular/SKILL.md +173 -0
  17. package/skills/01_Meta-Skills/ethoclaw-normalize-tabular/scripts/normalize_data.py +874 -0
  18. package/skills/01_Meta-Skills/ethoclaw-pdf-research/SKILL.md +134 -0
  19. package/skills/01_Meta-Skills/ethoclaw-pdf-research/references/confirmation-prompts.md +31 -0
  20. package/skills/01_Meta-Skills/ethoclaw-pdf-research/references/output-patterns.md +45 -0
  21. package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/build_markdown_deliverables.py +41 -0
  22. package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/build_research_log.py +84 -0
  23. package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/build_summary_md.py +63 -0
  24. package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/extract_pdf_bundle.py +140 -0
  25. package/skills/01_Meta-Skills/experiment-controller/SKILL.md +140 -0
  26. package/skills/01_Meta-Skills/knowledge-graph-builder/SKILL.md +366 -0
  27. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/entity_resolution.py +120 -0
  28. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/extraction_prompt_template.txt +19 -0
  29. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/graph_query.py +106 -0
  30. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/hypothesis_cli_reference.py +42 -0
  31. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/new_data_source_template.py +116 -0
  32. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/requirements.txt +15 -0
  33. package/skills/01_Meta-Skills/method-design/SKILL.md +61 -0
  34. package/skills/01_Meta-Skills/multi-search-engine/SKILL.md +119 -0
  35. package/skills/01_Meta-Skills/research-idea/SKILL.md +65 -0
  36. package/skills/05_EEG_ERP/eeg-skill/SKILL.md +197 -0
  37. package/skills/05_EEG_ERP/meg-skill/SKILL.md +188 -0
  38. package/skills/05_EEG_ERP/meg-skill/scripts/time_frequency.py +223 -0
  39. package/skills/05_EEG_ERP/mne-eeg-tool/SKILL.md +165 -0
  40. package/skills/05_EEG_ERP/mne-eeg-tool/scripts/eeg_pipeline_reference.py +231 -0
  41. package/skills/05_EEG_ERP/seed-iv-skill/SKILL.md +184 -0
  42. package/skills/05_EEG_ERP/seed-iv-skill/scripts/classify_seed_iv.py +154 -0
  43. package/skills/05_EEG_ERP/seed-iv-skill/scripts/extract_seed_iv_features.py +190 -0
  44. package/skills/05_EEG_ERP/seed-iv-skill/scripts/validate_seed_iv.py +102 -0
  45. package/skills/05_EEG_ERP/seed-vig-skill/SKILL.md +182 -0
  46. package/skills/05_EEG_ERP/seed-vig-skill/scripts/classify_seed_vig.py +165 -0
  47. package/skills/05_EEG_ERP/seed-vig-skill/scripts/extract_seed_vig_features.py +185 -0
  48. package/skills/05_EEG_ERP/seed-vig-skill/scripts/validate_seed_vig.py +88 -0
  49. package/skills/06_fMRI_Neuroimaging/abcd-skill/SKILL.md +308 -0
  50. package/skills/06_fMRI_Neuroimaging/abcd-skill/scripts/abcd_qc_summary.py +449 -0
  51. package/skills/06_fMRI_Neuroimaging/abcd-skill/scripts/extract_abcd_phenotype.py +292 -0
  52. package/skills/06_fMRI_Neuroimaging/abcd-skill/scripts/reorganize_abcd.py +387 -0
  53. package/skills/06_fMRI_Neuroimaging/abide-skill/SKILL.md +302 -0
  54. package/skills/06_fMRI_Neuroimaging/abide-skill/scripts/abide_qc_summary.py +317 -0
  55. package/skills/06_fMRI_Neuroimaging/abide-skill/scripts/extract_abide_phenotype.py +267 -0
  56. package/skills/06_fMRI_Neuroimaging/abide-skill/scripts/reorganize_abide.py +387 -0
  57. package/skills/06_fMRI_Neuroimaging/adhd200-skill/SKILL.md +244 -0
  58. package/skills/06_fMRI_Neuroimaging/adhd200-skill/scripts/adhd200_qc_summary.py +98 -0
  59. package/skills/06_fMRI_Neuroimaging/adhd200-skill/scripts/extract_adhd200_phenotype.py +134 -0
  60. package/skills/06_fMRI_Neuroimaging/adhd200-skill/scripts/reorganize_adhd200.py +206 -0
  61. package/skills/06_fMRI_Neuroimaging/adni-skill/SKILL.md +358 -0
  62. package/skills/06_fMRI_Neuroimaging/adni-skill/scripts/generate_adni_task_files.py +1305 -0
  63. package/skills/06_fMRI_Neuroimaging/adni-skill/scripts/generate_vqa_from_tasks.py +766 -0
  64. package/skills/06_fMRI_Neuroimaging/adni-skill/scripts/reorganize_adni.py +491 -0
  65. package/skills/06_fMRI_Neuroimaging/aibl-skill/SKILL.md +295 -0
  66. package/skills/06_fMRI_Neuroimaging/aibl-skill/scripts/aibl_qc_summary.py +260 -0
  67. package/skills/06_fMRI_Neuroimaging/aibl-skill/scripts/extract_aibl_phenotype.py +365 -0
  68. package/skills/06_fMRI_Neuroimaging/aibl-skill/scripts/reorganize_aibl.py +394 -0
  69. package/skills/06_fMRI_Neuroimaging/aomic-skill/SKILL.md +292 -0
  70. package/skills/06_fMRI_Neuroimaging/aomic-skill/scripts/aomic_qc_summary.py +258 -0
  71. package/skills/06_fMRI_Neuroimaging/aomic-skill/scripts/extract_aomic_phenotype.py +284 -0
  72. package/skills/06_fMRI_Neuroimaging/aomic-skill/scripts/reorganize_aomic.py +322 -0
  73. package/skills/06_fMRI_Neuroimaging/asl-skill/SKILL.md +168 -0
  74. package/skills/06_fMRI_Neuroimaging/asl-skill/scripts/compute_cbf.py +224 -0
  75. package/skills/06_fMRI_Neuroimaging/bids-organizer/SKILL.md +241 -0
  76. package/skills/06_fMRI_Neuroimaging/bold5000-skill/SKILL.md +186 -0
  77. package/skills/06_fMRI_Neuroimaging/bold5000-skill/scripts/bold5000_qc_summary.py +96 -0
  78. package/skills/06_fMRI_Neuroimaging/bold5000-skill/scripts/extract_bold5000_stimulus.py +125 -0
  79. package/skills/06_fMRI_Neuroimaging/bold5000-skill/scripts/reorganize_bold5000.py +102 -0
  80. package/skills/06_fMRI_Neuroimaging/camcan-skill/SKILL.md +213 -0
  81. package/skills/06_fMRI_Neuroimaging/camcan-skill/scripts/camcan_qc_summary.py +131 -0
  82. package/skills/06_fMRI_Neuroimaging/camcan-skill/scripts/extract_camcan_phenotype.py +145 -0
  83. package/skills/06_fMRI_Neuroimaging/camcan-skill/scripts/validate_camcan.py +141 -0
  84. package/skills/06_fMRI_Neuroimaging/cobre-skill/SKILL.md +201 -0
  85. package/skills/06_fMRI_Neuroimaging/cobre-skill/scripts/cobre_qc_summary.py +95 -0
  86. package/skills/06_fMRI_Neuroimaging/cobre-skill/scripts/extract_cobre_phenotype.py +104 -0
  87. package/skills/06_fMRI_Neuroimaging/cobre-skill/scripts/reorganize_cobre.py +140 -0
  88. package/skills/06_fMRI_Neuroimaging/conn-tool/SKILL.md +180 -0
  89. package/skills/06_fMRI_Neuroimaging/dcm2nii/SKILL.md +189 -0
  90. package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/SKILL.md +183 -0
  91. package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/scripts/dmt_har_med_qc_summary.py +96 -0
  92. package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/scripts/extract_dmt_har_med_phenotype.py +121 -0
  93. package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/scripts/reorganize_dmt_har_med.py +125 -0
  94. package/skills/06_fMRI_Neuroimaging/dwi-skill/SKILL.md +359 -0
  95. package/skills/06_fMRI_Neuroimaging/fmri-skill/SKILL.md +371 -0
  96. package/skills/06_fMRI_Neuroimaging/fmriprep-tool/SKILL.md +228 -0
  97. package/skills/06_fMRI_Neuroimaging/freesurfer-tool/SKILL.md +286 -0
  98. package/skills/06_fMRI_Neuroimaging/freesurfer-tool/scripts/freesurfer_processor.py +145 -0
  99. package/skills/06_fMRI_Neuroimaging/fsl-tool/SKILL.md +208 -0
  100. package/skills/06_fMRI_Neuroimaging/hbn-skill/SKILL.md +271 -0
  101. package/skills/06_fMRI_Neuroimaging/hbn-skill/scripts/extract_hbn_phenotype.py +107 -0
  102. package/skills/06_fMRI_Neuroimaging/hbn-skill/scripts/hbn_qc_summary.py +96 -0
  103. package/skills/06_fMRI_Neuroimaging/hbn-skill/scripts/reorganize_hbn.py +150 -0
  104. package/skills/06_fMRI_Neuroimaging/hcpa-skill/SKILL.md +210 -0
  105. package/skills/06_fMRI_Neuroimaging/hcpa-skill/scripts/extract_hcpa_phenotype.py +146 -0
  106. package/skills/06_fMRI_Neuroimaging/hcpa-skill/scripts/hcpa_qc_summary.py +120 -0
  107. package/skills/06_fMRI_Neuroimaging/hcpa-skill/scripts/reorganize_hcpa.py +155 -0
  108. package/skills/06_fMRI_Neuroimaging/hcpd-skill/SKILL.md +210 -0
  109. package/skills/06_fMRI_Neuroimaging/hcpd-skill/scripts/extract_hcpd_phenotype.py +148 -0
  110. package/skills/06_fMRI_Neuroimaging/hcpd-skill/scripts/hcpd_qc_summary.py +125 -0
  111. package/skills/06_fMRI_Neuroimaging/hcpd-skill/scripts/reorganize_hcpd.py +146 -0
  112. package/skills/06_fMRI_Neuroimaging/hcpep-skill/SKILL.md +215 -0
  113. package/skills/06_fMRI_Neuroimaging/hcpep-skill/scripts/extract_hcpep_phenotype.py +157 -0
  114. package/skills/06_fMRI_Neuroimaging/hcpep-skill/scripts/hcpep_qc_summary.py +143 -0
  115. package/skills/06_fMRI_Neuroimaging/hcpep-skill/scripts/reorganize_hcpep.py +146 -0
  116. package/skills/06_fMRI_Neuroimaging/hcppipeline-tool/SKILL.md +217 -0
  117. package/skills/06_fMRI_Neuroimaging/hcpya-skill/SKILL.md +214 -0
  118. package/skills/06_fMRI_Neuroimaging/hcpya-skill/scripts/extract_hcpya_phenotype.py +190 -0
  119. package/skills/06_fMRI_Neuroimaging/hcpya-skill/scripts/hcpya_qc_summary.py +152 -0
  120. package/skills/06_fMRI_Neuroimaging/hcpya-skill/scripts/reorganize_hcpya.py +203 -0
  121. package/skills/06_fMRI_Neuroimaging/ixi-skill/SKILL.md +198 -0
  122. package/skills/06_fMRI_Neuroimaging/ixi-skill/scripts/ixi_qc_summary.py +137 -0
  123. package/skills/06_fMRI_Neuroimaging/ixi-skill/scripts/reorganize_ixi.py +190 -0
  124. package/skills/06_fMRI_Neuroimaging/mnd-skill/SKILL.md +191 -0
  125. package/skills/06_fMRI_Neuroimaging/mnd-skill/scripts/extract_mnd_phenotype.py +143 -0
  126. package/skills/06_fMRI_Neuroimaging/mnd-skill/scripts/mnd_qc_summary.py +120 -0
  127. package/skills/06_fMRI_Neuroimaging/mnd-skill/scripts/validate_mnd.py +107 -0
  128. package/skills/06_fMRI_Neuroimaging/mschallenge-skill/SKILL.md +203 -0
  129. package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/analyze_lesions.py +119 -0
  130. package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/longitudinal_lesion.py +148 -0
  131. package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/mschallenge_qc_summary.py +132 -0
  132. package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/validate_mschallenge.py +116 -0
  133. package/skills/06_fMRI_Neuroimaging/nibabel-skill/SKILL.md +184 -0
  134. package/skills/06_fMRI_Neuroimaging/nibabel-skill/scripts/atlas_coordinate_reference.py +61 -0
  135. package/skills/06_fMRI_Neuroimaging/nibabel-skill/scripts/freesurfer_io_reference.py +34 -0
  136. package/skills/06_fMRI_Neuroimaging/nibabel-skill/scripts/nifti_inspection_reference.py +35 -0
  137. package/skills/06_fMRI_Neuroimaging/nifd-skill/SKILL.md +205 -0
  138. package/skills/06_fMRI_Neuroimaging/nifd-skill/scripts/extract_nifd_phenotype.py +132 -0
  139. package/skills/06_fMRI_Neuroimaging/nifd-skill/scripts/nifd_qc_summary.py +111 -0
  140. package/skills/06_fMRI_Neuroimaging/nifd-skill/scripts/validate_nifd.py +111 -0
  141. package/skills/06_fMRI_Neuroimaging/nii2dcm/SKILL.md +143 -0
  142. package/skills/06_fMRI_Neuroimaging/nilearn-tool/SKILL.md +266 -0
  143. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/connectome_reference.py +65 -0
  144. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/denoise_timeseries_reference.py +58 -0
  145. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/hierarchical_parcellation_reference.py +53 -0
  146. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/kmeans_parcellation_reference.py +53 -0
  147. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/preprocess_bold_reference.py +76 -0
  148. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/rest_dictlearning_reference.py +56 -0
  149. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/rest_ica_reference.py +59 -0
  150. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/second_level_glm_reference.py +58 -0
  151. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/spacenet_classifier_reference.py +59 -0
  152. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/svm_classifier_reference.py +60 -0
  153. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/task_glm_reference.py +63 -0
  154. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/zalff_summary_reference.py +109 -0
  155. package/skills/06_fMRI_Neuroimaging/nsd-skill/SKILL.md +210 -0
  156. package/skills/06_fMRI_Neuroimaging/nsd-skill/scripts/extract_nsd_stimulus.py +171 -0
  157. package/skills/06_fMRI_Neuroimaging/nsd-skill/scripts/nsd_qc_summary.py +142 -0
  158. package/skills/06_fMRI_Neuroimaging/nsd-skill/scripts/validate_nsd.py +142 -0
  159. package/skills/06_fMRI_Neuroimaging/oasis-skill/SKILL.md +205 -0
  160. package/skills/06_fMRI_Neuroimaging/oasis-skill/scripts/extract_oasis_phenotype.py +126 -0
  161. package/skills/06_fMRI_Neuroimaging/oasis-skill/scripts/oasis_qc_summary.py +115 -0
  162. package/skills/06_fMRI_Neuroimaging/oasis-skill/scripts/validate_oasis.py +119 -0
  163. package/skills/06_fMRI_Neuroimaging/pet-skill/SKILL.md +173 -0
  164. package/skills/06_fMRI_Neuroimaging/pet-skill/scripts/compute_suvr.py +202 -0
  165. package/skills/06_fMRI_Neuroimaging/pnc-skill/SKILL.md +206 -0
  166. package/skills/06_fMRI_Neuroimaging/pnc-skill/scripts/extract_pnc_phenotype.py +136 -0
  167. package/skills/06_fMRI_Neuroimaging/pnc-skill/scripts/pnc_qc_summary.py +116 -0
  168. package/skills/06_fMRI_Neuroimaging/pnc-skill/scripts/validate_pnc.py +120 -0
  169. package/skills/06_fMRI_Neuroimaging/ppmi-skill/SKILL.md +209 -0
  170. package/skills/06_fMRI_Neuroimaging/ppmi-skill/scripts/extract_ppmi_phenotype.py +138 -0
  171. package/skills/06_fMRI_Neuroimaging/ppmi-skill/scripts/ppmi_qc_summary.py +111 -0
  172. package/skills/06_fMRI_Neuroimaging/ppmi-skill/scripts/validate_ppmi.py +117 -0
  173. package/skills/06_fMRI_Neuroimaging/qsiprep-tool/SKILL.md +320 -0
  174. package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/SKILL.md +215 -0
  175. package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/extract_rest_mdd_phenotype.py +132 -0
  176. package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/harmonize_sites.py +152 -0
  177. package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/rest_mdd_qc_summary.py +124 -0
  178. package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/validate_rest_mdd.py +103 -0
  179. package/skills/06_fMRI_Neuroimaging/smri-skill/SKILL.md +302 -0
  180. package/skills/06_fMRI_Neuroimaging/tcp-skill/SKILL.md +204 -0
  181. package/skills/06_fMRI_Neuroimaging/tcp-skill/scripts/extract_tcp_phenotype.py +139 -0
  182. package/skills/06_fMRI_Neuroimaging/tcp-skill/scripts/tcp_qc_summary.py +111 -0
  183. package/skills/06_fMRI_Neuroimaging/tcp-skill/scripts/validate_tcp.py +99 -0
  184. package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/SKILL.md +217 -0
  185. package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/scripts/extract_ucla_cnp_phenotype.py +145 -0
  186. package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/scripts/ucla_cnp_qc_summary.py +111 -0
  187. package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/scripts/validate_ucla_cnp.py +113 -0
  188. package/skills/06_fMRI_Neuroimaging/ukb-skill/SKILL.md +310 -0
  189. package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/build_ukb_survival.py +210 -0
  190. package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/extract_ukb_cases.py +308 -0
  191. package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/extract_ukb_phenotype.py +232 -0
  192. package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/ukb_qc_summary.py +158 -0
  193. package/skills/06_fMRI_Neuroimaging/wmh-segmentation/SKILL.md +133 -0
  194. package/skills/07_Computational_Modeling/detrending/SKILL.md +118 -0
  195. package/skills/07_Computational_Modeling/dictlearning/SKILL.md +122 -0
  196. package/skills/07_Computational_Modeling/filtering/SKILL.md +121 -0
  197. package/skills/07_Computational_Modeling/glm/SKILL.md +153 -0
  198. package/skills/07_Computational_Modeling/hierarchical/SKILL.md +121 -0
  199. package/skills/07_Computational_Modeling/ica/SKILL.md +122 -0
  200. package/skills/07_Computational_Modeling/kmeans/SKILL.md +119 -0
  201. package/skills/07_Computational_Modeling/run_models/SKILL.md +427 -0
  202. package/skills/07_Computational_Modeling/spacenet/SKILL.md +122 -0
  203. package/skills/07_Computational_Modeling/svm/SKILL.md +120 -0
  204. package/skills/08_Computational_Neuroscience/brain_gnn/SKILL.md +183 -0
  205. package/skills/08_Computational_Neuroscience/dipy-tool/SKILL.md +239 -0
  206. package/skills/08_Computational_Neuroscience/dipy-tool/scripts/dti_metrics_reference.py +70 -0
  207. package/skills/08_Computational_Neuroscience/dipy-tool/scripts/load_and_mask_reference.py +76 -0
  208. package/skills/08_Computational_Neuroscience/dipy-tool/scripts/roi_stats_reference.py +59 -0
  209. package/skills/08_Computational_Neuroscience/fm_app/SKILL.md +195 -0
  210. package/skills/08_Computational_Neuroscience/neurostorm/SKILL.md +151 -0
  211. package/skills/13_Visualization/brain-visualization/SKILL.md +191 -0
  212. package/skills/13_Visualization/brain-visualization/scripts/connectome_reference.py +108 -0
  213. package/skills/13_Visualization/brain-visualization/scripts/freesurfer_ply_reference.py +54 -0
  214. package/skills/13_Visualization/brain-visualization/scripts/zalff_summary_reference.py +116 -0
  215. package/skills/13_Visualization/ethoclaw-paper-figure-layout/SKILL.md +78 -0
  216. package/skills/13_Visualization/ethoclaw-paper-figure-layout/assets/naturecomm_figures.tex +74 -0
  217. package/skills/13_Visualization/ethoclaw-paper-figure-layout/scripts/layout_results_foldered.py +579 -0
  218. package/skills/14_Writing/overleaf-skill/SKILL.md +184 -0
  219. package/skills/14_Writing/overleaf-skill/scripts/install.sh +30 -0
  220. package/skills/14_Writing/paper-writing/SKILL.md +146 -0
  221. package/skills/14_Writing/paper-writing/scripts/data_statement_templates.py +164 -0
  222. package/skills/14_Writing/paper-writing/scripts/figure_templates.py +315 -0
  223. package/skills/14_Writing/paper-writing/scripts/nature_figure_style.py +214 -0
  224. package/skills/14_Writing/paper-writing/scripts/section_phrasebank.py +246 -0
  225. package/skills/16_Animal_Behavior/deeplabcut/SKILL.md +154 -0
  226. package/skills/16_Animal_Behavior/deeplabcut/references/3d-pose.md +89 -0
  227. package/skills/16_Animal_Behavior/deeplabcut/references/maDLC.md +123 -0
  228. package/skills/16_Animal_Behavior/deeplabcut/references/modelzoo.md +98 -0
  229. package/skills/16_Animal_Behavior/deeplabcut/references/standard-pipeline.md +165 -0
  230. package/skills/16_Animal_Behavior/deeplabcut/references/utilities.md +146 -0
  231. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/SKILL.md +274 -0
  232. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/report_template_en.html +112 -0
  233. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/report_template_en.md +21 -0
  234. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/cluster-section.md +5 -0
  235. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/heatmap-section.md +5 -0
  236. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/integrated-interpretation.md +3 -0
  237. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/overview.md +3 -0
  238. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/project-summary.md +3 -0
  239. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/radar-section.md +5 -0
  240. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/raw-trajectory.md +3 -0
  241. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/sample-check.md +3 -0
  242. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/single-subject-section.md +3 -0
  243. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/stats-section.md +5 -0
  244. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/epm.md +52 -0
  245. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/fst.md +37 -0
  246. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/nor.md +39 -0
  247. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/oft.md +43 -0
  248. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/tcst.md +45 -0
  249. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/tst.md +36 -0
  250. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/input-types.md +59 -0
  251. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/interpretation-guardrails.md +45 -0
  252. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/metadata-schema.md +57 -0
  253. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/report-sections.md +86 -0
  254. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/section-selection-rules.md +169 -0
  255. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/scripts/build_report_manifest.py +27 -0
  256. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/scripts/render_report.py +34 -0
  257. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/scripts/report_utils.py +1121 -0
  258. package/skills/16_Animal_Behavior/ethoclaw-animal-grounding/SKILL.md +390 -0
  259. package/skills/16_Animal_Behavior/ethoclaw-animal-grounding/reference_code.py +98 -0
  260. package/skills/16_Animal_Behavior/ethoclaw-animal-pose-estimation/SKILL.md +336 -0
  261. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/README.md +21 -0
  262. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/SKILL.md +41 -0
  263. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/batch_kinematic_generator.py +663 -0
  264. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/config.json +19 -0
  265. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/generate_kinematic_parameter.py +401 -0
  266. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/kinematic_generator.py +265 -0
  267. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/SKILL.md +72 -0
  268. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/references/config.example.toml +56 -0
  269. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/scripts/cluster_all_params.py +232 -0
  270. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/scripts/cluster_all_params_from_config.py +236 -0
  271. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-radar-generate/SKILL.md +68 -0
  272. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-radar-generate/references/notes.md +5 -0
  273. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-radar-generate/scripts/plot_h5_radar.py +513 -0
  274. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/SKILL.md +52 -0
  275. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/config.toml +81 -0
  276. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/references/stats-rule.md +18 -0
  277. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/scripts/h5_inspect.py +79 -0
  278. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/scripts/h5_violin_batch.py +624 -0
  279. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/scripts/h5_violin_stats.py +438 -0
  280. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/SKILL.md +280 -0
  281. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/core_scripts/heatmap_trajectory.py +790 -0
  282. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/core_scripts/heatmap_velocity.py +855 -0
  283. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/reference_data/reference_2d.csv +101 -0
  284. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/reference_data/reference_2d.h5 +0 -0
  285. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/reference_data/reference_data_readme.md +126 -0
@@ -0,0 +1,76 @@
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+ from pathlib import Path
5
+
6
+ import nibabel as nib
7
+ import numpy as np
8
+ from nilearn.datasets import load_mni152_template
9
+ from nilearn.image import resample_to_img, smooth_img
10
+ from scipy.signal import butter, filtfilt
11
+
12
+
13
+ def drop_dummies(image: nib.spatialimages.SpatialImage, n_dummies: int) -> nib.Nifti1Image:
14
+ data = image.get_fdata()[..., n_dummies:]
15
+ return nib.Nifti1Image(data, image.affine, image.header)
16
+
17
+
18
+ def bandpass_filter(image: nib.spatialimages.SpatialImage, tr: float, high_pass: float, low_pass: float) -> nib.Nifti1Image:
19
+ data = image.get_fdata()
20
+ n_timepoints = data.shape[3]
21
+ nyquist = 0.5 / tr
22
+ b_coef, a_coef = butter(2, [high_pass / nyquist, low_pass / nyquist], btype="band")
23
+
24
+ flat = data.reshape(-1, n_timepoints)
25
+ mask = np.std(flat, axis=1) > 0
26
+ result = flat.copy()
27
+ result[mask] = filtfilt(b_coef, a_coef, flat[mask], axis=1)
28
+ return nib.Nifti1Image(result.reshape(data.shape), image.affine, image.header)
29
+
30
+
31
+ def preprocess_bold(
32
+ bold_path: Path,
33
+ output_path: Path,
34
+ tr: float,
35
+ fwhm: float,
36
+ high_pass: float,
37
+ low_pass: float,
38
+ n_dummies: int,
39
+ ) -> None:
40
+ image = nib.load(str(bold_path))
41
+ processed = drop_dummies(image, n_dummies=n_dummies)
42
+ processed = smooth_img(processed, fwhm=fwhm)
43
+ processed = bandpass_filter(processed, tr=tr, high_pass=high_pass, low_pass=low_pass)
44
+
45
+ template = load_mni152_template(resolution=2)
46
+ processed = resample_to_img(processed, template, interpolation="linear")
47
+
48
+ output_path.parent.mkdir(parents=True, exist_ok=True)
49
+ nib.save(processed, str(output_path))
50
+
51
+
52
+ def main() -> None:
53
+ parser = argparse.ArgumentParser(description="Reference Nilearn preprocessing snippet for resting-state BOLD.")
54
+ parser.add_argument("--bold", type=Path, required=True, help="Input 4D BOLD NIfTI.")
55
+ parser.add_argument("--output", type=Path, required=True, help="Output preprocessed BOLD NIfTI.")
56
+ parser.add_argument("--tr", type=float, default=1.0, help="Repetition time in seconds.")
57
+ parser.add_argument("--fwhm", type=float, default=6.0, help="Smoothing kernel FWHM in mm.")
58
+ parser.add_argument("--high-pass", type=float, default=0.01, help="High-pass frequency in Hz.")
59
+ parser.add_argument("--low-pass", type=float, default=0.10, help="Low-pass frequency in Hz.")
60
+ parser.add_argument("--n-dummies", type=int, default=5, help="Number of initial dummy scans to drop.")
61
+ args = parser.parse_args()
62
+
63
+ preprocess_bold(
64
+ bold_path=args.bold,
65
+ output_path=args.output,
66
+ tr=args.tr,
67
+ fwhm=args.fwhm,
68
+ high_pass=args.high_pass,
69
+ low_pass=args.low_pass,
70
+ n_dummies=args.n_dummies,
71
+ )
72
+ print(f"Saved preprocessed BOLD to: {args.output}")
73
+
74
+
75
+ if __name__ == "__main__":
76
+ main()
@@ -0,0 +1,56 @@
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+ from pathlib import Path
5
+
6
+ import nibabel as nib
7
+ import pandas as pd
8
+ from nilearn.decomposition import DictLearning
9
+
10
+
11
+ def load_image_list(list_path: Path) -> list[str]:
12
+ with list_path.open("r", encoding="utf-8") as handle:
13
+ return [line.strip() for line in handle if line.strip()]
14
+
15
+
16
+ def run_dictlearning(input_list: Path, output_dir: Path, n_components: int, mask_path: Path | None = None) -> None:
17
+ output_dir.mkdir(parents=True, exist_ok=True)
18
+ images = load_image_list(input_list)
19
+
20
+ model = DictLearning(
21
+ n_components=n_components,
22
+ mask=mask_path,
23
+ random_state=0,
24
+ memory="nilearn_cache",
25
+ memory_level=1,
26
+ )
27
+ model.fit(images)
28
+
29
+ nib.save(model.components_img_, str(output_dir / "components.nii.gz"))
30
+
31
+ frames = []
32
+ for index, image_path in enumerate(images):
33
+ series = model.transform(image_path)
34
+ frame = pd.DataFrame(series)
35
+ frame.insert(0, "subject_index", index)
36
+ frame.to_csv(output_dir / f"subject_{index:03d}_timeseries.csv", index=False)
37
+ frames.append(frame)
38
+
39
+ if frames:
40
+ pd.concat(frames, ignore_index=True).to_csv(output_dir / "all_subject_timeseries.csv", index=False)
41
+
42
+
43
+ def main() -> None:
44
+ parser = argparse.ArgumentParser(description="Reference Nilearn snippet for resting-state DictLearning.")
45
+ parser.add_argument("--input-list", type=Path, required=True, help="Text file listing preprocessed resting-state BOLD images.")
46
+ parser.add_argument("--output-dir", type=Path, required=True, help="Directory for DictLearning outputs.")
47
+ parser.add_argument("--n-components", type=int, default=20, help="Number of dictionary components.")
48
+ parser.add_argument("--mask", type=Path, default=None, help="Optional mask image.")
49
+ args = parser.parse_args()
50
+
51
+ run_dictlearning(args.input_list, args.output_dir, args.n_components, args.mask)
52
+ print(f"Saved DictLearning outputs to: {args.output_dir}")
53
+
54
+
55
+ if __name__ == "__main__":
56
+ main()
@@ -0,0 +1,59 @@
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+ from pathlib import Path
5
+
6
+ import nibabel as nib
7
+ import numpy as np
8
+ import pandas as pd
9
+ from nilearn.decomposition import CanICA
10
+
11
+
12
+ def load_image_list(list_path: Path) -> list[str]:
13
+ with list_path.open("r", encoding="utf-8") as handle:
14
+ return [line.strip() for line in handle if line.strip()]
15
+
16
+
17
+ def run_ica(input_list: Path, output_dir: Path, n_components: int, mask_path: Path | None = None) -> None:
18
+ output_dir.mkdir(parents=True, exist_ok=True)
19
+ images = load_image_list(input_list)
20
+
21
+ model = CanICA(
22
+ n_components=n_components,
23
+ mask=mask_path,
24
+ threshold=3.0,
25
+ random_state=0,
26
+ memory="nilearn_cache",
27
+ memory_level=1,
28
+ )
29
+ model.fit(images)
30
+
31
+ nib.save(model.components_img_, str(output_dir / "components.nii.gz"))
32
+ pd.DataFrame({"component": np.arange(1, n_components + 1)}).to_csv(output_dir / "components_index.csv", index=False)
33
+
34
+ time_series_frames = []
35
+ for index, image_path in enumerate(images):
36
+ series = model.transform(image_path)
37
+ frame = pd.DataFrame(series)
38
+ frame.insert(0, "subject_index", index)
39
+ frame.to_csv(output_dir / f"subject_{index:03d}_timeseries.csv", index=False)
40
+ time_series_frames.append(frame)
41
+
42
+ if time_series_frames:
43
+ pd.concat(time_series_frames, ignore_index=True).to_csv(output_dir / "all_subject_timeseries.csv", index=False)
44
+
45
+
46
+ def main() -> None:
47
+ parser = argparse.ArgumentParser(description="Reference Nilearn snippet for resting-state ICA.")
48
+ parser.add_argument("--input-list", type=Path, required=True, help="Text file listing preprocessed resting-state BOLD images.")
49
+ parser.add_argument("--output-dir", type=Path, required=True, help="Directory for ICA outputs.")
50
+ parser.add_argument("--n-components", type=int, default=20, help="Number of ICA components.")
51
+ parser.add_argument("--mask", type=Path, default=None, help="Optional mask image.")
52
+ args = parser.parse_args()
53
+
54
+ run_ica(args.input_list, args.output_dir, args.n_components, args.mask)
55
+ print(f"Saved ICA outputs to: {args.output_dir}")
56
+
57
+
58
+ if __name__ == "__main__":
59
+ main()
@@ -0,0 +1,58 @@
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+ from pathlib import Path
5
+
6
+ import nibabel as nib
7
+ import pandas as pd
8
+ from nilearn.glm.second_level import SecondLevelModel
9
+
10
+
11
+ def load_contrast_maps(list_path: Path) -> list[str]:
12
+ with list_path.open("r", encoding="utf-8") as handle:
13
+ return [line.strip() for line in handle if line.strip()]
14
+
15
+
16
+ def run_second_level_glm(
17
+ contrast_maps_path: Path,
18
+ design_matrix_path: Path,
19
+ output_dir: Path,
20
+ contrast_name: str,
21
+ mask_path: Path | None = None,
22
+ ) -> None:
23
+ output_dir.mkdir(parents=True, exist_ok=True)
24
+
25
+ contrast_maps = load_contrast_maps(contrast_maps_path)
26
+ design_matrix = pd.read_csv(design_matrix_path)
27
+
28
+ model = SecondLevelModel(mask_img=str(mask_path) if mask_path is not None else None)
29
+ model = model.fit(contrast_maps, design_matrix=design_matrix)
30
+ z_map = model.compute_contrast(contrast_name, output_type="z_score")
31
+ effect_map = model.compute_contrast(contrast_name, output_type="effect_size")
32
+
33
+ nib.save(z_map, str(output_dir / "second_level_z_map.nii.gz"))
34
+ nib.save(effect_map, str(output_dir / "second_level_effect_map.nii.gz"))
35
+ design_matrix.to_csv(output_dir / "design_matrix.csv", index=False)
36
+
37
+
38
+ def main() -> None:
39
+ parser = argparse.ArgumentParser(description="Reference Nilearn snippet for second-level GLM.")
40
+ parser.add_argument("--contrast-maps", type=Path, required=True, help="Text file listing subject-level contrast maps.")
41
+ parser.add_argument("--design-matrix", type=Path, required=True, help="CSV design matrix for group model.")
42
+ parser.add_argument("--contrast", type=str, required=True, help="Column or contrast expression for group inference.")
43
+ parser.add_argument("--output-dir", type=Path, required=True, help="Directory for second-level outputs.")
44
+ parser.add_argument("--mask", type=Path, default=None, help="Optional mask image.")
45
+ args = parser.parse_args()
46
+
47
+ run_second_level_glm(
48
+ contrast_maps_path=args.contrast_maps,
49
+ design_matrix_path=args.design_matrix,
50
+ output_dir=args.output_dir,
51
+ contrast_name=args.contrast,
52
+ mask_path=args.mask,
53
+ )
54
+ print(f"Saved second-level GLM outputs to: {args.output_dir}")
55
+
56
+
57
+ if __name__ == "__main__":
58
+ main()
@@ -0,0 +1,59 @@
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+ from pathlib import Path
5
+
6
+ import nibabel as nib
7
+ import numpy as np
8
+ import pandas as pd
9
+ from nilearn.decoding import SpaceNetClassifier
10
+
11
+
12
+ def load_image_list(list_path: Path) -> list[str]:
13
+ with list_path.open("r", encoding="utf-8") as handle:
14
+ return [line.strip() for line in handle if line.strip()]
15
+
16
+
17
+ def run_spacenet(
18
+ input_list: Path,
19
+ labels_path: Path,
20
+ output_dir: Path,
21
+ target: str,
22
+ mask_path: Path | None = None,
23
+ ) -> None:
24
+ output_dir.mkdir(parents=True, exist_ok=True)
25
+
26
+ images = load_image_list(input_list)
27
+ labels = pd.read_csv(labels_path)
28
+ y = labels[target].to_numpy()
29
+
30
+ model = SpaceNetClassifier(mask=mask_path, penalty="tv-l1", standardize=True, cv=3, n_jobs=1)
31
+ model.fit(images, y)
32
+
33
+ predictions = model.predict(images)
34
+ pd.DataFrame({"y_true": y, "y_pred": predictions}).to_csv(output_dir / "predictions.csv", index=False)
35
+
36
+ coef_img = model.coef_img_
37
+ if isinstance(coef_img, (list, tuple)):
38
+ coef_img = coef_img[0]
39
+ nib.save(coef_img, str(output_dir / "coef_map.nii.gz"))
40
+
41
+ decision = model.decision_function(images)
42
+ pd.DataFrame({"decision_score": np.ravel(decision)}).to_csv(output_dir / "decision_scores.csv", index=False)
43
+
44
+
45
+ def main() -> None:
46
+ parser = argparse.ArgumentParser(description="Reference Nilearn snippet for SpaceNet disease classification.")
47
+ parser.add_argument("--input-list", type=Path, required=True, help="Text file listing aligned subject images.")
48
+ parser.add_argument("--labels", type=Path, required=True, help="CSV label table.")
49
+ parser.add_argument("--target", type=str, required=True, help="Target column in label table.")
50
+ parser.add_argument("--output-dir", type=Path, required=True, help="Directory for classifier outputs.")
51
+ parser.add_argument("--mask", type=Path, default=None, help="Optional mask image.")
52
+ args = parser.parse_args()
53
+
54
+ run_spacenet(args.input_list, args.labels, args.output_dir, args.target, args.mask)
55
+ print(f"Saved SpaceNet outputs to: {args.output_dir}")
56
+
57
+
58
+ if __name__ == "__main__":
59
+ main()
@@ -0,0 +1,60 @@
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+ from pathlib import Path
5
+
6
+ import pandas as pd
7
+ from sklearn.metrics import accuracy_score, roc_auc_score
8
+ from sklearn.model_selection import StratifiedKFold, cross_val_predict
9
+ from sklearn.pipeline import Pipeline
10
+ from sklearn.preprocessing import StandardScaler
11
+ from sklearn.svm import SVC
12
+
13
+
14
+ def run_svm(features_path: Path, labels_path: Path, output_dir: Path, target: str, cv: int) -> None:
15
+ output_dir.mkdir(parents=True, exist_ok=True)
16
+
17
+ features = pd.read_csv(features_path)
18
+ labels = pd.read_csv(labels_path)
19
+ y = labels[target]
20
+
21
+ if "subject_id" in labels.columns and "subject_id" in features.columns:
22
+ merged = features.merge(labels[["subject_id", target]], on="subject_id", how="inner")
23
+ y = merged[target]
24
+ x = merged.drop(columns=[target])
25
+ if "subject_id" in x.columns:
26
+ x = x.drop(columns=["subject_id"])
27
+ else:
28
+ x = features
29
+
30
+ pipeline = Pipeline([
31
+ ("scaler", StandardScaler()),
32
+ ("svm", SVC(kernel="linear", probability=True, random_state=0)),
33
+ ])
34
+ splitter = StratifiedKFold(n_splits=cv, shuffle=True, random_state=0)
35
+ predicted = cross_val_predict(pipeline, x, y, cv=splitter, method="predict")
36
+ probabilities = cross_val_predict(pipeline, x, y, cv=splitter, method="predict_proba")
37
+
38
+ metrics = {"accuracy": accuracy_score(y, predicted)}
39
+ if probabilities.shape[1] == 2:
40
+ metrics["auc"] = roc_auc_score(y, probabilities[:, 1])
41
+
42
+ pd.DataFrame({"y_true": y, "y_pred": predicted}).to_csv(output_dir / "predictions.csv", index=False)
43
+ pd.DataFrame([metrics]).to_csv(output_dir / "metrics.csv", index=False)
44
+
45
+
46
+ def main() -> None:
47
+ parser = argparse.ArgumentParser(description="Reference Nilearn/scikit-learn snippet for SVM disease classification.")
48
+ parser.add_argument("--features", type=Path, required=True, help="CSV feature table.")
49
+ parser.add_argument("--labels", type=Path, required=True, help="CSV label table.")
50
+ parser.add_argument("--target", type=str, required=True, help="Target column in label table.")
51
+ parser.add_argument("--cv", type=int, default=5, help="Number of CV folds.")
52
+ parser.add_argument("--output-dir", type=Path, required=True, help="Directory for classifier outputs.")
53
+ args = parser.parse_args()
54
+
55
+ run_svm(args.features, args.labels, args.output_dir, args.target, args.cv)
56
+ print(f"Saved SVM outputs to: {args.output_dir}")
57
+
58
+
59
+ if __name__ == "__main__":
60
+ main()
@@ -0,0 +1,63 @@
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+ from pathlib import Path
5
+
6
+ import nibabel as nib
7
+ import pandas as pd
8
+ from nilearn.glm.first_level import FirstLevelModel
9
+ from nilearn.plotting import plot_design_matrix
10
+
11
+
12
+ def run_task_glm(
13
+ bold_path: Path,
14
+ events_path: Path,
15
+ output_dir: Path,
16
+ tr: float,
17
+ contrast: str,
18
+ confounds_path: Path | None = None,
19
+ mask_path: Path | None = None,
20
+ ) -> None:
21
+ output_dir.mkdir(parents=True, exist_ok=True)
22
+
23
+ events = pd.read_csv(events_path, sep=None, engine="python")
24
+ confounds = pd.read_csv(confounds_path, sep=None, engine="python") if confounds_path is not None else None
25
+
26
+ model = FirstLevelModel(t_r=tr, mask_img=str(mask_path) if mask_path is not None else None)
27
+ model = model.fit(str(bold_path), events=events, confounds=confounds)
28
+
29
+ design_matrix = model.design_matrices_[0]
30
+ design_matrix.to_csv(output_dir / "design_matrix.csv", index=False)
31
+ plot_design_matrix(design_matrix).figure.savefig(output_dir / "design_matrix.png", dpi=150, bbox_inches="tight")
32
+
33
+ z_map = model.compute_contrast(contrast, output_type="z_score")
34
+ effect_map = model.compute_contrast(contrast, output_type="effect_size")
35
+ nib.save(z_map, str(output_dir / "z_map.nii.gz"))
36
+ nib.save(effect_map, str(output_dir / "effect_map.nii.gz"))
37
+
38
+
39
+ def main() -> None:
40
+ parser = argparse.ArgumentParser(description="Reference Nilearn snippet for first-level task GLM.")
41
+ parser.add_argument("--bold", type=Path, required=True, help="Input preprocessed task BOLD NIfTI.")
42
+ parser.add_argument("--events", type=Path, required=True, help="Events TSV/CSV with onset, duration, and trial_type.")
43
+ parser.add_argument("--output-dir", type=Path, required=True, help="Directory for GLM outputs.")
44
+ parser.add_argument("--tr", type=float, required=True, help="Repetition time in seconds.")
45
+ parser.add_argument("--contrast", type=str, required=True, help="Named contrast expression.")
46
+ parser.add_argument("--confounds", type=Path, default=None, help="Optional confounds TSV/CSV.")
47
+ parser.add_argument("--mask", type=Path, default=None, help="Optional mask image.")
48
+ args = parser.parse_args()
49
+
50
+ run_task_glm(
51
+ bold_path=args.bold,
52
+ events_path=args.events,
53
+ output_dir=args.output_dir,
54
+ tr=args.tr,
55
+ contrast=args.contrast,
56
+ confounds_path=args.confounds,
57
+ mask_path=args.mask,
58
+ )
59
+ print(f"Saved first-level GLM outputs to: {args.output_dir}")
60
+
61
+
62
+ if __name__ == "__main__":
63
+ main()
@@ -0,0 +1,109 @@
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+ from pathlib import Path
5
+
6
+ import nibabel as nib
7
+ import numpy as np
8
+ import pandas as pd
9
+ from nilearn import image
10
+ from nilearn.maskers import NiftiLabelsMasker
11
+
12
+
13
+ def load_labels(label_path: Path) -> list[str]:
14
+ with label_path.open("r", encoding="utf-8", errors="ignore") as handle:
15
+ return [line.strip() for line in handle if line.strip()]
16
+
17
+
18
+ def get_roi_center(atlas_data: np.ndarray, affine: np.ndarray, roi_id: int) -> list[float]:
19
+ coords = np.argwhere(atlas_data == roi_id)
20
+ if len(coords) == 0:
21
+ return [0.0, 0.0, 0.0]
22
+ center = np.median(coords, axis=0)
23
+ xyz = nib.affines.apply_affine(affine, center)
24
+ return np.round(xyz, 2).tolist()
25
+
26
+
27
+ def export_zalff_summary(
28
+ bold_path: Path,
29
+ atlas_path: Path,
30
+ label_path: Path,
31
+ mask_path: Path,
32
+ output_dir: Path,
33
+ tr: float,
34
+ top_n: int,
35
+ ) -> None:
36
+ output_dir.mkdir(parents=True, exist_ok=True)
37
+
38
+ bold_img = nib.load(str(bold_path))
39
+ mni_img = image.resample_to_img(bold_img, str(mask_path), interpolation="linear", force_resample=True)
40
+ cleaned = image.clean_img(
41
+ mni_img,
42
+ detrend=True,
43
+ standardize=False,
44
+ low_pass=0.1,
45
+ high_pass=0.01,
46
+ t_r=tr,
47
+ mask_img=str(mask_path),
48
+ )
49
+
50
+ alff = image.math_img("np.std(img, axis=3)", img=cleaned)
51
+ mask_data = nib.load(str(mask_path)).get_fdata() > 0.5
52
+ alff_values = alff.get_fdata()[mask_data]
53
+ mean_value = float(np.mean(alff_values))
54
+ std_value = float(np.std(alff_values))
55
+ if std_value == 0:
56
+ raise ValueError("zALFF normalization failed because the standard deviation is zero.")
57
+
58
+ zalff = image.math_img(f"(img - {mean_value}) / {std_value}", img=alff)
59
+
60
+ labels = load_labels(label_path)
61
+ masker = NiftiLabelsMasker(labels_img=str(atlas_path), standardize=False)
62
+ roi_values = masker.fit_transform(zalff)[0]
63
+
64
+ summary = pd.DataFrame(
65
+ {
66
+ "Region_ID": range(1, len(roi_values) + 1),
67
+ "Region_Name": labels[: len(roi_values)],
68
+ "zALFF": roi_values,
69
+ }
70
+ ).sort_values(by="zALFF", ascending=False, ignore_index=True)
71
+
72
+ atlas_img = nib.load(str(atlas_path))
73
+ atlas_data = atlas_img.get_fdata()
74
+ affine = atlas_img.affine
75
+ coordinates = [get_roi_center(atlas_data, affine, int(region_id)) for region_id in summary["Region_ID"]]
76
+ summary[["MNI_X", "MNI_Y", "MNI_Z"]] = pd.DataFrame(coordinates, index=summary.index)
77
+
78
+ summary.head(top_n).to_csv(output_dir / "TOP_active_regions.csv", index=False)
79
+ summary.head(top_n)[["Region_Name", "MNI_X", "MNI_Y", "MNI_Z", "zALFF"]].to_csv(
80
+ output_dir / "top_coordinates.csv", index=False
81
+ )
82
+ summary.to_csv(output_dir / "all_brain_regions_activity.csv", index=False)
83
+
84
+
85
+ def main() -> None:
86
+ parser = argparse.ArgumentParser(description="Reference Nilearn snippet for zALFF regional summaries.")
87
+ parser.add_argument("--bold", type=Path, required=True, help="Input 4D BOLD NIfTI.")
88
+ parser.add_argument("--atlas", type=Path, required=True, help="Atlas NIfTI for regional summaries.")
89
+ parser.add_argument("--labels", type=Path, required=True, help="Atlas label text file.")
90
+ parser.add_argument("--mask", type=Path, required=True, help="Mask image for resampling and cleaning.")
91
+ parser.add_argument("--output-dir", type=Path, required=True, help="Directory for summary outputs.")
92
+ parser.add_argument("--tr", type=float, default=1.0, help="Repetition time in seconds.")
93
+ parser.add_argument("--top-n", type=int, default=10, help="Number of top regions to export.")
94
+ args = parser.parse_args()
95
+
96
+ export_zalff_summary(
97
+ bold_path=args.bold,
98
+ atlas_path=args.atlas,
99
+ label_path=args.labels,
100
+ mask_path=args.mask,
101
+ output_dir=args.output_dir,
102
+ tr=args.tr,
103
+ top_n=args.top_n,
104
+ )
105
+ print(f"Saved zALFF summaries to: {args.output_dir}")
106
+
107
+
108
+ if __name__ == "__main__":
109
+ main()