@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.
- package/package.json +2 -2
- package/skills/01_Meta-Skills/academic-research-hub/SKILL.md +108 -0
- package/skills/01_Meta-Skills/academic-research-hub/scripts/requirements.txt +17 -0
- package/skills/01_Meta-Skills/academic-research-hub/scripts/research.py +781 -0
- package/skills/01_Meta-Skills/beautiful-log/SKILL.md +64 -0
- package/skills/01_Meta-Skills/beautiful-log/scripts/beautiful_log.py +274 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/SKILL.md +130 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/assets/config.template.yaml +54 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/assets/top5_digest_template.md +5 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/build_top5_digest.py +300 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/common.py +137 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/merge_results.py +106 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/run_pipeline.py +177 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/search_arxiv.py +162 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/search_pubmed.py +202 -0
- package/skills/01_Meta-Skills/ethoclaw-normalize-tabular/SKILL.md +173 -0
- package/skills/01_Meta-Skills/ethoclaw-normalize-tabular/scripts/normalize_data.py +874 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/SKILL.md +134 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/references/confirmation-prompts.md +31 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/references/output-patterns.md +45 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/build_markdown_deliverables.py +41 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/build_research_log.py +84 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/build_summary_md.py +63 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/extract_pdf_bundle.py +140 -0
- package/skills/01_Meta-Skills/experiment-controller/SKILL.md +140 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/SKILL.md +366 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/entity_resolution.py +120 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/extraction_prompt_template.txt +19 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/graph_query.py +106 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/hypothesis_cli_reference.py +42 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/new_data_source_template.py +116 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/requirements.txt +15 -0
- package/skills/01_Meta-Skills/method-design/SKILL.md +61 -0
- package/skills/01_Meta-Skills/multi-search-engine/SKILL.md +119 -0
- package/skills/01_Meta-Skills/research-idea/SKILL.md +65 -0
- package/skills/05_EEG_ERP/eeg-skill/SKILL.md +197 -0
- package/skills/05_EEG_ERP/meg-skill/SKILL.md +188 -0
- package/skills/05_EEG_ERP/meg-skill/scripts/time_frequency.py +223 -0
- package/skills/05_EEG_ERP/mne-eeg-tool/SKILL.md +165 -0
- package/skills/05_EEG_ERP/mne-eeg-tool/scripts/eeg_pipeline_reference.py +231 -0
- package/skills/05_EEG_ERP/seed-iv-skill/SKILL.md +184 -0
- package/skills/05_EEG_ERP/seed-iv-skill/scripts/classify_seed_iv.py +154 -0
- package/skills/05_EEG_ERP/seed-iv-skill/scripts/extract_seed_iv_features.py +190 -0
- package/skills/05_EEG_ERP/seed-iv-skill/scripts/validate_seed_iv.py +102 -0
- package/skills/05_EEG_ERP/seed-vig-skill/SKILL.md +182 -0
- package/skills/05_EEG_ERP/seed-vig-skill/scripts/classify_seed_vig.py +165 -0
- package/skills/05_EEG_ERP/seed-vig-skill/scripts/extract_seed_vig_features.py +185 -0
- package/skills/05_EEG_ERP/seed-vig-skill/scripts/validate_seed_vig.py +88 -0
- package/skills/06_fMRI_Neuroimaging/abcd-skill/SKILL.md +308 -0
- package/skills/06_fMRI_Neuroimaging/abcd-skill/scripts/abcd_qc_summary.py +449 -0
- package/skills/06_fMRI_Neuroimaging/abcd-skill/scripts/extract_abcd_phenotype.py +292 -0
- package/skills/06_fMRI_Neuroimaging/abcd-skill/scripts/reorganize_abcd.py +387 -0
- package/skills/06_fMRI_Neuroimaging/abide-skill/SKILL.md +302 -0
- package/skills/06_fMRI_Neuroimaging/abide-skill/scripts/abide_qc_summary.py +317 -0
- package/skills/06_fMRI_Neuroimaging/abide-skill/scripts/extract_abide_phenotype.py +267 -0
- package/skills/06_fMRI_Neuroimaging/abide-skill/scripts/reorganize_abide.py +387 -0
- package/skills/06_fMRI_Neuroimaging/adhd200-skill/SKILL.md +244 -0
- package/skills/06_fMRI_Neuroimaging/adhd200-skill/scripts/adhd200_qc_summary.py +98 -0
- package/skills/06_fMRI_Neuroimaging/adhd200-skill/scripts/extract_adhd200_phenotype.py +134 -0
- package/skills/06_fMRI_Neuroimaging/adhd200-skill/scripts/reorganize_adhd200.py +206 -0
- package/skills/06_fMRI_Neuroimaging/adni-skill/SKILL.md +358 -0
- package/skills/06_fMRI_Neuroimaging/adni-skill/scripts/generate_adni_task_files.py +1305 -0
- package/skills/06_fMRI_Neuroimaging/adni-skill/scripts/generate_vqa_from_tasks.py +766 -0
- package/skills/06_fMRI_Neuroimaging/adni-skill/scripts/reorganize_adni.py +491 -0
- package/skills/06_fMRI_Neuroimaging/aibl-skill/SKILL.md +295 -0
- package/skills/06_fMRI_Neuroimaging/aibl-skill/scripts/aibl_qc_summary.py +260 -0
- package/skills/06_fMRI_Neuroimaging/aibl-skill/scripts/extract_aibl_phenotype.py +365 -0
- package/skills/06_fMRI_Neuroimaging/aibl-skill/scripts/reorganize_aibl.py +394 -0
- package/skills/06_fMRI_Neuroimaging/aomic-skill/SKILL.md +292 -0
- package/skills/06_fMRI_Neuroimaging/aomic-skill/scripts/aomic_qc_summary.py +258 -0
- package/skills/06_fMRI_Neuroimaging/aomic-skill/scripts/extract_aomic_phenotype.py +284 -0
- package/skills/06_fMRI_Neuroimaging/aomic-skill/scripts/reorganize_aomic.py +322 -0
- package/skills/06_fMRI_Neuroimaging/asl-skill/SKILL.md +168 -0
- package/skills/06_fMRI_Neuroimaging/asl-skill/scripts/compute_cbf.py +224 -0
- package/skills/06_fMRI_Neuroimaging/bids-organizer/SKILL.md +241 -0
- package/skills/06_fMRI_Neuroimaging/bold5000-skill/SKILL.md +186 -0
- package/skills/06_fMRI_Neuroimaging/bold5000-skill/scripts/bold5000_qc_summary.py +96 -0
- package/skills/06_fMRI_Neuroimaging/bold5000-skill/scripts/extract_bold5000_stimulus.py +125 -0
- package/skills/06_fMRI_Neuroimaging/bold5000-skill/scripts/reorganize_bold5000.py +102 -0
- package/skills/06_fMRI_Neuroimaging/camcan-skill/SKILL.md +213 -0
- package/skills/06_fMRI_Neuroimaging/camcan-skill/scripts/camcan_qc_summary.py +131 -0
- package/skills/06_fMRI_Neuroimaging/camcan-skill/scripts/extract_camcan_phenotype.py +145 -0
- package/skills/06_fMRI_Neuroimaging/camcan-skill/scripts/validate_camcan.py +141 -0
- package/skills/06_fMRI_Neuroimaging/cobre-skill/SKILL.md +201 -0
- package/skills/06_fMRI_Neuroimaging/cobre-skill/scripts/cobre_qc_summary.py +95 -0
- package/skills/06_fMRI_Neuroimaging/cobre-skill/scripts/extract_cobre_phenotype.py +104 -0
- package/skills/06_fMRI_Neuroimaging/cobre-skill/scripts/reorganize_cobre.py +140 -0
- package/skills/06_fMRI_Neuroimaging/conn-tool/SKILL.md +180 -0
- package/skills/06_fMRI_Neuroimaging/dcm2nii/SKILL.md +189 -0
- package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/SKILL.md +183 -0
- package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/scripts/dmt_har_med_qc_summary.py +96 -0
- package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/scripts/extract_dmt_har_med_phenotype.py +121 -0
- package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/scripts/reorganize_dmt_har_med.py +125 -0
- package/skills/06_fMRI_Neuroimaging/dwi-skill/SKILL.md +359 -0
- package/skills/06_fMRI_Neuroimaging/fmri-skill/SKILL.md +371 -0
- package/skills/06_fMRI_Neuroimaging/fmriprep-tool/SKILL.md +228 -0
- package/skills/06_fMRI_Neuroimaging/freesurfer-tool/SKILL.md +286 -0
- package/skills/06_fMRI_Neuroimaging/freesurfer-tool/scripts/freesurfer_processor.py +145 -0
- package/skills/06_fMRI_Neuroimaging/fsl-tool/SKILL.md +208 -0
- package/skills/06_fMRI_Neuroimaging/hbn-skill/SKILL.md +271 -0
- package/skills/06_fMRI_Neuroimaging/hbn-skill/scripts/extract_hbn_phenotype.py +107 -0
- package/skills/06_fMRI_Neuroimaging/hbn-skill/scripts/hbn_qc_summary.py +96 -0
- package/skills/06_fMRI_Neuroimaging/hbn-skill/scripts/reorganize_hbn.py +150 -0
- package/skills/06_fMRI_Neuroimaging/hcpa-skill/SKILL.md +210 -0
- package/skills/06_fMRI_Neuroimaging/hcpa-skill/scripts/extract_hcpa_phenotype.py +146 -0
- package/skills/06_fMRI_Neuroimaging/hcpa-skill/scripts/hcpa_qc_summary.py +120 -0
- package/skills/06_fMRI_Neuroimaging/hcpa-skill/scripts/reorganize_hcpa.py +155 -0
- package/skills/06_fMRI_Neuroimaging/hcpd-skill/SKILL.md +210 -0
- package/skills/06_fMRI_Neuroimaging/hcpd-skill/scripts/extract_hcpd_phenotype.py +148 -0
- package/skills/06_fMRI_Neuroimaging/hcpd-skill/scripts/hcpd_qc_summary.py +125 -0
- package/skills/06_fMRI_Neuroimaging/hcpd-skill/scripts/reorganize_hcpd.py +146 -0
- package/skills/06_fMRI_Neuroimaging/hcpep-skill/SKILL.md +215 -0
- package/skills/06_fMRI_Neuroimaging/hcpep-skill/scripts/extract_hcpep_phenotype.py +157 -0
- package/skills/06_fMRI_Neuroimaging/hcpep-skill/scripts/hcpep_qc_summary.py +143 -0
- package/skills/06_fMRI_Neuroimaging/hcpep-skill/scripts/reorganize_hcpep.py +146 -0
- package/skills/06_fMRI_Neuroimaging/hcppipeline-tool/SKILL.md +217 -0
- package/skills/06_fMRI_Neuroimaging/hcpya-skill/SKILL.md +214 -0
- package/skills/06_fMRI_Neuroimaging/hcpya-skill/scripts/extract_hcpya_phenotype.py +190 -0
- package/skills/06_fMRI_Neuroimaging/hcpya-skill/scripts/hcpya_qc_summary.py +152 -0
- package/skills/06_fMRI_Neuroimaging/hcpya-skill/scripts/reorganize_hcpya.py +203 -0
- package/skills/06_fMRI_Neuroimaging/ixi-skill/SKILL.md +198 -0
- package/skills/06_fMRI_Neuroimaging/ixi-skill/scripts/ixi_qc_summary.py +137 -0
- package/skills/06_fMRI_Neuroimaging/ixi-skill/scripts/reorganize_ixi.py +190 -0
- package/skills/06_fMRI_Neuroimaging/mnd-skill/SKILL.md +191 -0
- package/skills/06_fMRI_Neuroimaging/mnd-skill/scripts/extract_mnd_phenotype.py +143 -0
- package/skills/06_fMRI_Neuroimaging/mnd-skill/scripts/mnd_qc_summary.py +120 -0
- package/skills/06_fMRI_Neuroimaging/mnd-skill/scripts/validate_mnd.py +107 -0
- package/skills/06_fMRI_Neuroimaging/mschallenge-skill/SKILL.md +203 -0
- package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/analyze_lesions.py +119 -0
- package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/longitudinal_lesion.py +148 -0
- package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/mschallenge_qc_summary.py +132 -0
- package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/validate_mschallenge.py +116 -0
- package/skills/06_fMRI_Neuroimaging/nibabel-skill/SKILL.md +184 -0
- package/skills/06_fMRI_Neuroimaging/nibabel-skill/scripts/atlas_coordinate_reference.py +61 -0
- package/skills/06_fMRI_Neuroimaging/nibabel-skill/scripts/freesurfer_io_reference.py +34 -0
- package/skills/06_fMRI_Neuroimaging/nibabel-skill/scripts/nifti_inspection_reference.py +35 -0
- package/skills/06_fMRI_Neuroimaging/nifd-skill/SKILL.md +205 -0
- package/skills/06_fMRI_Neuroimaging/nifd-skill/scripts/extract_nifd_phenotype.py +132 -0
- package/skills/06_fMRI_Neuroimaging/nifd-skill/scripts/nifd_qc_summary.py +111 -0
- package/skills/06_fMRI_Neuroimaging/nifd-skill/scripts/validate_nifd.py +111 -0
- package/skills/06_fMRI_Neuroimaging/nii2dcm/SKILL.md +143 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/SKILL.md +266 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/connectome_reference.py +65 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/denoise_timeseries_reference.py +58 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/hierarchical_parcellation_reference.py +53 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/kmeans_parcellation_reference.py +53 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/preprocess_bold_reference.py +76 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/rest_dictlearning_reference.py +56 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/rest_ica_reference.py +59 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/second_level_glm_reference.py +58 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/spacenet_classifier_reference.py +59 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/svm_classifier_reference.py +60 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/task_glm_reference.py +63 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/zalff_summary_reference.py +109 -0
- package/skills/06_fMRI_Neuroimaging/nsd-skill/SKILL.md +210 -0
- package/skills/06_fMRI_Neuroimaging/nsd-skill/scripts/extract_nsd_stimulus.py +171 -0
- package/skills/06_fMRI_Neuroimaging/nsd-skill/scripts/nsd_qc_summary.py +142 -0
- package/skills/06_fMRI_Neuroimaging/nsd-skill/scripts/validate_nsd.py +142 -0
- package/skills/06_fMRI_Neuroimaging/oasis-skill/SKILL.md +205 -0
- package/skills/06_fMRI_Neuroimaging/oasis-skill/scripts/extract_oasis_phenotype.py +126 -0
- package/skills/06_fMRI_Neuroimaging/oasis-skill/scripts/oasis_qc_summary.py +115 -0
- package/skills/06_fMRI_Neuroimaging/oasis-skill/scripts/validate_oasis.py +119 -0
- package/skills/06_fMRI_Neuroimaging/pet-skill/SKILL.md +173 -0
- package/skills/06_fMRI_Neuroimaging/pet-skill/scripts/compute_suvr.py +202 -0
- package/skills/06_fMRI_Neuroimaging/pnc-skill/SKILL.md +206 -0
- package/skills/06_fMRI_Neuroimaging/pnc-skill/scripts/extract_pnc_phenotype.py +136 -0
- package/skills/06_fMRI_Neuroimaging/pnc-skill/scripts/pnc_qc_summary.py +116 -0
- package/skills/06_fMRI_Neuroimaging/pnc-skill/scripts/validate_pnc.py +120 -0
- package/skills/06_fMRI_Neuroimaging/ppmi-skill/SKILL.md +209 -0
- package/skills/06_fMRI_Neuroimaging/ppmi-skill/scripts/extract_ppmi_phenotype.py +138 -0
- package/skills/06_fMRI_Neuroimaging/ppmi-skill/scripts/ppmi_qc_summary.py +111 -0
- package/skills/06_fMRI_Neuroimaging/ppmi-skill/scripts/validate_ppmi.py +117 -0
- package/skills/06_fMRI_Neuroimaging/qsiprep-tool/SKILL.md +320 -0
- package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/SKILL.md +215 -0
- package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/extract_rest_mdd_phenotype.py +132 -0
- package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/harmonize_sites.py +152 -0
- package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/rest_mdd_qc_summary.py +124 -0
- package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/validate_rest_mdd.py +103 -0
- package/skills/06_fMRI_Neuroimaging/smri-skill/SKILL.md +302 -0
- package/skills/06_fMRI_Neuroimaging/tcp-skill/SKILL.md +204 -0
- package/skills/06_fMRI_Neuroimaging/tcp-skill/scripts/extract_tcp_phenotype.py +139 -0
- package/skills/06_fMRI_Neuroimaging/tcp-skill/scripts/tcp_qc_summary.py +111 -0
- package/skills/06_fMRI_Neuroimaging/tcp-skill/scripts/validate_tcp.py +99 -0
- package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/SKILL.md +217 -0
- package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/scripts/extract_ucla_cnp_phenotype.py +145 -0
- package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/scripts/ucla_cnp_qc_summary.py +111 -0
- package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/scripts/validate_ucla_cnp.py +113 -0
- package/skills/06_fMRI_Neuroimaging/ukb-skill/SKILL.md +310 -0
- package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/build_ukb_survival.py +210 -0
- package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/extract_ukb_cases.py +308 -0
- package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/extract_ukb_phenotype.py +232 -0
- package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/ukb_qc_summary.py +158 -0
- package/skills/06_fMRI_Neuroimaging/wmh-segmentation/SKILL.md +133 -0
- package/skills/07_Computational_Modeling/detrending/SKILL.md +118 -0
- package/skills/07_Computational_Modeling/dictlearning/SKILL.md +122 -0
- package/skills/07_Computational_Modeling/filtering/SKILL.md +121 -0
- package/skills/07_Computational_Modeling/glm/SKILL.md +153 -0
- package/skills/07_Computational_Modeling/hierarchical/SKILL.md +121 -0
- package/skills/07_Computational_Modeling/ica/SKILL.md +122 -0
- package/skills/07_Computational_Modeling/kmeans/SKILL.md +119 -0
- package/skills/07_Computational_Modeling/run_models/SKILL.md +427 -0
- package/skills/07_Computational_Modeling/spacenet/SKILL.md +122 -0
- package/skills/07_Computational_Modeling/svm/SKILL.md +120 -0
- package/skills/08_Computational_Neuroscience/brain_gnn/SKILL.md +183 -0
- package/skills/08_Computational_Neuroscience/dipy-tool/SKILL.md +239 -0
- package/skills/08_Computational_Neuroscience/dipy-tool/scripts/dti_metrics_reference.py +70 -0
- package/skills/08_Computational_Neuroscience/dipy-tool/scripts/load_and_mask_reference.py +76 -0
- package/skills/08_Computational_Neuroscience/dipy-tool/scripts/roi_stats_reference.py +59 -0
- package/skills/08_Computational_Neuroscience/fm_app/SKILL.md +195 -0
- package/skills/08_Computational_Neuroscience/neurostorm/SKILL.md +151 -0
- package/skills/13_Visualization/brain-visualization/SKILL.md +191 -0
- package/skills/13_Visualization/brain-visualization/scripts/connectome_reference.py +108 -0
- package/skills/13_Visualization/brain-visualization/scripts/freesurfer_ply_reference.py +54 -0
- package/skills/13_Visualization/brain-visualization/scripts/zalff_summary_reference.py +116 -0
- package/skills/13_Visualization/ethoclaw-paper-figure-layout/SKILL.md +78 -0
- package/skills/13_Visualization/ethoclaw-paper-figure-layout/assets/naturecomm_figures.tex +74 -0
- package/skills/13_Visualization/ethoclaw-paper-figure-layout/scripts/layout_results_foldered.py +579 -0
- package/skills/14_Writing/overleaf-skill/SKILL.md +184 -0
- package/skills/14_Writing/overleaf-skill/scripts/install.sh +30 -0
- package/skills/14_Writing/paper-writing/SKILL.md +146 -0
- package/skills/14_Writing/paper-writing/scripts/data_statement_templates.py +164 -0
- package/skills/14_Writing/paper-writing/scripts/figure_templates.py +315 -0
- package/skills/14_Writing/paper-writing/scripts/nature_figure_style.py +214 -0
- package/skills/14_Writing/paper-writing/scripts/section_phrasebank.py +246 -0
- package/skills/16_Animal_Behavior/deeplabcut/SKILL.md +154 -0
- package/skills/16_Animal_Behavior/deeplabcut/references/3d-pose.md +89 -0
- package/skills/16_Animal_Behavior/deeplabcut/references/maDLC.md +123 -0
- package/skills/16_Animal_Behavior/deeplabcut/references/modelzoo.md +98 -0
- package/skills/16_Animal_Behavior/deeplabcut/references/standard-pipeline.md +165 -0
- package/skills/16_Animal_Behavior/deeplabcut/references/utilities.md +146 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/SKILL.md +274 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/report_template_en.html +112 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/report_template_en.md +21 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/cluster-section.md +5 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/heatmap-section.md +5 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/integrated-interpretation.md +3 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/overview.md +3 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/project-summary.md +3 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/radar-section.md +5 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/raw-trajectory.md +3 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/sample-check.md +3 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/single-subject-section.md +3 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/stats-section.md +5 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/epm.md +52 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/fst.md +37 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/nor.md +39 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/oft.md +43 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/tcst.md +45 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/tst.md +36 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/input-types.md +59 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/interpretation-guardrails.md +45 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/metadata-schema.md +57 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/report-sections.md +86 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/section-selection-rules.md +169 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/scripts/build_report_manifest.py +27 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/scripts/render_report.py +34 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/scripts/report_utils.py +1121 -0
- package/skills/16_Animal_Behavior/ethoclaw-animal-grounding/SKILL.md +390 -0
- package/skills/16_Animal_Behavior/ethoclaw-animal-grounding/reference_code.py +98 -0
- package/skills/16_Animal_Behavior/ethoclaw-animal-pose-estimation/SKILL.md +336 -0
- package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/README.md +21 -0
- package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/SKILL.md +41 -0
- package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/batch_kinematic_generator.py +663 -0
- package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/config.json +19 -0
- package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/generate_kinematic_parameter.py +401 -0
- package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/kinematic_generator.py +265 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/SKILL.md +72 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/references/config.example.toml +56 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/scripts/cluster_all_params.py +232 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/scripts/cluster_all_params_from_config.py +236 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-radar-generate/SKILL.md +68 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-radar-generate/references/notes.md +5 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-radar-generate/scripts/plot_h5_radar.py +513 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/SKILL.md +52 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/config.toml +81 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/references/stats-rule.md +18 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/scripts/h5_inspect.py +79 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/scripts/h5_violin_batch.py +624 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/scripts/h5_violin_stats.py +438 -0
- package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/SKILL.md +280 -0
- package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/core_scripts/heatmap_trajectory.py +790 -0
- package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/core_scripts/heatmap_velocity.py +855 -0
- package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/reference_data/reference_2d.csv +101 -0
- package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/reference_data/reference_2d.h5 +0 -0
- 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}
|