@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,108 @@
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+ from pathlib import Path
5
+
6
+ import matplotlib.pyplot as plt
7
+ import nibabel as nib
8
+ import numpy as np
9
+ from nilearn import plotting
10
+
11
+
12
+ def load_connectivity_matrix(matrix_path: Path) -> np.ndarray:
13
+ if matrix_path.suffix.lower() == ".npy":
14
+ matrix = np.load(matrix_path)
15
+ else:
16
+ matrix = np.loadtxt(matrix_path, delimiter=",")
17
+
18
+ if matrix.ndim != 2 or matrix.shape[0] != matrix.shape[1]:
19
+ raise ValueError("Connectivity matrix must be square.")
20
+
21
+ matrix = (matrix + matrix.T) / 2.0
22
+ np.fill_diagonal(matrix, 0)
23
+ return matrix
24
+
25
+
26
+ def keep_strongest_connections(matrix: np.ndarray, top_k: int) -> np.ndarray:
27
+ if top_k <= 0:
28
+ return matrix
29
+
30
+ upper_indices = np.triu_indices_from(matrix, k=1)
31
+ weights = matrix[upper_indices]
32
+ positive = weights[weights > 0]
33
+ if len(positive) == 0 or top_k >= len(positive):
34
+ return matrix
35
+
36
+ threshold = np.partition(positive, -top_k)[-top_k]
37
+ filtered = matrix.copy()
38
+ filtered[filtered < threshold] = 0
39
+ return filtered
40
+
41
+
42
+ def plot_connectome_reference(
43
+ atlas_path: Path,
44
+ template_path: Path,
45
+ matrix_path: Path,
46
+ output_path: Path,
47
+ top_k: int,
48
+ node_size: int,
49
+ brain_opacity: float,
50
+ ) -> None:
51
+ atlas_img = nib.load(str(atlas_path))
52
+ coords = plotting.find_parcellation_cut_coords(atlas_img)
53
+
54
+ matrix = load_connectivity_matrix(matrix_path)
55
+ matrix = keep_strongest_connections(matrix, top_k)
56
+
57
+ colors = ["#1f77b4", "#ff7f0e", "#2ca02c", "#d62728"]
58
+ node_colors = [colors[index % len(colors)] for index in range(len(coords))]
59
+
60
+ fig, ax = plt.subplots(figsize=(12, 10), facecolor="white")
61
+ plotting.plot_glass_brain(
62
+ str(template_path),
63
+ display_mode="ortho",
64
+ axes=ax,
65
+ alpha=brain_opacity,
66
+ )
67
+ plotting.plot_connectome(
68
+ matrix,
69
+ coords,
70
+ node_color=node_colors,
71
+ node_size=node_size,
72
+ axes=ax,
73
+ colorbar=True,
74
+ edge_threshold=None,
75
+ edge_vmin=-1,
76
+ edge_vmax=1,
77
+ )
78
+
79
+ output_path.parent.mkdir(parents=True, exist_ok=True)
80
+ plt.savefig(output_path, dpi=300, bbox_inches="tight")
81
+ plt.close(fig)
82
+
83
+
84
+ def main() -> None:
85
+ parser = argparse.ArgumentParser(description="Reference script for 3D brain connectome plotting.")
86
+ parser.add_argument("--atlas", type=Path, required=True, help="Atlas NIfTI used to derive parcel coordinates.")
87
+ parser.add_argument("--template", type=Path, required=True, help="Template T1 image for background display.")
88
+ parser.add_argument("--matrix", type=Path, required=True, help="Connectivity matrix in .npy or .csv format.")
89
+ parser.add_argument("--output", type=Path, required=True, help="Output PNG path.")
90
+ parser.add_argument("--top-k", type=int, default=8, help="Number of strongest positive connections to keep.")
91
+ parser.add_argument("--node-size", type=int, default=100, help="Node marker size.")
92
+ parser.add_argument("--brain-opacity", type=float, default=0.18, help="Background template opacity.")
93
+ args = parser.parse_args()
94
+
95
+ plot_connectome_reference(
96
+ atlas_path=args.atlas,
97
+ template_path=args.template,
98
+ matrix_path=args.matrix,
99
+ output_path=args.output,
100
+ top_k=args.top_k,
101
+ node_size=args.node_size,
102
+ brain_opacity=args.brain_opacity,
103
+ )
104
+ print(f"Saved connectome figure to: {args.output}")
105
+
106
+
107
+ if __name__ == "__main__":
108
+ main()
@@ -0,0 +1,54 @@
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+ from pathlib import Path
5
+
6
+ import nibabel.freesurfer as fs
7
+ import numpy as np
8
+
9
+
10
+ def export_colored_ply(surf_path: Path, annot_path: Path, output_path: Path) -> None:
11
+ coords, faces = fs.read_geometry(str(surf_path))
12
+ labels, color_table, _ = fs.read_annot(str(annot_path))
13
+
14
+ vertex_colors = np.zeros((len(coords), 3), dtype=np.uint8)
15
+ for index, label in enumerate(labels):
16
+ if 0 <= label < len(color_table):
17
+ vertex_colors[index] = color_table[label, :3]
18
+ else:
19
+ vertex_colors[index] = [128, 128, 128]
20
+
21
+ output_path.parent.mkdir(parents=True, exist_ok=True)
22
+ with output_path.open("w", encoding="utf-8") as handle:
23
+ handle.write("ply\n")
24
+ handle.write("format ascii 1.0\n")
25
+ handle.write(f"element vertex {len(coords)}\n")
26
+ handle.write("property float x\n")
27
+ handle.write("property float y\n")
28
+ handle.write("property float z\n")
29
+ handle.write("property uchar red\n")
30
+ handle.write("property uchar green\n")
31
+ handle.write("property uchar blue\n")
32
+ handle.write(f"element face {len(faces)}\n")
33
+ handle.write("property list uchar int vertex_indices\n")
34
+ handle.write("end_header\n")
35
+
36
+ for vertex, color in zip(coords, vertex_colors):
37
+ handle.write(f"{vertex[0]:.6f} {vertex[1]:.6f} {vertex[2]:.6f} {color[0]} {color[1]} {color[2]}\n")
38
+ for face in faces:
39
+ handle.write(f"3 {face[0]} {face[1]} {face[2]}\n")
40
+
41
+
42
+ def main() -> None:
43
+ parser = argparse.ArgumentParser(description="Reference script for exporting FreeSurfer surfaces to colored PLY.")
44
+ parser.add_argument("--surf", type=Path, required=True, help="FreeSurfer surface file such as lh.pial or rh.pial.")
45
+ parser.add_argument("--annot", type=Path, required=True, help="FreeSurfer annotation file such as lh.aparc.annot.")
46
+ parser.add_argument("--output", type=Path, required=True, help="Output PLY path.")
47
+ args = parser.parse_args()
48
+
49
+ export_colored_ply(args.surf, args.annot, args.output)
50
+ print(f"Saved colored PLY to: {args.output}")
51
+
52
+
53
+ if __name__ == "__main__":
54
+ main()
@@ -0,0 +1,116 @@
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 summarize_zalff(
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(
40
+ bold_img,
41
+ str(mask_path),
42
+ interpolation="linear",
43
+ force_resample=True,
44
+ )
45
+
46
+ cleaned = image.clean_img(
47
+ mni_img,
48
+ detrend=True,
49
+ standardize=False,
50
+ low_pass=0.1,
51
+ high_pass=0.01,
52
+ t_r=tr,
53
+ mask_img=str(mask_path),
54
+ )
55
+
56
+ alff = image.math_img("np.std(img, axis=3)", img=cleaned)
57
+ mask_data = nib.load(str(mask_path)).get_fdata() > 0.5
58
+ alff_values = alff.get_fdata()[mask_data]
59
+ mu = float(np.mean(alff_values))
60
+ sigma = float(np.std(alff_values))
61
+ if sigma == 0:
62
+ raise ValueError("zALFF normalization failed because the standard deviation is zero.")
63
+
64
+ zalff = image.math_img(f"(img - {mu}) / {sigma}", img=alff)
65
+
66
+ labels = load_labels(label_path)
67
+ masker = NiftiLabelsMasker(labels_img=str(atlas_path), standardize=False)
68
+ roi_values = masker.fit_transform(zalff)[0]
69
+
70
+ summary = pd.DataFrame(
71
+ {
72
+ "Region_ID": range(1, len(roi_values) + 1),
73
+ "Region_Name": labels[: len(roi_values)],
74
+ "zALFF": roi_values,
75
+ }
76
+ ).sort_values(by="zALFF", ascending=False, ignore_index=True)
77
+
78
+ atlas_img = nib.load(str(atlas_path))
79
+ atlas_data = atlas_img.get_fdata()
80
+ affine = atlas_img.affine
81
+ coordinates = [get_roi_center(atlas_data, affine, int(region_id)) for region_id in summary["Region_ID"]]
82
+ summary[["MNI_X", "MNI_Y", "MNI_Z"]] = pd.DataFrame(coordinates, index=summary.index)
83
+
84
+ top_table = summary.head(top_n)
85
+ top_table.to_csv(output_dir / "TOP_active_regions.csv", index=False)
86
+ top_table[["Region_Name", "MNI_X", "MNI_Y", "MNI_Z", "zALFF"]].to_csv(
87
+ output_dir / "top_coordinates.csv", index=False
88
+ )
89
+ summary.to_csv(output_dir / "all_brain_regions_activity.csv", index=False)
90
+
91
+
92
+ def main() -> None:
93
+ parser = argparse.ArgumentParser(description="Reference script for atlas-based zALFF regional summaries.")
94
+ parser.add_argument("--bold", type=Path, required=True, help="Input 4D BOLD NIfTI image.")
95
+ parser.add_argument("--atlas", type=Path, required=True, help="Atlas NIfTI for parcel summaries.")
96
+ parser.add_argument("--labels", type=Path, required=True, help="Atlas label text file.")
97
+ parser.add_argument("--mask", type=Path, required=True, help="MNI or analysis mask used for resampling and cleanup.")
98
+ parser.add_argument("--output-dir", type=Path, required=True, help="Directory for CSV outputs.")
99
+ parser.add_argument("--tr", type=float, default=1.0, help="Repetition time in seconds.")
100
+ parser.add_argument("--top-n", type=int, default=10, help="Number of top regions to export.")
101
+ args = parser.parse_args()
102
+
103
+ summarize_zalff(
104
+ bold_path=args.bold,
105
+ atlas_path=args.atlas,
106
+ label_path=args.labels,
107
+ mask_path=args.mask,
108
+ output_dir=args.output_dir,
109
+ tr=args.tr,
110
+ top_n=args.top_n,
111
+ )
112
+ print(f"Saved zALFF summaries to: {args.output_dir}")
113
+
114
+
115
+ if __name__ == "__main__":
116
+ main()
@@ -0,0 +1,78 @@
1
+ ---
2
+ name: ethoclaw-paper-figure-layout
3
+ description: "Auto-layout folders of result images into a paper-like PDF (LaTeX) with captions derived from filenames and optional heatmap+colorbar grouping. Use when the user says: use images in this folder to help with layout/generate paper figures/arrange figures into PDF by folder grouping; or when there are many PNG/JPG figures that need consistent captions and pagination."
4
+ ---
5
+
6
+ # Paper Figure Layout
7
+
8
+ Auto-generate a Nature-Communications-ish **compact multi-panel figure PDF** from a directory of images.
9
+
10
+ ## What it does
11
+
12
+ ### Default (recommended): compact multi-panel
13
+
14
+ - **Compact, figure-like layout** (not one-page-per-image)
15
+ - **Subpanel letters** `a, b, c…` aligned in reading order
16
+ - **Figure title above panels** (`Fig. X | Title`)
17
+ - **Per-panel descriptions below** ("a …; b …; c …")
18
+ - **Sensible defaults**: if the user doesn’t specify, pick **1 representative image per type**
19
+ - "type" = (nested) subfolder under the input root, e.g. `heatmap_velocity/`, `radar/group_means/`
20
+
21
+ ### Legacy: foldered dump
22
+
23
+ - **Groups by subfolder**: each subfolder becomes a section.
24
+ - **Captions from filenames**: underscores/dashes become spaces.
25
+ - **Stable pagination**: uses one-column LaTeX blocks (no fragile two-column floats).
26
+
27
+ ## Quick start
28
+
29
+ ### Compact multi-panel (default)
30
+
31
+ ```bash
32
+ python3 scripts/layout_results_foldered.py \
33
+ --input "/path/to/2_results" \
34
+ --output "/path/to/out.pdf" \
35
+ --title "Results"
36
+ ```
37
+
38
+ Defaults (can override):
39
+ - `--mode compact`
40
+ - `--max-per-type 1`
41
+ - `--cols 2`
42
+ - `--panels-per-figure 6`
43
+
44
+ Default representative logic:
45
+ - `--max-per-type 1` means: keep **1 representative per inferred subtype**, not just 1 file for the whole folder.
46
+ - Example: if a folder contains `x-Axis`, `y-Axis`, `z-Axis`, the default compact layout should keep all 3 because they are three subtypes of the same figure family.
47
+
48
+ Useful override:
49
+ - `--max-per-type 0` → include **all images** from each type/folder instead of representative selection.
50
+
51
+ Special handling:
52
+ - If a folder contains `colorBar` / `color_bar` plus heatmaps, the layout bundles them into one panel:
53
+ - up to 3 heatmaps + 1 shared colorbar side-by-side
54
+ - the colorbar is rendered narrow instead of occupying a full panel by itself
55
+
56
+ ### Legacy foldered
57
+
58
+ ```bash
59
+ python3 scripts/layout_results_foldered.py \
60
+ --input "/path/to/2_results" \
61
+ --output "/path/to/out.pdf" \
62
+ --title "Results" \
63
+ --mode foldered
64
+ ```
65
+
66
+ ## Outputs
67
+
68
+ - A single PDF at `--output`.
69
+
70
+ ## Notes
71
+
72
+ - The TypeTex LaTeX compiler environment often defaults to `xelatex` via latexmk, but `xelatex` may be missing.
73
+ The script supplies a `.latexmkrc` that forces `pdflatex`.
74
+
75
+ ## Resources
76
+
77
+ - `scripts/layout_results_foldered.py` — the generator.
78
+ - `assets/naturecomm_figures.tex` — the Nature-Communications-ish preamble used by the generator.
@@ -0,0 +1,74 @@
1
+ % naturecomm_figures.tex
2
+ % A Nature Communications–style 2-column LaTeX template tuned for figure-heavy docs.
3
+ % Reference PDF: /home/max/Downloads/demo.pdf (Nature Communications | (2021)12:2784 | doi:10.1038/s41467-021-22970-y)
4
+ %
5
+ % NOTE: The TypeTex LaTeX compiler in this environment does NOT have xelatex.
6
+ % Keep this template pdfLaTeX-compatible (no fontspec).
7
+ %
8
+ % Traits emulated:
9
+ % - 2-column layout, ~6mm column gap
10
+ % - Grey running header line with journal/doi/url and page number
11
+ % - Figures centered, captions below, small caption text, ragged-right
12
+ % - Supports single-column figures and wide figures (figure*)
13
+
14
+ \documentclass[9pt,twocolumn]{article}
15
+
16
+ % demo.pdf page size is 210 x 276 mm (A4 width, shorter height)
17
+ \usepackage[
18
+ paperwidth=210mm,
19
+ paperheight=276mm,
20
+ top=16mm,bottom=16mm,left=16.5mm,right=16.5mm
21
+ ]{geometry}
22
+
23
+ \setlength{\columnsep}{6mm}
24
+
25
+ \usepackage{graphicx}
26
+ \usepackage{xcolor}
27
+ \usepackage{caption}
28
+ \usepackage{subcaption}
29
+ \usepackage{fancyhdr}
30
+ \usepackage{hyperref}
31
+
32
+ % --- Running header ---
33
+ \pagestyle{fancy}
34
+ \fancyhf{}
35
+ \renewcommand{\headrulewidth}{0.3pt}
36
+ \renewcommand{\headrule}{\hbox to\headwidth{\color{black!25}\leaders\hrule height \headrulewidth\hfill}}
37
+
38
+ % Customize these per document
39
+ \newcommand{\NCJournal}{NATURE COMMUNICATIONS}
40
+ \newcommand{\NCYear}{2021}
41
+ \newcommand{\NCVol}{12}
42
+ \newcommand{\NCArticle}{2784}
43
+ \newcommand{\NCDOI}{https://doi.org/10.1038/s41467-021-22970-y}
44
+ \newcommand{\NCURL}{www.nature.com/naturecommunications}
45
+
46
+ \lhead{\color{black!55}\fontsize{8}{9}\selectfont
47
+ \NCJournal\ | (\NCYear)\NCVol:\NCArticle\ | \href{\NCDOI}{\NCDOI}\ | \NCURL}
48
+ \rhead{\color{black!55}\fontsize{8}{9}\selectfont \thepage}
49
+
50
+ % --- Figure caption style ("Fig. 1" bold) ---
51
+ \renewcommand{\figurename}{Fig.}
52
+ \captionsetup[figure]{
53
+ font=small,
54
+ labelfont=bf,
55
+ labelsep=space,
56
+ justification=raggedright,
57
+ singlelinecheck=false,
58
+ skip=2mm
59
+ }
60
+
61
+ % Float spacing (tune to taste)
62
+ \setlength{\textfloatsep}{6mm}
63
+ \setlength{\intextsep}{6mm}
64
+ \setlength{\floatsep}{5mm}
65
+ \setlength{\dbltextfloatsep}{6mm}
66
+ \setlength{\dblfloatsep}{5mm}
67
+ \usepackage{titlesec}
68
+ \titlespacing*{\section}{0pt}{1.0ex}{0.8ex}
69
+ \titlespacing*{\subsection}{0pt}{0.8ex}{0.6ex}
70
+
71
+ % ---- Document starts here ----
72
+ % \begin{document}
73
+ % ...
74
+ % \end{document}