@brainpilot/skills 0.0.6 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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,322 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Validate and reorganize AOMIC data into BIDS-compliant directory structure.
|
|
3
|
+
|
|
4
|
+
AOMIC (Amsterdam Open MRI Collection) data is typically already in BIDS format.
|
|
5
|
+
This script validates structure, handles edge cases, and normalizes across
|
|
6
|
+
sub-datasets (ID1000, PIOP1, PIOP2).
|
|
7
|
+
"""
|
|
8
|
+
import argparse
|
|
9
|
+
import json
|
|
10
|
+
import os
|
|
11
|
+
import re
|
|
12
|
+
import shutil
|
|
13
|
+
import sys
|
|
14
|
+
from collections import defaultdict
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
from typing import Dict, List, Optional, Tuple
|
|
17
|
+
|
|
18
|
+
# AOMIC task names recognized in BIDS
|
|
19
|
+
AOMIC_TASKS = [
|
|
20
|
+
"rest",
|
|
21
|
+
"emotion",
|
|
22
|
+
"gambling",
|
|
23
|
+
"motor",
|
|
24
|
+
"language",
|
|
25
|
+
"workingmemory",
|
|
26
|
+
"stroop",
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
SIDECAR_EXTENSIONS = [".json", ".bval", ".bvec", ".tsv", ".txt"]
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def validate_subject_id(subject_dir_name: str) -> Optional[str]:
|
|
33
|
+
"""Validate and normalize AOMIC subject ID to BIDS label.
|
|
34
|
+
|
|
35
|
+
AOMIC uses sub-XXXX format already.
|
|
36
|
+
"""
|
|
37
|
+
name = subject_dir_name.strip()
|
|
38
|
+
if name.startswith("sub-"):
|
|
39
|
+
label = name[4:]
|
|
40
|
+
else:
|
|
41
|
+
label = name
|
|
42
|
+
|
|
43
|
+
# Must be alphanumeric
|
|
44
|
+
clean = re.sub(r"[^a-zA-Z0-9]", "", label)
|
|
45
|
+
if not clean:
|
|
46
|
+
return None
|
|
47
|
+
return f"sub-{clean}"
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def detect_task_from_filename(filename: str) -> Optional[str]:
|
|
51
|
+
"""Extract BIDS task name from filename."""
|
|
52
|
+
match = re.search(r"task-([a-zA-Z0-9]+)", filename)
|
|
53
|
+
if match:
|
|
54
|
+
return match.group(1).lower()
|
|
55
|
+
return None
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def validate_bids_filename(filename: str) -> bool:
|
|
59
|
+
"""Check if filename follows BIDS naming conventions."""
|
|
60
|
+
# Must have sub- prefix for subject
|
|
61
|
+
if not re.search(r"sub-[a-zA-Z0-9]+", filename):
|
|
62
|
+
return False
|
|
63
|
+
# Must end with known extensions
|
|
64
|
+
valid_exts = [".nii", ".nii.gz", ".json", ".tsv", ".bval", ".bvec", ".txt", ".eeg", ".vhdr", ".vmrk"]
|
|
65
|
+
return any(filename.endswith(ext) for ext in valid_exts)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def find_nifti_files(directory: Path) -> List[Path]:
|
|
69
|
+
"""Find all NIfTI files in a directory."""
|
|
70
|
+
results = []
|
|
71
|
+
for f in sorted(directory.rglob("*")):
|
|
72
|
+
if f.is_file() and (f.name.endswith(".nii") or f.name.endswith(".nii.gz")):
|
|
73
|
+
results.append(f)
|
|
74
|
+
return results
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def copy_with_sidecars(src_nifti: Path, dst_dir: Path, dst_stem: str) -> List[Path]:
|
|
78
|
+
"""Copy NIfTI file and its sidecar files to destination."""
|
|
79
|
+
dst_dir.mkdir(parents=True, exist_ok=True)
|
|
80
|
+
copied = []
|
|
81
|
+
|
|
82
|
+
ext = ".nii.gz" if src_nifti.name.endswith(".nii.gz") else ".nii"
|
|
83
|
+
dst_nifti = dst_dir / f"{dst_stem}{ext}"
|
|
84
|
+
if not dst_nifti.exists():
|
|
85
|
+
shutil.copy2(str(src_nifti), str(dst_nifti))
|
|
86
|
+
copied.append(dst_nifti)
|
|
87
|
+
|
|
88
|
+
src_stem = src_nifti.name
|
|
89
|
+
if src_stem.endswith(".nii.gz"):
|
|
90
|
+
src_stem = src_stem[:-7]
|
|
91
|
+
elif src_stem.endswith(".nii"):
|
|
92
|
+
src_stem = src_stem[:-4]
|
|
93
|
+
|
|
94
|
+
for sidecar_ext in SIDECAR_EXTENSIONS:
|
|
95
|
+
src_sidecar = src_nifti.parent / f"{src_stem}{sidecar_ext}"
|
|
96
|
+
if src_sidecar.exists():
|
|
97
|
+
dst_sidecar = dst_dir / f"{dst_stem}{sidecar_ext}"
|
|
98
|
+
if not dst_sidecar.exists():
|
|
99
|
+
shutil.copy2(str(src_sidecar), str(dst_sidecar))
|
|
100
|
+
copied.append(dst_sidecar)
|
|
101
|
+
|
|
102
|
+
return copied
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def write_dataset_description(bids_root: Path, sub_dataset: str = "AOMIC") -> None:
|
|
106
|
+
"""Write BIDS dataset_description.json."""
|
|
107
|
+
desc = {
|
|
108
|
+
"Name": f"Amsterdam Open MRI Collection ({sub_dataset})",
|
|
109
|
+
"BIDSVersion": "1.8.0",
|
|
110
|
+
"DatasetType": "raw",
|
|
111
|
+
"GeneratedBy": [
|
|
112
|
+
{
|
|
113
|
+
"Name": "NeuroClaw aomic-skill",
|
|
114
|
+
"Description": f"AOMIC ({sub_dataset}) data validated and reorganized to BIDS structure",
|
|
115
|
+
"Version": "1.0.0",
|
|
116
|
+
}
|
|
117
|
+
],
|
|
118
|
+
}
|
|
119
|
+
desc_path = bids_root / "dataset_description.json"
|
|
120
|
+
with open(desc_path, "w", encoding="utf-8") as f:
|
|
121
|
+
json.dump(desc, f, indent=2, ensure_ascii=False)
|
|
122
|
+
print(f"[OK] Wrote {desc_path}")
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def write_participants_tsv(bids_root: Path, subject_ids: List[str]) -> None:
|
|
126
|
+
"""Write BIDS participants.tsv header."""
|
|
127
|
+
tsv_path = bids_root / "participants.tsv"
|
|
128
|
+
with open(tsv_path, "w", encoding="utf-8") as f:
|
|
129
|
+
f.write("participant_id\n")
|
|
130
|
+
for sid in sorted(set(subject_ids)):
|
|
131
|
+
f.write(f"{sid}\n")
|
|
132
|
+
print(f"[OK] Wrote {tsv_path} ({len(set(subject_ids))} participants)")
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def process_aomic_subject(
|
|
136
|
+
subject_dir: Path,
|
|
137
|
+
bids_root: Path,
|
|
138
|
+
sub_label: str,
|
|
139
|
+
dry_run: bool = False,
|
|
140
|
+
copy_mode: bool = False,
|
|
141
|
+
) -> Tuple[int, int, int]:
|
|
142
|
+
"""Process a single AOMIC subject directory.
|
|
143
|
+
|
|
144
|
+
AOMIC data is typically already in BIDS layout. This function validates
|
|
145
|
+
and optionally copies/reorganizes.
|
|
146
|
+
|
|
147
|
+
Returns (converted, skipped, failed).
|
|
148
|
+
"""
|
|
149
|
+
converted = 0
|
|
150
|
+
skipped = 0
|
|
151
|
+
failed = 0
|
|
152
|
+
|
|
153
|
+
# Check for standard BIDS subdirectories
|
|
154
|
+
anat_dir = subject_dir / "anat"
|
|
155
|
+
func_dir = subject_dir / "func"
|
|
156
|
+
dwi_dir = subject_dir / "dwi"
|
|
157
|
+
|
|
158
|
+
nifti_files = find_nifti_files(subject_dir)
|
|
159
|
+
|
|
160
|
+
if not nifti_files:
|
|
161
|
+
print(f"[WARN] {sub_label}: no NIfTI files found")
|
|
162
|
+
return 0, 0, 1
|
|
163
|
+
|
|
164
|
+
for nifti in nifti_files:
|
|
165
|
+
# Determine BIDS folder from relative path
|
|
166
|
+
try:
|
|
167
|
+
rel_path = nifti.relative_to(subject_dir)
|
|
168
|
+
except ValueError:
|
|
169
|
+
rel_path = Path(nifti.name)
|
|
170
|
+
|
|
171
|
+
parts = rel_path.parts
|
|
172
|
+
if len(parts) > 1:
|
|
173
|
+
bids_folder = parts[0] # anat, func, dwi
|
|
174
|
+
bids_filename = parts[-1]
|
|
175
|
+
else:
|
|
176
|
+
bids_filename = nifti.name
|
|
177
|
+
# Try to detect folder from filename
|
|
178
|
+
if "T1w" in bids_filename or "T2w" in bids_filename:
|
|
179
|
+
bids_folder = "anat"
|
|
180
|
+
elif "bold" in bids_filename or "task-" in bids_filename:
|
|
181
|
+
bids_folder = "func"
|
|
182
|
+
elif "dwi" in bids_filename:
|
|
183
|
+
bids_folder = "dwi"
|
|
184
|
+
else:
|
|
185
|
+
bids_folder = "anat"
|
|
186
|
+
|
|
187
|
+
# Ensure filename has subject prefix
|
|
188
|
+
if not bids_filename.startswith(sub_label):
|
|
189
|
+
# Try to fix
|
|
190
|
+
bids_filename = f"{sub_label}_{bids_filename.split('_', 1)[-1]}" if "_" in bids_filename else f"{sub_label}_{bids_filename}"
|
|
191
|
+
|
|
192
|
+
dst_dir = bids_root / sub_label / bids_folder
|
|
193
|
+
dst_stem = bids_filename.rsplit(".nii", 1)[0]
|
|
194
|
+
if dst_stem.endswith("."):
|
|
195
|
+
dst_stem = dst_stem[:-1]
|
|
196
|
+
|
|
197
|
+
ext = ".nii.gz" if nifti.name.endswith(".nii.gz") else ".nii"
|
|
198
|
+
if (dst_dir / f"{dst_stem}{ext}").exists():
|
|
199
|
+
skipped += 1
|
|
200
|
+
continue
|
|
201
|
+
|
|
202
|
+
if dry_run:
|
|
203
|
+
print(f"[DRY] {sub_label}/{bids_folder}/{dst_stem}")
|
|
204
|
+
converted += 1
|
|
205
|
+
elif copy_mode:
|
|
206
|
+
copy_with_sidecars(nifti, dst_dir, dst_stem)
|
|
207
|
+
print(f"[OK] {sub_label}/{bids_folder}/{dst_stem}")
|
|
208
|
+
converted += 1
|
|
209
|
+
else:
|
|
210
|
+
# Validation-only mode
|
|
211
|
+
if validate_bids_filename(bids_filename):
|
|
212
|
+
print(f"[VALID] {sub_label}/{bids_folder}/{bids_filename}")
|
|
213
|
+
converted += 1
|
|
214
|
+
else:
|
|
215
|
+
print(f"[WARN] {sub_label}/{bids_folder}/{bids_filename}: non-standard naming")
|
|
216
|
+
failed += 1
|
|
217
|
+
|
|
218
|
+
return converted, skipped, failed
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
def main() -> int:
|
|
222
|
+
parser = argparse.ArgumentParser(
|
|
223
|
+
description="Validate and reorganize AOMIC data into BIDS-compliant structure."
|
|
224
|
+
)
|
|
225
|
+
parser.add_argument(
|
|
226
|
+
"--input",
|
|
227
|
+
required=True,
|
|
228
|
+
help="Path to AOMIC data directory",
|
|
229
|
+
)
|
|
230
|
+
parser.add_argument(
|
|
231
|
+
"--output",
|
|
232
|
+
required=True,
|
|
233
|
+
help="Path to output BIDS directory",
|
|
234
|
+
)
|
|
235
|
+
parser.add_argument(
|
|
236
|
+
"--sub-dataset",
|
|
237
|
+
default="ID1000",
|
|
238
|
+
choices=["ID1000", "PIOP1", "PIOP2", "all"],
|
|
239
|
+
help="AOMIC sub-dataset (default: ID1000)",
|
|
240
|
+
)
|
|
241
|
+
parser.add_argument(
|
|
242
|
+
"--participants-file",
|
|
243
|
+
help="Optional: path to phenotype file for participant metadata",
|
|
244
|
+
)
|
|
245
|
+
parser.add_argument(
|
|
246
|
+
"--copy",
|
|
247
|
+
action="store_true",
|
|
248
|
+
help="Copy files to output directory (default: validation only)",
|
|
249
|
+
)
|
|
250
|
+
parser.add_argument(
|
|
251
|
+
"--dry-run",
|
|
252
|
+
action="store_true",
|
|
253
|
+
help="Preview without processing files",
|
|
254
|
+
)
|
|
255
|
+
args = parser.parse_args()
|
|
256
|
+
|
|
257
|
+
input_dir = Path(args.input).resolve()
|
|
258
|
+
output_dir = Path(args.output).resolve()
|
|
259
|
+
|
|
260
|
+
if not input_dir.exists() or not input_dir.is_dir():
|
|
261
|
+
print(f"Input directory does not exist: {input_dir}", file=sys.stderr)
|
|
262
|
+
return 1
|
|
263
|
+
|
|
264
|
+
output_dir.mkdir(parents=True, exist_ok=True)
|
|
265
|
+
participants: List[str] = []
|
|
266
|
+
|
|
267
|
+
print(f"Sub-dataset: {args.sub_dataset}")
|
|
268
|
+
print(f"Input: {input_dir}")
|
|
269
|
+
print(f"Output: {output_dir}")
|
|
270
|
+
print(f"Mode: {'DRY RUN' if args.dry_run else 'COPY' if args.copy else 'VALIDATE'}")
|
|
271
|
+
print()
|
|
272
|
+
|
|
273
|
+
# Find subject directories
|
|
274
|
+
subject_dirs = sorted(
|
|
275
|
+
[p for p in input_dir.iterdir() if p.is_dir() and (p.name.startswith("sub-") or re.match(r"^\d+$", p.name))]
|
|
276
|
+
)
|
|
277
|
+
|
|
278
|
+
if not subject_dirs:
|
|
279
|
+
# Try nested structure (e.g., ID1000/sub-0001/)
|
|
280
|
+
for child in sorted(input_dir.iterdir()):
|
|
281
|
+
if child.is_dir():
|
|
282
|
+
nested = sorted(
|
|
283
|
+
[p for p in child.iterdir() if p.is_dir() and (p.name.startswith("sub-") or re.match(r"^\d+$", p.name))]
|
|
284
|
+
)
|
|
285
|
+
subject_dirs.extend(nested)
|
|
286
|
+
|
|
287
|
+
if not subject_dirs:
|
|
288
|
+
print("[ERROR] No subject directories found.", file=sys.stderr)
|
|
289
|
+
return 1
|
|
290
|
+
|
|
291
|
+
print(f"Found {len(subject_dirs)} subject directories\n")
|
|
292
|
+
|
|
293
|
+
total_converted = 0
|
|
294
|
+
total_skipped = 0
|
|
295
|
+
total_failed = 0
|
|
296
|
+
|
|
297
|
+
for subject_dir in subject_dirs:
|
|
298
|
+
sub_label = validate_subject_id(subject_dir.name)
|
|
299
|
+
if not sub_label:
|
|
300
|
+
print(f"[WARN] Skipping invalid directory: {subject_dir.name}")
|
|
301
|
+
total_failed += 1
|
|
302
|
+
continue
|
|
303
|
+
|
|
304
|
+
participants.append(sub_label)
|
|
305
|
+
converted, skipped, failed = process_aomic_subject(
|
|
306
|
+
subject_dir, output_dir, sub_label, args.dry_run, args.copy
|
|
307
|
+
)
|
|
308
|
+
total_converted += converted
|
|
309
|
+
total_skipped += skipped
|
|
310
|
+
total_failed += failed
|
|
311
|
+
|
|
312
|
+
# Write BIDS metadata
|
|
313
|
+
if not args.dry_run and (args.copy or total_converted > 0):
|
|
314
|
+
write_dataset_description(output_dir, args.sub_dataset)
|
|
315
|
+
write_participants_tsv(output_dir, participants)
|
|
316
|
+
|
|
317
|
+
print(f"\nDone. Converted={total_converted}, Skipped={total_skipped}, Failed={total_failed}")
|
|
318
|
+
return 0 if total_failed == 0 else 2
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
if __name__ == "__main__":
|
|
322
|
+
sys.exit(main())
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: asl-skill
|
|
3
|
+
description: "Use this skill whenever the user wants to process Arterial Spin Labeling (ASL) perfusion MRI data including CBF (cerebral blood flow) quantification, ASL preprocessing (motion correction, partial volume correction, M0 normalization), or ASL-based brain perfusion analysis. Triggers include: 'ASL', 'ASL processing', 'CBF', 'cerebral blood flow', 'perfusion MRI', 'arterial spin labeling', 'pCASL', 'CASL', 'PASL', or any request involving ASL perfusion data."
|
|
4
|
+
license: MIT License (NeuroClaw custom skill – freely modifiable within the project)
|
|
5
|
+
layer: subagent
|
|
6
|
+
skill_type: modality
|
|
7
|
+
dependencies:
|
|
8
|
+
- fsl-tool
|
|
9
|
+
- nibabel-skill
|
|
10
|
+
- claw-shell
|
|
11
|
+
complementary_skills:
|
|
12
|
+
- smri-skill
|
|
13
|
+
- fmri-skill
|
|
14
|
+
---
|
|
15
|
+
# ASL Skill (Modality Layer)
|
|
16
|
+
|
|
17
|
+
## Overview
|
|
18
|
+
|
|
19
|
+
`asl-skill` is the NeuroClaw **modality-layer** interface skill responsible for all Arterial Spin Labeling (ASL) perfusion MRI data processing tasks.
|
|
20
|
+
|
|
21
|
+
It strictly follows the NeuroClaw hierarchical design principles:
|
|
22
|
+
- This skill **only describes WHAT needs to be done** and **which tool skill to delegate to**.
|
|
23
|
+
- It contains **no implementation code or concrete commands**.
|
|
24
|
+
- All concrete execution is delegated to existing base/tool skills: `fsl-tool`, `nibabel-skill`, and `claw-shell`.
|
|
25
|
+
- Companion scripts in `scripts/` provide reference implementations for CBF quantification.
|
|
26
|
+
|
|
27
|
+
**Core workflow (never bypassed):**
|
|
28
|
+
1. Identify input ASL data and labeling strategy (pCASL, CASL, or PASL).
|
|
29
|
+
2. Ensure T1w structural data is available (via `smri-skill` if not yet processed).
|
|
30
|
+
3. Generate a **numbered execution plan** clearly stating WHAT needs to be done and which tool skill will handle each step.
|
|
31
|
+
4. Present the full plan, estimated runtime, resource requirements, and risks to the user and wait for explicit confirmation ("YES" / "execute" / "proceed").
|
|
32
|
+
5. On confirmation, delegate every step to the appropriate skill via `claw-shell`.
|
|
33
|
+
6. After execution, save all outputs in a clean directory structure (`asl_output/`).
|
|
34
|
+
|
|
35
|
+
**Research use only.**
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Quick Reference (Common ASL Tasks)
|
|
40
|
+
|
|
41
|
+
| Task | What needs to be done | Delegate to which tool skill | Expected output |
|
|
42
|
+
|---|---|---|---|
|
|
43
|
+
| ASL preprocessing | Motion correction, masking, registration to T1w | `fsl-tool` (ASL_PREPCORE) | Preprocessed ASL in T1w space |
|
|
44
|
+
| M0 normalization | Divide ASL difference image by M0 reference image to get perfusion signal | `fsl-tool` or `scripts/compute_cbf.py` | Normalized perfusion map |
|
|
45
|
+
| CBF quantification | Convert perfusion signal to absolute CBF (mL/100g/min) using Buxton model | `scripts/compute_cbf.py` | CBF map (NIfTI) + ROI summary (CSV) |
|
|
46
|
+
| Partial volume correction | Correct CBF for gray/white matter partial volume effects | `fsl-tool` + tissue segmentation | PVC-corrected CBF map |
|
|
47
|
+
| ASL-to-MNI normalization | Warp CBF map to MNI152 template for group analysis | `fsl-tool` (FNIRT) or `smri-skill` | CBF in MNI152 space |
|
|
48
|
+
| ROI-based CBF extraction | Extract mean CBF from atlas-defined ROIs | `fsl-tool` + atlas | Per-region CBF values (CSV) |
|
|
49
|
+
| Quality control | Check for outliers, low SNR, motion artifacts in ASL series | `scripts/compute_cbf.py` (--qc) | QC report |
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## ASL Labeling Strategies
|
|
54
|
+
|
|
55
|
+
| Strategy | Description | Typical Parameters |
|
|
56
|
+
|---|---|---|
|
|
57
|
+
| **pCASL** (pseudo-Continuous ASL) | Most common; single PLD, good SNR | Label duration: 1.5–2.0 s, PLD: 1.5–2.0 s |
|
|
58
|
+
| **CASL** (Continuous ASL) | Longer labeling, higher SNR but more sensitive to transit effects | Label duration: 2–4 s, PLD: 1–2 s |
|
|
59
|
+
| **PASL** (Pulsed ASL) | Short labeling, lower SNR, no separate M0 needed (QUIPSS II) | Bolus thickness: 10–15 cm, TI1/TI2: 700/1800 ms |
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Core CBF Quantification Model
|
|
64
|
+
|
|
65
|
+
The Buxton single-compartment model for pCASL:
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
CBF = (6000 * ΔM * λ) / (2 * α * M0 * T1b * (exp(-w/T1b) - exp(-(τ+w)/T1b))) [mL/100g/min]
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Where:
|
|
72
|
+
- ΔM = ASL difference image (control - label)
|
|
73
|
+
- M0 = equilibrium magnetization of arterial blood
|
|
74
|
+
- λ = blood-tissue water partition coefficient (0.9 mL/g)
|
|
75
|
+
- α = labeling efficiency (0.85 for pCASL, 0.95 for CASL, 0.98 for PASL)
|
|
76
|
+
- T1b = T1 of arterial blood at 3T (~1.65 s) or 1.5T (~1.35 s)
|
|
77
|
+
- w = post-labeling delay (PLD)
|
|
78
|
+
- τ = label duration
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Scripts
|
|
83
|
+
|
|
84
|
+
### `scripts/compute_cbf.py`
|
|
85
|
+
Computes CBF maps from ASL difference images and M0 reference.
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
python skills/asl-skill/scripts/compute_cbf.py \
|
|
89
|
+
--diff /path/to/asl_diff.nii.gz \
|
|
90
|
+
--m0 /path/to/m0_reference.nii.gz \
|
|
91
|
+
--output /path/to/asl_output/cbf_map.nii.gz \
|
|
92
|
+
--roi-summary /path/to/asl_output/cbf_roi.csv \
|
|
93
|
+
--roi-atlas /path/to/atlas_in_asl_space.nii.gz \
|
|
94
|
+
--label-strategy pcasl \
|
|
95
|
+
--pld 1.8 \
|
|
96
|
+
--label-duration 1.8 \
|
|
97
|
+
--field-strength 3.0
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## Standard Output Layout
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
asl_output/
|
|
106
|
+
├── preprocessed/ # Motion-corrected, registered ASL
|
|
107
|
+
├── cbf/ # CBF maps
|
|
108
|
+
│ ├── cbf_map.nii.gz
|
|
109
|
+
│ ├── cbf_roi.csv
|
|
110
|
+
│ └── cbf_mni.nii.gz # (if normalization requested)
|
|
111
|
+
├── pvc/ # Partial volume corrected CBF (if requested)
|
|
112
|
+
├── qc/ # Quality control reports
|
|
113
|
+
│ └── asl_qc_report.csv
|
|
114
|
+
└── logs/
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## Installation (Handled by dependency-planner)
|
|
120
|
+
|
|
121
|
+
No manual installation required at this layer.
|
|
122
|
+
When first used, `asl-skill` automatically calls `dependency-planner` to ensure `fsl-tool`, `nibabel-skill`, and `claw-shell` are ready.
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Important Notes & Limitations
|
|
127
|
+
|
|
128
|
+
- ASL has inherently low SNR compared to BOLD fMRI; averaging multiple control-label pairs is recommended.
|
|
129
|
+
- M0 image is required for absolute CBF quantification; if absent, only relative CBF can be computed.
|
|
130
|
+
- PLD and labeling duration must be known from the acquisition protocol; incorrect values invalidate CBF.
|
|
131
|
+
- At 3T, T1b ≈ 1.65 s; at 1.5T, T1b ≈ 1.35 s.
|
|
132
|
+
- Partial volume correction is important for ASL due to its low resolution (~3–4 mm).
|
|
133
|
+
- ASLPrep (https://aslprep.readthedocs.io/) is the recommended automated pipeline for large cohorts.
|
|
134
|
+
- This skill is for research workflows; not for clinical decision-making.
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## When to Call This Skill
|
|
139
|
+
|
|
140
|
+
- After `smri-skill` when T1w structural preprocessing is complete and ASL data needs processing.
|
|
141
|
+
- When the user needs CBF quantification from pCASL, CASL, or PASL data.
|
|
142
|
+
- When ASL-to-T1w coregistration or normalization to MNI space is required.
|
|
143
|
+
- When partial volume correction is requested for ASL perfusion analysis.
|
|
144
|
+
- When dataset skills (e.g., PNC) delegate ASL processing.
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## Complementary / Related Skills
|
|
149
|
+
|
|
150
|
+
- `smri-skill` → T1w structural preprocessing (brain extraction, tissue segmentation for PVC)
|
|
151
|
+
- `fmri-skill` → if ASL is used alongside BOLD for multimodal analysis
|
|
152
|
+
- `fsl-tool` → ASL_PREPCORE (preprocessing), FLIRT/FNIRT (registration/normalization), BASIL (CBF quantification)
|
|
153
|
+
- `nibabel-skill` → NIfTI I/O for mask manipulation
|
|
154
|
+
- `nilearn-tool` → ROI-based CBF extraction
|
|
155
|
+
- `brain-visualization` → CBF map visualization
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## Reference
|
|
160
|
+
- Alsop et al. (2015): Recommended implementation of ASL (Magnetic Resonance in Medicine)
|
|
161
|
+
- Buxton et al. (1998): General kinetic model for ASL (Journal of Cerebral Blood Flow & Metabolism)
|
|
162
|
+
- ASLPrep: https://aslprep.readthedocs.io/
|
|
163
|
+
- FSL BASIL: https://fsl.fmrib.ox.ac.uk/fsl/fslwiki/BASIL
|
|
164
|
+
- BIDS ASL extension: https://bids-specification.readthedocs.io/en/stable/04-modality-specific-files/11-arterial-spin-labeling.html
|
|
165
|
+
|
|
166
|
+
Created At: 2026-05-06 12:19 HKT
|
|
167
|
+
Last Updated At: 2026-05-06 12:19 HKT
|
|
168
|
+
Author: chengwang96
|