@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,143 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: nii2dcm
|
|
3
|
+
description: "Use this skill whenever the user wants to convert NIfTI files (.nii or .nii.gz) to DICOM format, create DICOM series from processed neuroimaging results, write segmentation/registration/analysis outputs back to DICOM for PACS compatibility or clinical viewer comparison, or transfer metadata from reference DICOM files. Triggers include: mentions of 'NIfTI to DICOM', 'nii to dcm', 'convert nii.gz to DICOM', 'dicomify segmentation', 'nii2dcm', 'bring results back to DICOM', 'create DICOM from NIfTI', 'nii to dicom series', or any request to take post-processed neuroimaging results (segmentation, registration, bias field correction, synthesis, etc.) and store/view them alongside original patient DICOM data. Also use when modality-specific metadata (especially MR, SVR) or preservation of patient/study information from a reference DICOM is needed. Do NOT use for the reverse conversion (DICOM to NIfTI), non-medical imaging file conversions, or any clinical diagnostic or treatment-related workflows."
|
|
4
|
+
license: BSD 3-Clause (original nii2dcm license). See https://github.com/tomaroberts/nii2dcm/blob/main/LICENSE for complete terms.
|
|
5
|
+
layer: base
|
|
6
|
+
skill_type: tool
|
|
7
|
+
dependencies:
|
|
8
|
+
- claw-shell
|
|
9
|
+
---
|
|
10
|
+
# NIfTI to DICOM conversion
|
|
11
|
+
|
|
12
|
+
## Overview
|
|
13
|
+
|
|
14
|
+
A NIfTI file (.nii/.nii.gz) is a compact format widely used in neuroimaging research, typically stripped of patient metadata.
|
|
15
|
+
DICOM is the clinical standard for medical images, including rich metadata and interoperability with PACS/hospital systems.
|
|
16
|
+
|
|
17
|
+
This skill wraps `nii2dcm` (v0.1.6, May 2025) to convert NIfTI volumes into single-frame DICOM series (multi-slice 2D), primarily for MRI-derived data.
|
|
18
|
+
It supports modality-specific metadata (MR, SVR) and optional metadata transfer from a reference DICOM file.
|
|
19
|
+
|
|
20
|
+
**Research use only** — not certified for clinical diagnosis, treatment, or patient care.
|
|
21
|
+
|
|
22
|
+
## Quick Reference
|
|
23
|
+
|
|
24
|
+
| Task | Approach / Command Flag |
|
|
25
|
+
|-------------------------------|------------------------------------------|
|
|
26
|
+
| Basic conversion (generic) | `nii2dcm input.nii.gz output_dir/` |
|
|
27
|
+
| MRI multi-slice series | `--dicom-type MR` or `-d MR` |
|
|
28
|
+
| SVR (3D swept volume recon) | `--dicom-type SVR` or `-d SVR` |
|
|
29
|
+
| Copy patient/study metadata | `--ref-dicom ref.dcm` or `-r ref.dcm` |
|
|
30
|
+
| Custom series description | Add via wrapper or post-process |
|
|
31
|
+
| Verify output | Open in Horos, 3D Slicer, ITK-Snap |
|
|
32
|
+
|
|
33
|
+
## Installation
|
|
34
|
+
|
|
35
|
+
### Via pip (recommended for NeuroClaw)
|
|
36
|
+
```bash
|
|
37
|
+
pip install nii2dcm>=0.1.6
|
|
38
|
+
# or latest
|
|
39
|
+
pip install git+https://github.com/tomaroberts/nii2dcm.git
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### From source (for customization / debugging)
|
|
43
|
+
```bash
|
|
44
|
+
git clone https://github.com/tomaroberts/nii2dcm.git
|
|
45
|
+
cd nii2dcm
|
|
46
|
+
python -m venv venv
|
|
47
|
+
source venv/bin/activate
|
|
48
|
+
pip install --upgrade pip
|
|
49
|
+
pip install -r requirements.txt
|
|
50
|
+
pip install .
|
|
51
|
+
nii2dcm -h # Verify
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Core dependencies (automatically installed):
|
|
55
|
+
- highdicom >= 0.9.0
|
|
56
|
+
- SimpleITK >= 2.2.0
|
|
57
|
+
- pydicom
|
|
58
|
+
- numpy
|
|
59
|
+
|
|
60
|
+
Docker alternative (if preferred in containerized env):
|
|
61
|
+
```bash
|
|
62
|
+
docker pull ghcr.io/tomaroberts/nii2dcm:latest
|
|
63
|
+
docker tag ghcr.io/tomaroberts/nii2dcm:latest nii2dcm
|
|
64
|
+
docker run nii2dcm -v # check version
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Usage Examples
|
|
68
|
+
|
|
69
|
+
Core command pattern:
|
|
70
|
+
```bash
|
|
71
|
+
nii2dcm <input.nii[.gz]> <output_directory> [options]
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Create standard MRI DICOM series
|
|
75
|
+
```bash
|
|
76
|
+
nii2dcm processed_t1.nii.gz dicom_mr/ -d MR
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Create SVR (swept volume reconstruction) series
|
|
80
|
+
```bash
|
|
81
|
+
nii2dcm svr_recon.nii.gz dicom_svr/ -d SVR
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Generic conversion (no modality metadata)
|
|
85
|
+
```bash
|
|
86
|
+
nii2dcm seg_result.nii.gz dicom_generic/
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### With reference DICOM (copy patient/study metadata)
|
|
90
|
+
```bash
|
|
91
|
+
nii2dcm hippocampus_seg.nii.gz dicom_seg/ -d MR -r original_T1_001.dcm
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Transferred attributes (from DicomMRI class, see source):
|
|
95
|
+
- PatientName, PatientID, PatientBirthDate, PatientSex
|
|
96
|
+
- StudyInstanceUID, StudyDate, StudyTime, StudyDescription
|
|
97
|
+
- SeriesInstanceUID, SeriesNumber, SeriesDescription, etc.
|
|
98
|
+
(Full list: https://github.com/tomaroberts/nii2dcm/blob/main/nii2dcm/dcm.py#L236)
|
|
99
|
+
|
|
100
|
+
### NeuroClaw recommended wrapper (simpler for agent calling)
|
|
101
|
+
Use a thin wrapper script (to be provided in skill dir):
|
|
102
|
+
```bash
|
|
103
|
+
python nii2dcm_wrapper.py \
|
|
104
|
+
--input seg_postop.nii.gz \
|
|
105
|
+
--output-dir dicom_results/ \
|
|
106
|
+
--modality MR \
|
|
107
|
+
--ref-dcm ref_series/0001.dcm \
|
|
108
|
+
--series-desc "U-Net v3 Segmentation"
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Important Notes & Limitations
|
|
112
|
+
|
|
113
|
+
- Supports only **3D single-volume → multi-slice 2D DICOM series** (common in structural MRI, segmentations)
|
|
114
|
+
- **No 4D support** (fMRI, DWI, perfusion, DTI) — split volumes first if needed
|
|
115
|
+
- Without `--dicom-type`, output is generic (lacks modality-specific tags)
|
|
116
|
+
- Without `--ref-dicom`, patient/study info is anonymized/generic
|
|
117
|
+
- Orientation, spacing, slice thickness read from NIfTI; verify alignment
|
|
118
|
+
- **Always visually validate** output in DICOM viewer (Horos, 3D Slicer, ITK-Snap, MITK)
|
|
119
|
+
- Project still in early stage — expect occasional bugs
|
|
120
|
+
- **Research purpose only** — not a clinical tool
|
|
121
|
+
|
|
122
|
+
## When to Call This Skill
|
|
123
|
+
|
|
124
|
+
- Finished NIfTI-space processing (bias correction, registration, segmentation, synthesis, etc.)
|
|
125
|
+
- Need to compare AI/model outputs visually with original clinical DICOM images
|
|
126
|
+
- Want to store results in same format/framework as source study
|
|
127
|
+
- Preparing outputs for PACS import, clinical collaboration, or archiving
|
|
128
|
+
|
|
129
|
+
## Complementary / Related Skills
|
|
130
|
+
- `dependency-planner` → install dependencies
|
|
131
|
+
- `claw-shell` → safe execution of conversion commands
|
|
132
|
+
|
|
133
|
+
## Reference
|
|
134
|
+
|
|
135
|
+
Original: https://github.com/tomaroberts/nii2dcm (v0.1.6, May 2025)
|
|
136
|
+
Built on: highdicom (DICOM creation), SimpleITK (image I/O)
|
|
137
|
+
Inspired by: dcm2niix (reverse tool), SVRTK project
|
|
138
|
+
|
|
139
|
+
Report issues or request extensions (e.g., CT support, 4D handling) in NeuroClaw repo.
|
|
140
|
+
|
|
141
|
+
Created At: 2026-03-18 20:09 HKT
|
|
142
|
+
Last Updated At: 2026-03-26 00:21 HKT
|
|
143
|
+
Author: chengwang96
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: nilearn-tool
|
|
3
|
+
description: "Use this skill whenever any NeuroClaw fMRI modality skill needs to execute concrete Nilearn operations: ROI/atlas time-series extraction, confounds handling (fMRIPrep), seed-based connectivity maps, ROI-to-ROI connectivity matrices, and optional GLM/decoding utilities. This is the dedicated base/tool skill that contains Nilearn usage patterns and lightweight wrappers. Never called directly by the user."
|
|
4
|
+
license: MIT License (NeuroClaw custom skill – freely modifiable within the project)
|
|
5
|
+
layer: base
|
|
6
|
+
skill_type: tool
|
|
7
|
+
dependencies:
|
|
8
|
+
- claw-shell
|
|
9
|
+
---
|
|
10
|
+
# Nilearn Tool (Base/Tool Layer)
|
|
11
|
+
|
|
12
|
+
## Overview
|
|
13
|
+
`nilearn-tool` is the **NeuroClaw base/tool skill** that implements concrete **Nilearn** workflows for turning **preprocessed BOLD** into features (ROI time series, connectivity matrices, seed maps) and optional statistical modeling (GLM).
|
|
14
|
+
|
|
15
|
+
It is **never called directly by the user**. It is delegated to by `fmri-skill` (or other interface/modality skills) and executed via `claw-shell`.
|
|
16
|
+
|
|
17
|
+
**Research use only.**
|
|
18
|
+
|
|
19
|
+
## Agent Reference Rule
|
|
20
|
+
|
|
21
|
+
When the agent needs Nilearn-based implementation code, it should first consult the curated snippets in `skills/nilearn-tool/scripts/` instead of copying directly from long tutorial scripts with hard-coded paths.
|
|
22
|
+
|
|
23
|
+
Reference snippets available:
|
|
24
|
+
- `scripts/preprocess_bold_reference.py` -> dummy removal, smoothing, band-pass filtering, MNI resampling
|
|
25
|
+
- `scripts/connectome_reference.py` -> atlas ROI extraction and ROI-to-ROI connectivity export
|
|
26
|
+
- `scripts/zalff_summary_reference.py` -> MNI resampling, zALFF summary, atlas-level regional export
|
|
27
|
+
- `scripts/task_glm_reference.py` -> first-level task GLM with design matrix and contrast maps
|
|
28
|
+
- `scripts/second_level_glm_reference.py` -> group-level GLM from subject contrast maps
|
|
29
|
+
- `scripts/rest_ica_reference.py` -> resting-state CanICA component extraction
|
|
30
|
+
- `scripts/rest_dictlearning_reference.py` -> resting-state DictLearning component extraction
|
|
31
|
+
- `scripts/svm_classifier_reference.py` -> ROI/tabular disease classification with SVM
|
|
32
|
+
- `scripts/spacenet_classifier_reference.py` -> voxel-wise disease classification with SpaceNet
|
|
33
|
+
- `scripts/kmeans_parcellation_reference.py` -> mask-based K-means brain parcellation
|
|
34
|
+
- `scripts/hierarchical_parcellation_reference.py` -> mask-based hierarchical brain parcellation
|
|
35
|
+
- `scripts/denoise_timeseries_reference.py` -> confound regression and detrending with `clean_img`
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Scope (What this tool does / does not do)
|
|
40
|
+
|
|
41
|
+
### ✅ This tool does
|
|
42
|
+
- Load BOLD NIfTI and (optional) brain mask.
|
|
43
|
+
- Load fMRIPrep confounds TSV and apply common denoising regressors.
|
|
44
|
+
- Extract ROI time series from an atlas/parcellation.
|
|
45
|
+
- Compute ROI-to-ROI functional connectivity matrices.
|
|
46
|
+
- Compute seed-to-voxel connectivity maps.
|
|
47
|
+
- (Optional) Run first-/second-level GLM when events/maps are provided.
|
|
48
|
+
|
|
49
|
+
### ❌ This tool does NOT do
|
|
50
|
+
- Raw fMRI preprocessing (slice timing, motion correction, susceptibility distortion correction, eddy/topup, etc.).
|
|
51
|
+
Those belong to `fmriprep-tool`, `hcppipeline-tool`, `fsl-tool`.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Core Outputs (Typical)
|
|
56
|
+
- `roi_timeseries.csv` (T × R)
|
|
57
|
+
- `connectome.npy` / `connectome.csv` (R × R)
|
|
58
|
+
- `seed_zmap.nii.gz`
|
|
59
|
+
- (Optional) `first_level_zmap.nii.gz`, `second_level_zmap.nii.gz`
|
|
60
|
+
- Optional figures: connectome matrix PNG, connectome graph PNG, stat map PNG
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Minimal Nilearn Usage Patterns (Short Snippets)
|
|
65
|
+
|
|
66
|
+
### 1) fMRIPrep confounds (recommended)
|
|
67
|
+
```python
|
|
68
|
+
from nilearn.interfaces.fmriprep import load_confounds
|
|
69
|
+
confounds, sample_mask = load_confounds(confounds_tsv, strategy=["motion", "wm_csf"])
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### 2) ROI time series (atlas/parcellation)
|
|
73
|
+
```python
|
|
74
|
+
from nilearn.maskers import NiftiLabelsMasker
|
|
75
|
+
masker = NiftiLabelsMasker(labels_img=atlas_img, t_r=tr, standardize=True, detrend=True)
|
|
76
|
+
roi_ts = masker.fit_transform(bold_img, confounds=confounds, sample_mask=sample_mask) # (T, R)
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### 3) ROI-to-ROI connectivity
|
|
80
|
+
```python
|
|
81
|
+
from nilearn.connectome import ConnectivityMeasure
|
|
82
|
+
conn = ConnectivityMeasure(kind="correlation").fit_transform([roi_ts])[0] # (R, R)
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### 4) Seed-to-voxel connectivity (concept)
|
|
86
|
+
- Use `NiftiSpheresMasker` for seed TS, `NiftiMasker` for voxel TS, then correlate and Fisher-z.
|
|
87
|
+
|
|
88
|
+
## Curated Reference Snippets
|
|
89
|
+
|
|
90
|
+
These scripts are distilled from `rs-fMRI-Pipeline-Tutorial/` and should be the preferred starting point for new code in this skill:
|
|
91
|
+
|
|
92
|
+
### `scripts/preprocess_bold_reference.py`
|
|
93
|
+
- Covers the Nilearn-centric part of resting-state preprocessing shown in `multimodal_brain_connectivity_pipeline.py`
|
|
94
|
+
- Includes dummy-scan removal, spatial smoothing, temporal band-pass filtering, and MNI152 resampling
|
|
95
|
+
|
|
96
|
+
Example:
|
|
97
|
+
```bash
|
|
98
|
+
python skills/nilearn-tool/scripts/preprocess_bold_reference.py \
|
|
99
|
+
--bold path/to/rest_bold.nii.gz \
|
|
100
|
+
--output fmri_output/sub-001/nilearn/preprocessed_bold_mni.nii.gz
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### `scripts/connectome_reference.py`
|
|
104
|
+
- Extracts atlas ROI time series with `NiftiLabelsMasker`
|
|
105
|
+
- Computes ROI-to-ROI connectivity with `ConnectivityMeasure`
|
|
106
|
+
- Exports `roi_timeseries.csv`, `connectome.npy`, and `connectome.csv`
|
|
107
|
+
|
|
108
|
+
Example:
|
|
109
|
+
```bash
|
|
110
|
+
python skills/nilearn-tool/scripts/connectome_reference.py \
|
|
111
|
+
--bold path/to/preprocessed_bold_mni.nii.gz \
|
|
112
|
+
--atlas path/to/AAL3v1.nii \
|
|
113
|
+
--labels path/to/AAL3v1.nii.txt \
|
|
114
|
+
--output-dir fmri_output/sub-001/nilearn/connectome
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### `scripts/zalff_summary_reference.py`
|
|
118
|
+
- Adapts the regional zALFF summarization logic from `MNI152_zALFF_Brain_Region_Activation_Analysis.py`
|
|
119
|
+
- Uses Nilearn resampling, cleaning, and `NiftiLabelsMasker` for atlas-level reporting
|
|
120
|
+
|
|
121
|
+
Example:
|
|
122
|
+
```bash
|
|
123
|
+
python skills/nilearn-tool/scripts/zalff_summary_reference.py \
|
|
124
|
+
--bold path/to/rest_bold.nii.gz \
|
|
125
|
+
--atlas path/to/AAL3v1.nii \
|
|
126
|
+
--labels path/to/AAL3v1.nii.txt \
|
|
127
|
+
--mask path/to/mni_mask.nii.gz \
|
|
128
|
+
--output-dir fmri_output/sub-001/nilearn/zalff
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Additional model-routing snippets
|
|
132
|
+
- `scripts/task_glm_reference.py` -> first-level task GLM
|
|
133
|
+
- `scripts/second_level_glm_reference.py` -> second-level / group GLM
|
|
134
|
+
- `scripts/rest_ica_reference.py` -> resting-state ICA decomposition
|
|
135
|
+
- `scripts/rest_dictlearning_reference.py` -> resting-state DictLearning decomposition
|
|
136
|
+
- `scripts/svm_classifier_reference.py` -> tabular / ROI SVM classifier
|
|
137
|
+
- `scripts/spacenet_classifier_reference.py` -> voxel-wise SpaceNet classifier
|
|
138
|
+
- `scripts/kmeans_parcellation_reference.py` -> K-means parcellation from masked image features
|
|
139
|
+
- `scripts/hierarchical_parcellation_reference.py` -> Hierarchical parcellation from masked image features
|
|
140
|
+
- `scripts/denoise_timeseries_reference.py` -> confound-aware detrending and time-series cleaning
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## Wrapper Entry (Recommended)
|
|
145
|
+
This tool should expose a **small CLI wrapper** (implementation kept in a separate file, not embedded here):
|
|
146
|
+
- File: `skills/nilearn-tool/nilearn_pipeline.py`
|
|
147
|
+
- Subcommands (recommended):
|
|
148
|
+
- `roi-ts` → extract ROI time series
|
|
149
|
+
- `connectome` → compute connectivity matrix from ROI TS
|
|
150
|
+
- `seed-corr` → seed connectivity z-map
|
|
151
|
+
- `first-glm` / `second-glm` (optional)
|
|
152
|
+
|
|
153
|
+
**All execution must be routed through `claw-shell`.**
|
|
154
|
+
|
|
155
|
+
Example calls:
|
|
156
|
+
```bash
|
|
157
|
+
conda run -n neuroclaw-nilearn python skills/nilearn-tool/nilearn_pipeline.py roi-ts \
|
|
158
|
+
--bold <preproc_bold.nii.gz> --confounds <confounds.tsv> --tr 2.0 --atlas schaefer_2018_200_7 \
|
|
159
|
+
--outdir fmri_output/sub-001/nilearn/roi_ts
|
|
160
|
+
|
|
161
|
+
conda run -n neuroclaw-nilearn python skills/nilearn-tool/nilearn_pipeline.py connectome \
|
|
162
|
+
--roi-timeseries fmri_output/sub-001/nilearn/roi_ts/roi_timeseries.csv --kind correlation \
|
|
163
|
+
--outdir fmri_output/sub-001/nilearn/connectome
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## Installation (Handled by `dependency-planner`)
|
|
169
|
+
Recommended isolated environment:
|
|
170
|
+
```bash
|
|
171
|
+
conda create -n neuroclaw-nilearn python=3.11 -y
|
|
172
|
+
conda install -n neuroclaw-nilearn -c conda-forge nilearn nibabel numpy scipy pandas scikit-learn matplotlib -y
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## Safety / Execution Rules (NeuroClaw)
|
|
178
|
+
- No direct `subprocess.run()` for long operations in this skill.
|
|
179
|
+
- All shell commands go through `claw-shell`.
|
|
180
|
+
- Always produce outputs under `fmri_output/.../nilearn/...` with deterministic filenames.
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## Complementary / Related Skills
|
|
185
|
+
- `dependency-planner` + `conda-env-manager` → install/manage `neuroclaw-nilearn`
|
|
186
|
+
- `claw-shell` → mandatory execution layer
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## Reference
|
|
191
|
+
- Nilearn documentation: https://nilearn.github.io/
|
|
192
|
+
- fMRIPrep confounds interface: Nilearn `nilearn.interfaces.fmriprep`
|
|
193
|
+
- Curated code snippets in this skill:
|
|
194
|
+
- `skills/nilearn-tool/scripts/preprocess_bold_reference.py`
|
|
195
|
+
- `skills/nilearn-tool/scripts/connectome_reference.py`
|
|
196
|
+
- `skills/nilearn-tool/scripts/zalff_summary_reference.py`
|
|
197
|
+
- `skills/nilearn-tool/scripts/task_glm_reference.py`
|
|
198
|
+
- `skills/nilearn-tool/scripts/second_level_glm_reference.py`
|
|
199
|
+
- `skills/nilearn-tool/scripts/rest_ica_reference.py`
|
|
200
|
+
- `skills/nilearn-tool/scripts/rest_dictlearning_reference.py`
|
|
201
|
+
- `skills/nilearn-tool/scripts/svm_classifier_reference.py`
|
|
202
|
+
- `skills/nilearn-tool/scripts/spacenet_classifier_reference.py`
|
|
203
|
+
- `skills/nilearn-tool/scripts/kmeans_parcellation_reference.py`
|
|
204
|
+
- `skills/nilearn-tool/scripts/hierarchical_parcellation_reference.py`
|
|
205
|
+
- `skills/nilearn-tool/scripts/denoise_timeseries_reference.py`
|
|
206
|
+
|
|
207
|
+
## Post-Execution Verification (Harness Integration)
|
|
208
|
+
|
|
209
|
+
After Nilearn processing completes, this skill **automatically invokes harness-core's VerificationRunner** to validate output integrity:
|
|
210
|
+
|
|
211
|
+
**Integrated verification checks**:
|
|
212
|
+
|
|
213
|
+
```python
|
|
214
|
+
from skills.harness_core import VerificationRunner, AuditLogger
|
|
215
|
+
|
|
216
|
+
verifier = VerificationRunner(task_type="nilearn_processing")
|
|
217
|
+
|
|
218
|
+
# 1. ROI time series shape and completeness
|
|
219
|
+
verifier.add_check("roi_timeseries",
|
|
220
|
+
checker=lambda: verify_roi_timeseries(output_dir),
|
|
221
|
+
severity="error"
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
# 2. Confounds loading and application
|
|
225
|
+
verifier.add_check("confounds_handling",
|
|
226
|
+
checker=lambda: verify_confounds_applied(output_dir),
|
|
227
|
+
severity="warning"
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
# 3. Connectivity matrix dimensionality (N_ROI × N_ROI)
|
|
231
|
+
verifier.add_check("connectivity_shape",
|
|
232
|
+
checker=lambda: verify_connectome_shape(output_dir),
|
|
233
|
+
severity="error"
|
|
234
|
+
)
|
|
235
|
+
|
|
236
|
+
# 4. Correlation bounds (-1 to +1)
|
|
237
|
+
verifier.add_check("correlation_bounds",
|
|
238
|
+
checker=lambda: verify_correlation_bounds(output_dir),
|
|
239
|
+
severity="warning"
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
# 5. Data integrity (NaN/Inf checks)
|
|
243
|
+
verifier.add_check("data_integrity",
|
|
244
|
+
checker=lambda: verify_no_nan_inf(output_dir),
|
|
245
|
+
severity="error"
|
|
246
|
+
)
|
|
247
|
+
|
|
248
|
+
report = verifier.run(output_dir)
|
|
249
|
+
|
|
250
|
+
# Log verification results
|
|
251
|
+
logger = AuditLogger(log_file=f"{output_dir}/nilearn_verification.jsonl")
|
|
252
|
+
logger.log_validation(
|
|
253
|
+
task_name="nilearn_processing",
|
|
254
|
+
checks_passed=len([r for r in report.results if r.passed]),
|
|
255
|
+
total_checks=len(report.results),
|
|
256
|
+
output_path=output_dir
|
|
257
|
+
)
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
**Output**: `fmri_output/nilearn_verification.jsonl` (structured audit log with JSONL format)
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
Created At: 2026-03-26 00:54 HKT
|
|
265
|
+
Last Updated At: 2026-04-14 00:26 HKT
|
|
266
|
+
Author: chengwang96
|
|
@@ -0,0 +1,65 @@
|
|
|
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.connectome import ConnectivityMeasure
|
|
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 export_connectome(
|
|
19
|
+
bold_path: Path,
|
|
20
|
+
atlas_path: Path,
|
|
21
|
+
output_dir: Path,
|
|
22
|
+
tr: float,
|
|
23
|
+
label_path: Path | None = None,
|
|
24
|
+
) -> None:
|
|
25
|
+
bold_img = nib.load(str(bold_path))
|
|
26
|
+
masker = NiftiLabelsMasker(labels_img=str(atlas_path), t_r=tr, standardize=True, detrend=True)
|
|
27
|
+
roi_time_series = masker.fit_transform(bold_img)
|
|
28
|
+
|
|
29
|
+
connectome = ConnectivityMeasure(kind="correlation").fit_transform([roi_time_series])[0]
|
|
30
|
+
output_dir.mkdir(parents=True, exist_ok=True)
|
|
31
|
+
|
|
32
|
+
np.save(output_dir / "connectome.npy", connectome)
|
|
33
|
+
pd.DataFrame(roi_time_series).to_csv(output_dir / "roi_timeseries.csv", index=False)
|
|
34
|
+
|
|
35
|
+
if label_path is not None:
|
|
36
|
+
labels = load_labels(label_path)
|
|
37
|
+
count = min(len(labels), connectome.shape[0])
|
|
38
|
+
pd.DataFrame(connectome[:count, :count], index=labels[:count], columns=labels[:count]).to_csv(
|
|
39
|
+
output_dir / "connectome.csv"
|
|
40
|
+
)
|
|
41
|
+
else:
|
|
42
|
+
pd.DataFrame(connectome).to_csv(output_dir / "connectome.csv", index=False)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def main() -> None:
|
|
46
|
+
parser = argparse.ArgumentParser(description="Reference Nilearn snippet for ROI extraction and connectome computation.")
|
|
47
|
+
parser.add_argument("--bold", type=Path, required=True, help="Input preprocessed BOLD NIfTI.")
|
|
48
|
+
parser.add_argument("--atlas", type=Path, required=True, help="Atlas NIfTI for ROI extraction.")
|
|
49
|
+
parser.add_argument("--output-dir", type=Path, required=True, help="Directory for ROI and connectome outputs.")
|
|
50
|
+
parser.add_argument("--tr", type=float, default=1.0, help="Repetition time in seconds.")
|
|
51
|
+
parser.add_argument("--labels", type=Path, default=None, help="Optional atlas label text file.")
|
|
52
|
+
args = parser.parse_args()
|
|
53
|
+
|
|
54
|
+
export_connectome(
|
|
55
|
+
bold_path=args.bold,
|
|
56
|
+
atlas_path=args.atlas,
|
|
57
|
+
output_dir=args.output_dir,
|
|
58
|
+
tr=args.tr,
|
|
59
|
+
label_path=args.labels,
|
|
60
|
+
)
|
|
61
|
+
print(f"Saved connectome outputs to: {args.output_dir}")
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
if __name__ == "__main__":
|
|
65
|
+
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 import image
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def run_denoising(
|
|
12
|
+
bold_path: Path,
|
|
13
|
+
output_dir: Path,
|
|
14
|
+
tr: float,
|
|
15
|
+
confounds_path: Path | None = None,
|
|
16
|
+
mask_path: Path | None = None,
|
|
17
|
+
detrend: bool = False,
|
|
18
|
+
standardize: bool = True,
|
|
19
|
+
) -> None:
|
|
20
|
+
output_dir.mkdir(parents=True, exist_ok=True)
|
|
21
|
+
|
|
22
|
+
confounds = pd.read_csv(confounds_path, sep=None, engine="python") if confounds_path is not None else None
|
|
23
|
+
cleaned = image.clean_img(
|
|
24
|
+
str(bold_path),
|
|
25
|
+
confounds=confounds,
|
|
26
|
+
detrend=detrend,
|
|
27
|
+
standardize=standardize,
|
|
28
|
+
mask_img=str(mask_path) if mask_path is not None else None,
|
|
29
|
+
t_r=tr,
|
|
30
|
+
)
|
|
31
|
+
nib.save(cleaned, str(output_dir / "cleaned_bold.nii.gz"))
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def main() -> None:
|
|
35
|
+
parser = argparse.ArgumentParser(description="Reference Nilearn snippet for confound regression and detrending.")
|
|
36
|
+
parser.add_argument("--bold", type=Path, required=True, help="Input preprocessed BOLD image.")
|
|
37
|
+
parser.add_argument("--output-dir", type=Path, required=True, help="Directory for cleaned outputs.")
|
|
38
|
+
parser.add_argument("--tr", type=float, required=True, help="Repetition time in seconds.")
|
|
39
|
+
parser.add_argument("--confounds", type=Path, default=None, help="Optional confounds TSV/CSV.")
|
|
40
|
+
parser.add_argument("--mask", type=Path, default=None, help="Optional mask image.")
|
|
41
|
+
parser.add_argument("--detrend", action="store_true", help="Enable temporal detrending.")
|
|
42
|
+
parser.add_argument("--no-standardize", action="store_true", help="Disable standardization.")
|
|
43
|
+
args = parser.parse_args()
|
|
44
|
+
|
|
45
|
+
run_denoising(
|
|
46
|
+
bold_path=args.bold,
|
|
47
|
+
output_dir=args.output_dir,
|
|
48
|
+
tr=args.tr,
|
|
49
|
+
confounds_path=args.confounds,
|
|
50
|
+
mask_path=args.mask,
|
|
51
|
+
detrend=args.detrend,
|
|
52
|
+
standardize=not args.no_standardize,
|
|
53
|
+
)
|
|
54
|
+
print(f"Saved cleaned outputs to: {args.output_dir}")
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
if __name__ == "__main__":
|
|
58
|
+
main()
|
package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/hierarchical_parcellation_reference.py
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
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.maskers import NiftiMasker
|
|
10
|
+
from sklearn.cluster import AgglomerativeClustering
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def load_image_list(list_path: Path) -> list[str]:
|
|
14
|
+
with list_path.open("r", encoding="utf-8") as handle:
|
|
15
|
+
return [line.strip() for line in handle if line.strip()]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def build_feature_matrix(images: list[str], masker: NiftiMasker) -> np.ndarray:
|
|
19
|
+
subject_vectors = [masker.fit_transform(image_path) for image_path in images]
|
|
20
|
+
stacked = np.vstack(subject_vectors)
|
|
21
|
+
return stacked.reshape(len(images), -1, stacked.shape[-1]).mean(axis=0)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def run_hierarchical(input_list: Path, output_dir: Path, n_clusters: int, mask_path: Path) -> None:
|
|
25
|
+
output_dir.mkdir(parents=True, exist_ok=True)
|
|
26
|
+
images = load_image_list(input_list)
|
|
27
|
+
|
|
28
|
+
masker = NiftiMasker(mask_img=str(mask_path), standardize=True)
|
|
29
|
+
features = build_feature_matrix(images, masker)
|
|
30
|
+
model = AgglomerativeClustering(n_clusters=n_clusters, linkage="ward")
|
|
31
|
+
labels = model.fit_predict(features)
|
|
32
|
+
|
|
33
|
+
label_img = masker.inverse_transform(labels[:, None].astype(float))
|
|
34
|
+
nib.save(label_img, str(output_dir / "parcel_labels.nii.gz"))
|
|
35
|
+
pd.DataFrame({"cluster": np.arange(n_clusters), "size": np.bincount(labels, minlength=n_clusters)}).to_csv(
|
|
36
|
+
output_dir / "cluster_summary.csv", index=False
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def main() -> None:
|
|
41
|
+
parser = argparse.ArgumentParser(description="Reference snippet for hierarchical neuroimaging parcellation.")
|
|
42
|
+
parser.add_argument("--input-list", type=Path, required=True, help="Text file listing aligned images.")
|
|
43
|
+
parser.add_argument("--mask", type=Path, required=True, help="Mask image defining spatial units.")
|
|
44
|
+
parser.add_argument("--n-clusters", type=int, required=True, help="Number of clusters / parcels.")
|
|
45
|
+
parser.add_argument("--output-dir", type=Path, required=True, help="Directory for parcellation outputs.")
|
|
46
|
+
args = parser.parse_args()
|
|
47
|
+
|
|
48
|
+
run_hierarchical(args.input_list, args.output_dir, args.n_clusters, args.mask)
|
|
49
|
+
print(f"Saved hierarchical parcellation outputs to: {args.output_dir}")
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
if __name__ == "__main__":
|
|
53
|
+
main()
|
|
@@ -0,0 +1,53 @@
|
|
|
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.maskers import NiftiMasker
|
|
10
|
+
from sklearn.cluster import KMeans
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def load_image_list(list_path: Path) -> list[str]:
|
|
14
|
+
with list_path.open("r", encoding="utf-8") as handle:
|
|
15
|
+
return [line.strip() for line in handle if line.strip()]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def build_feature_matrix(images: list[str], masker: NiftiMasker) -> np.ndarray:
|
|
19
|
+
subject_vectors = [masker.fit_transform(image_path) for image_path in images]
|
|
20
|
+
stacked = np.vstack(subject_vectors)
|
|
21
|
+
return stacked.reshape(len(images), -1, stacked.shape[-1]).mean(axis=0)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def run_kmeans(input_list: Path, output_dir: Path, n_clusters: int, mask_path: Path) -> None:
|
|
25
|
+
output_dir.mkdir(parents=True, exist_ok=True)
|
|
26
|
+
images = load_image_list(input_list)
|
|
27
|
+
|
|
28
|
+
masker = NiftiMasker(mask_img=str(mask_path), standardize=True)
|
|
29
|
+
features = build_feature_matrix(images, masker)
|
|
30
|
+
model = KMeans(n_clusters=n_clusters, random_state=0, n_init=10)
|
|
31
|
+
labels = model.fit_predict(features)
|
|
32
|
+
|
|
33
|
+
label_img = masker.inverse_transform(labels[:, None].astype(float))
|
|
34
|
+
nib.save(label_img, str(output_dir / "parcel_labels.nii.gz"))
|
|
35
|
+
pd.DataFrame({"cluster": np.arange(n_clusters), "size": np.bincount(labels, minlength=n_clusters)}).to_csv(
|
|
36
|
+
output_dir / "cluster_summary.csv", index=False
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def main() -> None:
|
|
41
|
+
parser = argparse.ArgumentParser(description="Reference snippet for K-means-based neuroimaging parcellation.")
|
|
42
|
+
parser.add_argument("--input-list", type=Path, required=True, help="Text file listing aligned images.")
|
|
43
|
+
parser.add_argument("--mask", type=Path, required=True, help="Mask image defining spatial units.")
|
|
44
|
+
parser.add_argument("--n-clusters", type=int, required=True, help="Number of clusters / parcels.")
|
|
45
|
+
parser.add_argument("--output-dir", type=Path, required=True, help="Directory for parcellation outputs.")
|
|
46
|
+
args = parser.parse_args()
|
|
47
|
+
|
|
48
|
+
run_kmeans(args.input_list, args.output_dir, args.n_clusters, args.mask)
|
|
49
|
+
print(f"Saved K-means parcellation outputs to: {args.output_dir}")
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
if __name__ == "__main__":
|
|
53
|
+
main()
|