@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,224 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Compute CBF (Cerebral Blood Flow) maps from ASL perfusion MRI.
|
|
3
|
+
|
|
4
|
+
Implements the Buxton single-compartment model for pCASL/CASL/PASL
|
|
5
|
+
quantification. Outputs CBF map as NIfTI and optional ROI summary as CSV.
|
|
6
|
+
"""
|
|
7
|
+
import argparse
|
|
8
|
+
import sys
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import Dict, List, Optional
|
|
11
|
+
|
|
12
|
+
try:
|
|
13
|
+
import numpy as np
|
|
14
|
+
except ImportError:
|
|
15
|
+
print("Error: numpy is required.", file=sys.stderr)
|
|
16
|
+
sys.exit(1)
|
|
17
|
+
|
|
18
|
+
try:
|
|
19
|
+
import nibabel as nib
|
|
20
|
+
except ImportError:
|
|
21
|
+
print("Error: nibabel is required.", file=sys.stderr)
|
|
22
|
+
sys.exit(1)
|
|
23
|
+
|
|
24
|
+
# Physical constants
|
|
25
|
+
DEFAULT_PARAMS = {
|
|
26
|
+
"pcasl": {"alpha": 0.85, "tau": 1.8, "pld": 1.8},
|
|
27
|
+
"casl": {"alpha": 0.95, "tau": 2.0, "pld": 1.5},
|
|
28
|
+
"pasl": {"alpha": 0.98, "tau": 0.7, "pld": 1.8},
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
# T1 of arterial blood (seconds)
|
|
32
|
+
T1B = {1.5: 1.35, 3.0: 1.65, 7.0: 2.1}
|
|
33
|
+
|
|
34
|
+
# Blood-tissue water partition coefficient (mL/g)
|
|
35
|
+
LAMBDA = 0.9
|
|
36
|
+
|
|
37
|
+
# Conversion factor: mL/g/s -> mL/100g/min
|
|
38
|
+
CONVERSION = 6000
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def compute_cbf_pcasl_casl(
|
|
42
|
+
diff_data: np.ndarray,
|
|
43
|
+
m0_data: np.ndarray,
|
|
44
|
+
alpha: float,
|
|
45
|
+
tau: float,
|
|
46
|
+
pld: float,
|
|
47
|
+
t1b: float,
|
|
48
|
+
) -> np.ndarray:
|
|
49
|
+
"""Compute CBF from pCASL/CASL using the Buxton model.
|
|
50
|
+
|
|
51
|
+
CBF = (6000 * ΔM * λ) / (2 * α * M0 * T1b * (exp(-w/T1b) - exp(-(τ+w)/T1b)))
|
|
52
|
+
|
|
53
|
+
Returns CBF in mL/100g/min.
|
|
54
|
+
"""
|
|
55
|
+
m0_safe = np.where(m0_data > 0, m0_data, 1.0)
|
|
56
|
+
numerator = CONVERSION * diff_data * LAMBDA
|
|
57
|
+
denominator = 2.0 * alpha * m0_safe * t1b * (np.exp(-pld / t1b) - np.exp(-(tau + pld) / t1b))
|
|
58
|
+
|
|
59
|
+
cbf = np.where(m0_data > 0, numerator / denominator, 0.0)
|
|
60
|
+
return cbf
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def compute_cbf_pasl(
|
|
64
|
+
diff_data: np.ndarray,
|
|
65
|
+
m0_data: np.ndarray,
|
|
66
|
+
alpha: float,
|
|
67
|
+
ti1: float,
|
|
68
|
+
ti2: float,
|
|
69
|
+
t1b: float,
|
|
70
|
+
bolus_thickness: float = 0.15,
|
|
71
|
+
) -> np.ndarray:
|
|
72
|
+
"""Compute CBF from PASL (QUIPSS II).
|
|
73
|
+
|
|
74
|
+
CBF = (6000 * ΔM * λ * TI1) / (2 * α * M0 * T1b * (TI2 - TI1) * exp(-TI2/T1b))
|
|
75
|
+
|
|
76
|
+
Returns CBF in mL/100g/min.
|
|
77
|
+
"""
|
|
78
|
+
m0_safe = np.where(m0_data > 0, m0_data, 1.0)
|
|
79
|
+
numerator = CONVERSION * diff_data * LAMBDA * ti1
|
|
80
|
+
denominator = 2.0 * alpha * m0_safe * t1b * (ti2 - ti1) * np.exp(-ti2 / t1b)
|
|
81
|
+
|
|
82
|
+
cbf = np.where(m0_data > 0, numerator / denominator, 0.0)
|
|
83
|
+
return cbf
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def extract_roi_mean(data: np.ndarray, atlas: np.ndarray, labels: Optional[List[int]] = None) -> Dict[int, float]:
|
|
87
|
+
"""Extract mean CBF for each ROI in the atlas."""
|
|
88
|
+
unique_labels = np.unique(atlas[atlas > 0]).astype(int)
|
|
89
|
+
if labels is not None:
|
|
90
|
+
unique_labels = [l for l in unique_labels if l in labels]
|
|
91
|
+
|
|
92
|
+
results = {}
|
|
93
|
+
for label in unique_labels:
|
|
94
|
+
mask = atlas == label
|
|
95
|
+
values = data[mask]
|
|
96
|
+
values = values[~np.isnan(values)]
|
|
97
|
+
if len(values) > 0:
|
|
98
|
+
results[int(label)] = float(np.mean(values))
|
|
99
|
+
return results
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def main() -> int:
|
|
103
|
+
parser = argparse.ArgumentParser(
|
|
104
|
+
description="Compute CBF maps from ASL perfusion MRI."
|
|
105
|
+
)
|
|
106
|
+
parser.add_argument("--diff", required=True, help="Path to ASL difference image (control - label)")
|
|
107
|
+
parser.add_argument("--m0", help="Path to M0 reference image (required for absolute CBF)")
|
|
108
|
+
parser.add_argument("--output", required=True, help="Output path for CBF map NIfTI")
|
|
109
|
+
parser.add_argument("--roi-summary", help="Optional: output path for ROI summary CSV")
|
|
110
|
+
parser.add_argument("--roi-atlas", help="Optional: path to atlas NIfTI for ROI extraction")
|
|
111
|
+
parser.add_argument("--roi-labels", help="Optional: comma-separated ROI label IDs to extract")
|
|
112
|
+
parser.add_argument("--label-strategy", default="pcasl", choices=["pcasl", "casl", "pasl"],
|
|
113
|
+
help="ASL labeling strategy (default: pcasl)")
|
|
114
|
+
parser.add_argument("--alpha", type=float, help="Labeling efficiency (overrides default)")
|
|
115
|
+
parser.add_argument("--tau", type=float, help="Label duration in seconds (overrides default)")
|
|
116
|
+
parser.add_argument("--pld", type=float, help="Post-labeling delay in seconds (overrides default)")
|
|
117
|
+
parser.add_argument("--field-strength", type=float, default=3.0, choices=[1.5, 3.0, 7.0],
|
|
118
|
+
help="MRI field strength in Tesla (default: 3.0)")
|
|
119
|
+
parser.add_argument("--no-m0", action="store_true", help="Compute relative CBF without M0 normalization")
|
|
120
|
+
args = parser.parse_args()
|
|
121
|
+
|
|
122
|
+
diff_path = Path(args.diff).resolve()
|
|
123
|
+
if not diff_path.exists():
|
|
124
|
+
print(f"Difference image not found: {diff_path}", file=sys.stderr)
|
|
125
|
+
return 1
|
|
126
|
+
|
|
127
|
+
# Load ASL difference image
|
|
128
|
+
print(f"Loading ASL difference image: {diff_path}")
|
|
129
|
+
diff_img = nib.load(str(diff_path))
|
|
130
|
+
diff_data = diff_img.get_fdata()
|
|
131
|
+
print(f" Shape: {diff_data.shape}, range: [{diff_data.min():.4f}, {diff_data.max():.4f}]")
|
|
132
|
+
|
|
133
|
+
# Load M0
|
|
134
|
+
m0_data = None
|
|
135
|
+
if not args.no_m0:
|
|
136
|
+
if not args.m0:
|
|
137
|
+
print("[ERROR] --m0 is required for absolute CBF quantification. Use --no-m0 for relative CBF.", file=sys.stderr)
|
|
138
|
+
return 1
|
|
139
|
+
m0_path = Path(args.m0).resolve()
|
|
140
|
+
if not m0_path.exists():
|
|
141
|
+
print(f"M0 image not found: {m0_path}", file=sys.stderr)
|
|
142
|
+
return 1
|
|
143
|
+
m0_img = nib.load(str(m0_path))
|
|
144
|
+
m0_data = m0_img.get_fdata()
|
|
145
|
+
print(f" M0 shape: {m0_data.shape}, range: [{m0_data.min():.4f}, {m0_data.max():.4f}]")
|
|
146
|
+
else:
|
|
147
|
+
m0_data = np.ones_like(diff_data)
|
|
148
|
+
print(" No M0 normalization (relative CBF)")
|
|
149
|
+
|
|
150
|
+
# Get quantification parameters
|
|
151
|
+
strategy = args.label_strategy
|
|
152
|
+
params = DEFAULT_PARAMS[strategy].copy()
|
|
153
|
+
|
|
154
|
+
if args.alpha is not None:
|
|
155
|
+
params["alpha"] = args.alpha
|
|
156
|
+
if args.tau is not None:
|
|
157
|
+
params["tau"] = args.tau
|
|
158
|
+
if args.pld is not None:
|
|
159
|
+
params["pld"] = args.pld
|
|
160
|
+
|
|
161
|
+
t1b = T1B[args.field_strength]
|
|
162
|
+
|
|
163
|
+
print(f"\nCBF Quantification Parameters:")
|
|
164
|
+
print(f" Strategy: {strategy}")
|
|
165
|
+
print(f" α (labeling efficiency): {params['alpha']}")
|
|
166
|
+
print(f" τ (label duration): {params['tau']} s")
|
|
167
|
+
print(f" PLD (post-labeling delay): {params['pld']} s")
|
|
168
|
+
print(f" T1b (blood T1 at {args.field_strength}T): {t1b} s")
|
|
169
|
+
print(f" λ (partition coefficient): {LAMBDA} mL/g")
|
|
170
|
+
|
|
171
|
+
# Compute CBF
|
|
172
|
+
if strategy in ("pcasl", "casl"):
|
|
173
|
+
cbf_data = compute_cbf_pcasl_casl(
|
|
174
|
+
diff_data, m0_data,
|
|
175
|
+
alpha=params["alpha"], tau=params["tau"], pld=params["pld"], t1b=t1b,
|
|
176
|
+
)
|
|
177
|
+
else:
|
|
178
|
+
cbf_data = compute_cbf_pasl(
|
|
179
|
+
diff_data, m0_data,
|
|
180
|
+
alpha=params["alpha"], ti1=params["tau"], ti2=params["pld"], t1b=t1b,
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
# Clip negative values
|
|
184
|
+
cbf_data = np.clip(cbf_data, 0, None)
|
|
185
|
+
|
|
186
|
+
# Save CBF map
|
|
187
|
+
output_path = Path(args.output).resolve()
|
|
188
|
+
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
189
|
+
cbf_img = nib.Nifti1Image(cbf_data, diff_img.affine, diff_img.header)
|
|
190
|
+
nib.save(cbf_img, str(output_path))
|
|
191
|
+
print(f"\nCBF map saved: {output_path}")
|
|
192
|
+
print(f" Range: [{cbf_data.min():.2f}, {cbf_data.max():.2f}] mL/100g/min")
|
|
193
|
+
print(f" Mean (non-zero): {cbf_data[cbf_data > 0].mean():.2f} mL/100g/min")
|
|
194
|
+
|
|
195
|
+
# ROI extraction
|
|
196
|
+
if args.roi_atlas and args.roi_summary:
|
|
197
|
+
atlas_path = Path(args.roi_atlas).resolve()
|
|
198
|
+
if not atlas_path.exists():
|
|
199
|
+
print(f"[WARN] Atlas not found: {atlas_path}", file=sys.stderr)
|
|
200
|
+
else:
|
|
201
|
+
atlas_img = nib.load(str(atlas_path))
|
|
202
|
+
atlas_data = atlas_img.get_fdata()
|
|
203
|
+
|
|
204
|
+
labels = None
|
|
205
|
+
if args.roi_labels:
|
|
206
|
+
labels = [int(l.strip()) for l in args.roi_labels.split(",")]
|
|
207
|
+
|
|
208
|
+
roi_values = extract_roi_mean(cbf_data, atlas_data, labels)
|
|
209
|
+
|
|
210
|
+
import csv
|
|
211
|
+
summary_path = Path(args.roi_summary).resolve()
|
|
212
|
+
summary_path.parent.mkdir(parents=True, exist_ok=True)
|
|
213
|
+
with open(summary_path, "w", newline="", encoding="utf-8") as f:
|
|
214
|
+
writer = csv.writer(f)
|
|
215
|
+
writer.writerow(["roi_label", "mean_cbf_ml_100g_min"])
|
|
216
|
+
for label, mean_cbf in sorted(roi_values.items()):
|
|
217
|
+
writer.writerow([label, f"{mean_cbf:.2f}"])
|
|
218
|
+
print(f"\nROI summary ({len(roi_values)} ROIs) -> {summary_path}")
|
|
219
|
+
|
|
220
|
+
return 0
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
if __name__ == "__main__":
|
|
224
|
+
sys.exit(main())
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bids-organizer
|
|
3
|
+
description: "Use this skill whenever the user wants to automatically organize raw neuroimaging data (DICOM, NIfTI, EEG, etc.) into a valid BIDS (Brain Imaging Data Structure) dataset. Triggers include: 'organize to BIDS', 'BIDS organizer', 'convert to BIDS', 'BIDS conversion', 'bidsify', 'create BIDS dataset', 'raw data to BIDS', or any request to structure data according to BIDS specification."
|
|
4
|
+
license: MIT License (NeuroClaw custom skill – freely modifiable within the project)
|
|
5
|
+
layer: subagent
|
|
6
|
+
skill_type: tool
|
|
7
|
+
dependencies:
|
|
8
|
+
- dcm2nii
|
|
9
|
+
- claw-shell
|
|
10
|
+
---
|
|
11
|
+
# BIDS Organizer (Tool Layer)
|
|
12
|
+
|
|
13
|
+
## Overview
|
|
14
|
+
|
|
15
|
+
BIDS Organizer is the NeuroClaw interface-layer skill that automatically converts raw or semi-organized neuroimaging data into a standardized BIDS-compliant dataset.
|
|
16
|
+
|
|
17
|
+
It supports DICOM → NIfTI conversion + BIDS naming, existing NIfTI reorganization, EEG (.set/.edf/.bdf/.fif), and basic metadata handling. The skill generates a clear execution plan, waits for user confirmation, then delegates all heavy work to appropriate base tools.
|
|
18
|
+
|
|
19
|
+
**Core workflow (never bypassed):**
|
|
20
|
+
1. Scan input directory and detect data types (DICOM, NIfTI, EEG, etc.).
|
|
21
|
+
2. Generate a numbered execution plan with proposed BIDS structure and subject/session labels.
|
|
22
|
+
3. Present the plan, estimated time, and risks; wait for explicit confirmation (“YES” / “execute” / “proceed”).
|
|
23
|
+
4. On confirmation, delegate tasks to `dcm2nii`, `mne-eeg-tool`, and `claw-shell`.
|
|
24
|
+
5. After completion, run BIDS validation and generate a summary report.
|
|
25
|
+
|
|
26
|
+
**Research use only.**
|
|
27
|
+
|
|
28
|
+
## Quick Reference
|
|
29
|
+
|
|
30
|
+
| Task | What needs to be done | Delegate to which tool skill | Expected output |
|
|
31
|
+
|-----------------------------------|------------------------------------------------------------|---------------------------------------|-------------------------------------|
|
|
32
|
+
| DICOM to BIDS | Convert DICOM → NIfTI + apply BIDS naming | `dcm2nii` + `claw-shell` | BIDS-compliant NIfTI + JSON sidecars|
|
|
33
|
+
| Existing NIfTI to BIDS | Rename and reorganize NIfTI files into BIDS hierarchy | `claw-shell` | Properly named BIDS dataset |
|
|
34
|
+
| EEG to BIDS | Convert .set/.edf/.bdf/.fif to BIDS EEG format | `mne-eeg-tool` + `claw-shell` | BIDS EEG files + events |
|
|
35
|
+
| Create dataset_description.json | Generate required BIDS metadata files | `claw-shell` | dataset_description.json |
|
|
36
|
+
| Validate BIDS dataset | Run bids-validator and generate report | `claw-shell` | validation report |
|
|
37
|
+
| Full automatic organization | End-to-end raw data → valid BIDS dataset | All above tools | Complete BIDS dataset + QC report |
|
|
38
|
+
|
|
39
|
+
## Common Shell Command Examples
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
# DICOM to BIDS (most common)
|
|
43
|
+
dcm2niix -o ./bids/sub-001/ses-01/anat -f "%p_%s" -b y -z y /path/to/dicom/T1
|
|
44
|
+
|
|
45
|
+
# Validate the resulting BIDS dataset
|
|
46
|
+
bids-validator /path/to/bids_dataset
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Installation (Handled by dependency-planner)
|
|
50
|
+
|
|
51
|
+
Use `dependency-planner` with requests such as:
|
|
52
|
+
- “Install dcm2niix and bids-validator”
|
|
53
|
+
- “Install MNE-Python for EEG to BIDS conversion”
|
|
54
|
+
|
|
55
|
+
After installation, verify with:
|
|
56
|
+
```bash
|
|
57
|
+
dcm2niix --version
|
|
58
|
+
bids-validator --version
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## NeuroClaw recommended wrapper script
|
|
62
|
+
|
|
63
|
+
```python
|
|
64
|
+
# bids_organizer_wrapper.py (placed inside the skill folder for reference)
|
|
65
|
+
import subprocess
|
|
66
|
+
from pathlib import Path
|
|
67
|
+
|
|
68
|
+
def organize_to_bids(raw_dir, bids_dir, subject_id, session_id="01"):
|
|
69
|
+
bids_dir = Path(bids_dir)
|
|
70
|
+
bids_dir.mkdir(parents=True, exist_ok=True)
|
|
71
|
+
|
|
72
|
+
# DICOM to BIDS example
|
|
73
|
+
cmd = [
|
|
74
|
+
"dcm2niix", "-o", str(bids_dir / f"sub-{subject_id}" / f"ses-{session_id}" / "anat"),
|
|
75
|
+
"-f", "%p_%s", "-b", "y", "-z", "y", str(raw_dir)
|
|
76
|
+
]
|
|
77
|
+
|
|
78
|
+
print("Executing:", " ".join(cmd))
|
|
79
|
+
subprocess.run(cmd, check=True)
|
|
80
|
+
|
|
81
|
+
# Create basic dataset_description.json
|
|
82
|
+
desc = {
|
|
83
|
+
"Name": "NeuroClaw BIDS Dataset",
|
|
84
|
+
"BIDSVersion": "1.8.0",
|
|
85
|
+
"DatasetType": "raw"
|
|
86
|
+
}
|
|
87
|
+
(bids_dir / "dataset_description.json").write_text(str(desc))
|
|
88
|
+
|
|
89
|
+
print(f"BIDS dataset created at: {bids_dir}")
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Important Notes & Limitations
|
|
93
|
+
|
|
94
|
+
- This skill only generates the plan and delegates; actual file operations are performed via `claw-shell`.
|
|
95
|
+
- DICOM conversion relies on `dcm2nii`.
|
|
96
|
+
- EEG conversion is delegated to `mne-eeg-tool`.
|
|
97
|
+
- Always review the proposed BIDS structure (subject/session labels, run numbers) before confirmation.
|
|
98
|
+
- Large datasets may require significant disk space and time.
|
|
99
|
+
|
|
100
|
+
## When to Call This Skill
|
|
101
|
+
|
|
102
|
+
- Raw scanner data (DICOM) needs to be converted and organized into BIDS
|
|
103
|
+
- Existing NIfTI/EEG files need proper BIDS naming and folder structure
|
|
104
|
+
- Preparing data for `fmriprep-tool`, `hcppipeline-tool`, `fsl-tool`, or `fmri-skill`
|
|
105
|
+
- Before running any standardized preprocessing pipeline
|
|
106
|
+
|
|
107
|
+
## Benchmark-Facing Default Mainline
|
|
108
|
+
|
|
109
|
+
For benchmark-style BIDS organization tasks, do not expand into a generic all-modality organizer unless the task explicitly asks for that breadth.
|
|
110
|
+
|
|
111
|
+
- First identify the narrow target modality and output contract.
|
|
112
|
+
- Reuse only the BIDS pieces needed for that target modality.
|
|
113
|
+
- Do not pull in EEG branches, full multi-modality survey logic, or large wrapper orchestration when the task is only asking for one narrow anatomical or diffusion path.
|
|
114
|
+
- Do not treat the interactive confirmation-heavy core workflow as mandatory for benchmark tasks that explicitly ask for direct completion. In benchmark mode, the answer should default to the narrow executable organization path instead of plan-first / confirm-first orchestration.
|
|
115
|
+
- Do not make large review buckets such as `misc_nonbids_review/`, broad unresolved-item triage systems, or generic catch-all wrappers the center of the answer unless the prompt explicitly asks for audit/review handling.
|
|
116
|
+
- If the task is specifically structural MRI organization, keep the answer centered on:
|
|
117
|
+
- DICOM to NIfTI conversion only if needed,
|
|
118
|
+
- `sub-*/[ses-*/]anat/` placement,
|
|
119
|
+
- valid suffix naming such as `T1w`, `T2w`, `FLAIR`,
|
|
120
|
+
- required top-level files like `dataset_description.json`,
|
|
121
|
+
- validator/report output.
|
|
122
|
+
- If the task is diffusion-only, keep the answer centered on `dwi/` organization and diffusion sidecars instead of broadening into whole-dataset BIDS strategy.
|
|
123
|
+
- If subject/session/modality cannot be inferred reliably, report the blocked item explicitly instead of widening into a generic heuristic-heavy organizer.
|
|
124
|
+
|
|
125
|
+
### Direct Mixed-Modality Benchmark Path
|
|
126
|
+
|
|
127
|
+
When the benchmark task asks for automatic organization of local DICOM/NIfTI/EEG raw data into BIDS, but does not ask for an interactive planner, default to this narrow path:
|
|
128
|
+
|
|
129
|
+
1. scan only for the modalities explicitly mentioned by the task,
|
|
130
|
+
2. organize those modalities into the required BIDS hierarchy,
|
|
131
|
+
3. generate the minimal required dataset metadata,
|
|
132
|
+
4. run validation and report concrete blockers,
|
|
133
|
+
5. stop there.
|
|
134
|
+
|
|
135
|
+
Do not turn this into a reusable platform-style organizer with review zones, broad plugin branches, or full modality-by-modality expansion unless the prompt explicitly asks for that breadth.
|
|
136
|
+
|
|
137
|
+
### Existing DWI NIfTI Sidecar Path
|
|
138
|
+
|
|
139
|
+
When the task already provides DWI `NIfTI + bval + bvec` files, the preferred mainline is:
|
|
140
|
+
|
|
141
|
+
1. detect valid DWI image / sidecar triplets,
|
|
142
|
+
2. infer `sub-`, optional `ses-`, and optional `run-` entities,
|
|
143
|
+
3. place outputs under `sub-*/[ses-*/]dwi/`,
|
|
144
|
+
4. preserve matching `.bval`, `.bvec`, and optional `.json`,
|
|
145
|
+
5. generate minimal dataset metadata and validate.
|
|
146
|
+
|
|
147
|
+
In this situation, do not broaden the answer into DICOM conversion, EEG conversion, or a whole-dataset mixed-modality organizer unless the prompt explicitly asks for those branches.
|
|
148
|
+
|
|
149
|
+
### Structural MRI Narrow Path
|
|
150
|
+
|
|
151
|
+
For narrow structural MRI BIDS tasks, the preferred mainline is:
|
|
152
|
+
|
|
153
|
+
1. detect whether input is DICOM or existing NIfTI,
|
|
154
|
+
2. convert with `dcm2niix` only when needed,
|
|
155
|
+
3. place outputs under `sub-*/[ses-*/]anat/`,
|
|
156
|
+
4. assign only the correct structural suffixes,
|
|
157
|
+
5. generate minimal required dataset metadata,
|
|
158
|
+
6. run BIDS validation and summarize unmapped files.
|
|
159
|
+
|
|
160
|
+
Do not replace that mainline with a broader all-modality organizer unless the prompt explicitly requests a full mixed-modality BIDS conversion.
|
|
161
|
+
|
|
162
|
+
## Post-Execution Verification (Harness Integration)
|
|
163
|
+
|
|
164
|
+
After BIDS organization completes, this skill **automatically invokes harness-core's VerificationRunner** to validate output integrity:
|
|
165
|
+
|
|
166
|
+
**Integrated verification checks**:
|
|
167
|
+
|
|
168
|
+
```python
|
|
169
|
+
from skills.harness_core import VerificationRunner, AuditLogger
|
|
170
|
+
|
|
171
|
+
verifier = VerificationRunner(task_type="bids_organization")
|
|
172
|
+
|
|
173
|
+
# 1. BIDS structure compliance
|
|
174
|
+
verifier.add_check("bids_structure",
|
|
175
|
+
checker=lambda: verify_bids_structure(bids_dir),
|
|
176
|
+
severity="error"
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
# 2. Dataset description file
|
|
180
|
+
verifier.add_check("dataset_description",
|
|
181
|
+
checker=lambda: verify_dataset_description_exists(bids_dir),
|
|
182
|
+
severity="error"
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
# 3. Subject/session naming convention
|
|
186
|
+
verifier.add_check("naming_convention",
|
|
187
|
+
checker=lambda: verify_bids_naming(bids_dir),
|
|
188
|
+
severity="error"
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
# 4. Metadata JSON sidecar completeness
|
|
192
|
+
verifier.add_check("json_sidecars",
|
|
193
|
+
checker=lambda: verify_json_sidecars(bids_dir),
|
|
194
|
+
severity="warning"
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
# 5. Required BIDS files presence
|
|
198
|
+
verifier.add_check("required_files",
|
|
199
|
+
checker=lambda: verify_required_files(bids_dir),
|
|
200
|
+
severity="error"
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
report = verifier.run(bids_dir)
|
|
204
|
+
|
|
205
|
+
# Log verification results
|
|
206
|
+
logger = AuditLogger(log_file=f"{bids_dir}/bids_verification.jsonl")
|
|
207
|
+
logger.log_validation(
|
|
208
|
+
task_name="bids_organization",
|
|
209
|
+
checks_passed=len([r for r in report.results if r.passed]),
|
|
210
|
+
checks_failed=len([r for r in report.results if not r.passed]),
|
|
211
|
+
warnings=len([r for r in report.results if r.severity == "warning" and not r.passed]),
|
|
212
|
+
report_summary=report.to_dict()
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
if report.failed:
|
|
216
|
+
raise ValueError(f"BIDS verification failed: {report.summary}")
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
**Output files generated**:
|
|
220
|
+
- `{bids_dir}/bids_verification.jsonl` — structured audit log
|
|
221
|
+
- `{bids_dir}/.bids_validation_timestamp` — verification completion marker
|
|
222
|
+
|
|
223
|
+
## Complementary / Related Skills
|
|
224
|
+
|
|
225
|
+
- `dependency-planner` → install required tools
|
|
226
|
+
- `claw-shell` → safe execution of all commands
|
|
227
|
+
- `harness-core` → automated verification and audit logging
|
|
228
|
+
|
|
229
|
+
## More Advanced Features
|
|
230
|
+
|
|
231
|
+
For complex BIDS cases (multi-session, multi-run, custom metadata, HEUDICONV heuristics, etc.), please refer to the official BIDS specification:
|
|
232
|
+
|
|
233
|
+
- Official BIDS Website: https://bids.neuroimaging.io/
|
|
234
|
+
- BIDS Specification: https://bids-specification.readthedocs.io/
|
|
235
|
+
|
|
236
|
+
You may use the `multi-search-engine` or `academic-research-hub` skill to find the latest BIDS conversion best practices.
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
Created At: 2026-03-25 16:00 HKT
|
|
240
|
+
Last Updated At: 2026-04-05 02:01 HKT
|
|
241
|
+
Author: chengwang96
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bold5000-skill
|
|
3
|
+
description: "Use this skill whenever the user wants an end-to-end workflow for the BOLD5000 dataset, including download, BIDS organization, and processing of task-fMRI data with visual image stimuli. Triggers include: 'BOLD5000', 'BOLD 5000', 'process BOLD5000', 'visual fMRI', or any request to run the BOLD5000 pipeline. This is the NeuroClaw dataset-orchestration layer for BOLD5000."
|
|
4
|
+
license: MIT License (NeuroClaw custom skill - freely modifiable within the project)
|
|
5
|
+
layer: subagent
|
|
6
|
+
skill_type: dataset
|
|
7
|
+
dependencies:
|
|
8
|
+
- smri-skill
|
|
9
|
+
- fmri-skill
|
|
10
|
+
- bids-organizer
|
|
11
|
+
- claw-shell
|
|
12
|
+
---
|
|
13
|
+
# BOLD5000 Skill (Dataset-Orchestration Layer)
|
|
14
|
+
|
|
15
|
+
## Overview
|
|
16
|
+
`bold5000-skill` is the NeuroClaw orchestration skill for the **BOLD5000** dataset.
|
|
17
|
+
|
|
18
|
+
BOLD5000 is a high-density repeated visual fMRI dataset with 8 participants performing 5,000-image visual recognition tasks. It is designed for studying visual object recognition and scene understanding.
|
|
19
|
+
|
|
20
|
+
It coordinates a fixed three-phase workflow:
|
|
21
|
+
1. Download BOLD5000 data from the OpenNeuro repository.
|
|
22
|
+
2. Prepare and validate BIDS-style data organization for downstream processing.
|
|
23
|
+
3. Delegate modality pipelines to `smri-skill` and `fmri-skill`.
|
|
24
|
+
|
|
25
|
+
This skill follows NeuroClaw hierarchy:
|
|
26
|
+
- Defines **WHAT to do**, not low-level implementation details.
|
|
27
|
+
- Does **not** execute direct shell commands itself.
|
|
28
|
+
- Delegates all execution via `claw-shell` to base/tool skills.
|
|
29
|
+
|
|
30
|
+
**Research use only.**
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Download Stage (Mandatory First Step)
|
|
35
|
+
|
|
36
|
+
### Source
|
|
37
|
+
BOLD5000 data is available on OpenNeuro:
|
|
38
|
+
- Website: https://bold5000-dataset.github.io/
|
|
39
|
+
- OpenNeuro: https://openneuro.org/datasets/ds002785
|
|
40
|
+
|
|
41
|
+
### Supported BOLD5000 Data Packages
|
|
42
|
+
- **Imaging data**: T1w structural, task-fMRI (NIfTI format)
|
|
43
|
+
- **Stimulus data**: 5,000 natural images with category labels and image metadata
|
|
44
|
+
- **Behavioral data**: Recognition memory judgments, response times
|
|
45
|
+
- **Participants**: 4 participants x ~1250 images each (high-density repeated measures)
|
|
46
|
+
|
|
47
|
+
### Delegation Rules for Download
|
|
48
|
+
- Environment/setup checks: `dependency-planner` + `conda-env-manager`
|
|
49
|
+
- OpenNeuro dataset download: `claw-shell` (via `openneuro` CLI or `datalad`)
|
|
50
|
+
- Optional raw-data organization to BIDS-style staging: `bids-organizer`
|
|
51
|
+
|
|
52
|
+
### Download Inputs to Confirm in Plan
|
|
53
|
+
- Target subset (all subjects, specific subjects)
|
|
54
|
+
- Whether to include stimulus images
|
|
55
|
+
- Destination directory with sufficient disk space
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Narrow Path: BOLD5000 Raw NIfTI -> BIDS Staging
|
|
60
|
+
|
|
61
|
+
Use this path when the task only asks to reorganize raw BOLD5000 NIfTI files into a BIDS-style dataset and does not require preprocessing or downstream analysis.
|
|
62
|
+
|
|
63
|
+
### Expected narrow-path behavior
|
|
64
|
+
1. BOLD5000 data from OpenNeuro is already in BIDS format; verify and validate structure.
|
|
65
|
+
2. Route modalities:
|
|
66
|
+
- T1w -> `anat/*_T1w`
|
|
67
|
+
- task-fMRI -> `func/*_task-*_bold`
|
|
68
|
+
3. Preserve stimulus metadata and event files.
|
|
69
|
+
4. Emit dataset-level outputs such as `dataset_description.json`, `participants.tsv`.
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Core Workflow (Never Bypassed)
|
|
74
|
+
1. Identify user target: download, BIDS staging, or full preprocessing.
|
|
75
|
+
2. Generate a numbered plan with tools, outputs, runtime, storage, and risks.
|
|
76
|
+
3. Wait for explicit confirmation (`YES` / `execute` / `proceed`).
|
|
77
|
+
4. On confirmation, run download stage first (if needed).
|
|
78
|
+
5. After download success, verify/prepare BIDS staging using `scripts/reorganize_bold5000.py`.
|
|
79
|
+
6. Delegate to modality skills:
|
|
80
|
+
- `smri-skill` for structural MRI (T1w)
|
|
81
|
+
- `fmri-skill` for task-fMRI
|
|
82
|
+
7. If stimulus analysis is requested, use `scripts/extract_bold5000_stimulus.py` to generate stimulus metadata.
|
|
83
|
+
8. Save outputs into a BOLD5000-centered structure under `bold5000_output/`.
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Stimulus Metadata Extraction
|
|
88
|
+
|
|
89
|
+
### Script: `scripts/extract_bold5000_stimulus.py`
|
|
90
|
+
|
|
91
|
+
Extracts and organizes BOLD5000 stimulus metadata for downstream analysis.
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
python skills/bold5000-skill/scripts/extract_bold5000_stimulus.py \
|
|
95
|
+
--stimulus-dir /path/to/bold5000_raw/stimuli \
|
|
96
|
+
--output /path/to/bold5000_output/stimulus/stimulus_metadata.csv
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Features:
|
|
100
|
+
- Reads stimulus image file names and paths
|
|
101
|
+
- Extracts category labels (object, scene, etc.)
|
|
102
|
+
- Generates per-image metadata CSV for modeling
|
|
103
|
+
- Links stimulus presentation events to fMRI volumes
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## QC Integration
|
|
108
|
+
|
|
109
|
+
### Script: `scripts/bold5000_qc_summary.py`
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
python skills/bold5000-skill/scripts/bold5000_qc_summary.py \
|
|
113
|
+
--fmriprep-dir /path/to/bold5000_output/fmriprep \
|
|
114
|
+
--output /path/to/bold5000_output/qc/qc_summary.csv \
|
|
115
|
+
--fd-threshold 0.3
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## Recommended Output Layout
|
|
121
|
+
All assets should be organized under `./bold5000_output/`:
|
|
122
|
+
- `bold5000_output/raw/` (downloaded original BOLD5000 files)
|
|
123
|
+
- `bold5000_output/bids/` (BIDS data)
|
|
124
|
+
- `bold5000_output/smri/` (links or copies from `smri_output/`)
|
|
125
|
+
- `bold5000_output/fmri/` (links or copies from `fmri_output/`)
|
|
126
|
+
- `bold5000_output/stimulus/` (stimulus metadata and event files)
|
|
127
|
+
- `bold5000_output/qc/` (QC summaries)
|
|
128
|
+
- `bold5000_output/logs/` (download + orchestration logs)
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Benchmark Adapter Guidance
|
|
133
|
+
|
|
134
|
+
For benchmark-style prompts, do not force the full `download -> staging -> multimodal processing` orchestration when the task is only asking for local BOLD5000 data staging or organization.
|
|
135
|
+
|
|
136
|
+
- If the task starts from raw BOLD5000 data already present on disk and only asks for BIDS-style staging / validation:
|
|
137
|
+
- skip the mandatory download stage
|
|
138
|
+
- default to the narrow path `local raw BOLD5000 discovery -> BIDS validation -> minimal metadata -> report`
|
|
139
|
+
- In benchmark mode, do not require explicit confirmation before presenting the direct staging solution.
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## Safety and Execution Policy
|
|
144
|
+
- No execution before explicit plan confirmation.
|
|
145
|
+
- All execution must be routed via `claw-shell`.
|
|
146
|
+
- Missing dependencies must be resolved by `dependency-planner` before running.
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Important Notes and Limitations
|
|
151
|
+
- BOLD5000 is a small dataset (4 participants); statistical power is limited for group-level analyses.
|
|
152
|
+
- BOLD5000 uses high-density repeated image presentations; analysis requires handling of repeated measures.
|
|
153
|
+
- BOLD5000 data from OpenNeuro is already in BIDS format; re-staging may not be needed.
|
|
154
|
+
- Stimulus images are included in the dataset; event files reference image file names.
|
|
155
|
+
- `bold5000-skill` is orchestration-only; detailed preprocessing logic remains in `smri-skill` and `fmri-skill`.
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## When to Call This Skill
|
|
160
|
+
- User asks for end-to-end BOLD5000 workflow.
|
|
161
|
+
- User asks to download BOLD5000 data and then run task-fMRI processing.
|
|
162
|
+
- User needs BIDS validation for BOLD5000 data.
|
|
163
|
+
- User asks to extract BOLD5000 stimulus metadata.
|
|
164
|
+
- User needs BOLD5000-specific QC summaries.
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## Complementary / Related Skills
|
|
169
|
+
- `smri-skill`
|
|
170
|
+
- `fmri-skill`
|
|
171
|
+
- `bids-organizer`
|
|
172
|
+
- `fmriprep-tool`
|
|
173
|
+
- `dependency-planner`
|
|
174
|
+
- `conda-env-manager`
|
|
175
|
+
- `claw-shell`
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## Reference
|
|
180
|
+
- BOLD5000: https://bold5000-dataset.github.io/
|
|
181
|
+
- Chang et al., 2019, *BOLD5000: A public fMRI dataset of 5,000 images*
|
|
182
|
+
- BIDS spec: https://bids.neuroimaging.io/
|
|
183
|
+
|
|
184
|
+
Created At: 2026-05-06 01:52 HKT
|
|
185
|
+
Last Updated At: 2026-05-06 01:52 HKT
|
|
186
|
+
Author: chengwang96
|