@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,302 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: abide-skill
|
|
3
|
+
description: "Use this skill whenever the user wants an end-to-end workflow for the ABIDE (Autism Brain Imaging Data Exchange) dataset, including download, BIDS organization, and processing of sMRI and rs-fMRI data. Triggers include: 'ABIDE', 'ABIDE data', 'process ABIDE', 'ABIDE fMRI', 'ABIDE sMRI', 'autism imaging', or any request to run the ABIDE pipeline. This is the NeuroClaw dataset-orchestration layer for ABIDE."
|
|
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
|
+
# ABIDE Skill (Dataset-Orchestration Layer)
|
|
14
|
+
|
|
15
|
+
## Overview
|
|
16
|
+
`abide-skill` is the NeuroClaw orchestration skill for the **ABIDE (Autism Brain Imaging Data Exchange)** dataset.
|
|
17
|
+
|
|
18
|
+
It coordinates a fixed three-phase workflow:
|
|
19
|
+
1. Download ABIDE data from the FCP/INDI repository or NITRC.
|
|
20
|
+
2. Prepare and validate BIDS-style data organization for downstream processing.
|
|
21
|
+
3. Delegate modality pipelines to `smri-skill` and `fmri-skill`.
|
|
22
|
+
|
|
23
|
+
It also provides **phenotype extraction** and **QC integration** paths:
|
|
24
|
+
- Extract and merge ABIDE phenotype tables (diagnosis, age, sex, site, FIQ, ADOS, etc.).
|
|
25
|
+
- Generate per-subject QC summaries with exclusion lists.
|
|
26
|
+
|
|
27
|
+
This skill follows NeuroClaw hierarchy:
|
|
28
|
+
- Defines **WHAT to do**, not low-level implementation details.
|
|
29
|
+
- Does **not** execute direct shell commands itself.
|
|
30
|
+
- Delegates all execution via `claw-shell` to base/tool skills.
|
|
31
|
+
|
|
32
|
+
**Research use only.**
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Download Stage (Mandatory First Step)
|
|
37
|
+
|
|
38
|
+
### Source
|
|
39
|
+
ABIDE data is distributed through the **FCP/INDI** repository:
|
|
40
|
+
- ABIDE I: https://fcon_1000.projects.nitrc.org/indi/abide/
|
|
41
|
+
- ABIDE II: https://fcon_1000.projects.nitrc.org/indi/abide_II.html
|
|
42
|
+
- NITRC mirror: https://www.nitrc.org/projects/fcp_indi/
|
|
43
|
+
|
|
44
|
+
### Supported ABIDE Data Packages
|
|
45
|
+
- **ABIDE I**: 1,112 subjects from 17 international sites (539 ASD, 573 controls)
|
|
46
|
+
- **ABIDE II**: 1,044 subjects from 19 sites
|
|
47
|
+
- **Phenotype data**: CSV files with demographics, diagnosis, cognitive scores
|
|
48
|
+
- **Preprocessed derivatives** (optional): CPAC, DPARSF, CCS, NeuroMark pipelines
|
|
49
|
+
|
|
50
|
+
### Delegation Rules for Download
|
|
51
|
+
- Environment/setup checks: `dependency-planner` + `conda-env-manager`
|
|
52
|
+
- Download tool installation and execution: `claw-shell`
|
|
53
|
+
- Optional raw-data organization to BIDS-style staging: `bids-organizer`
|
|
54
|
+
|
|
55
|
+
### Download Inputs to Confirm in Plan
|
|
56
|
+
- Target ABIDE version (I, II, or both)
|
|
57
|
+
- Target subset (full cohort, specific sites, or ASD/control only)
|
|
58
|
+
- Subject list scope (full or custom IDs)
|
|
59
|
+
- Whether to download raw data or preprocessed derivatives
|
|
60
|
+
- Destination directory with sufficient disk space
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Narrow Path: ABIDE Raw NIfTI -> BIDS Staging
|
|
65
|
+
|
|
66
|
+
Use this path when the task only asks to reorganize raw ABIDE NIfTI files into a BIDS-style dataset and does not require preprocessing, ROI extraction, phenotype merging, or downstream analysis.
|
|
67
|
+
|
|
68
|
+
### When this narrow path should dominate
|
|
69
|
+
- The task objective is limited to ABIDE NIfTI staging, BIDS renaming, sidecar handling, and dataset-level metadata.
|
|
70
|
+
- Inputs are already local ABIDE NIfTI files or ABIDE-style subject/site folders.
|
|
71
|
+
- The required deliverable is a direct staging script or command sequence, not a plan for fMRIPrep or downstream analysis.
|
|
72
|
+
|
|
73
|
+
### Narrow-path contract
|
|
74
|
+
- Do not widen the solution to fMRIPrep, ROI extraction, phenotype merging, or downstream analysis unless the task explicitly requires them.
|
|
75
|
+
- Treat this as a direct file-organization problem: scan ABIDE subject/site layout, normalize subject labels, map modalities to BIDS names, copy or symlink NIfTI plus matching sidecars, and write dataset-level metadata plus staging logs.
|
|
76
|
+
- If the task is benchmark-style, prefer a single direct end-to-end staging script over a confirmation-first orchestration plan.
|
|
77
|
+
|
|
78
|
+
### Expected narrow-path behavior
|
|
79
|
+
1. Detect ABIDE-style subject IDs (numeric, e.g., `0050642`) and normalize to BIDS labels such as `sub-0050642`.
|
|
80
|
+
2. Detect site information and encode as BIDS session or metadata (e.g., `ses-NYU`, or site column in `participants.tsv`).
|
|
81
|
+
3. Route modalities:
|
|
82
|
+
- T1w -> `anat/*_T1w`
|
|
83
|
+
- rs-fMRI/BOLD -> `func/*_task-rest_bold`
|
|
84
|
+
4. Preserve or rename matching JSON sidecars when available; if metadata is absent, create only the minimal dataset files required by the task and log the limitation.
|
|
85
|
+
5. Emit dataset-level outputs such as `dataset_description.json`, `participants.tsv`, `README`, and a manifest or skipped-file report.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Core Workflow (Never Bypassed)
|
|
90
|
+
1. Identify user target: full ABIDE download, imaging subset, phenotype extraction, or BIDS staging only.
|
|
91
|
+
2. Generate a numbered plan with tools, outputs, runtime, storage, and risks.
|
|
92
|
+
3. Wait for explicit confirmation (`YES` / `execute` / `proceed`).
|
|
93
|
+
4. On confirmation, run download stage first (if needed).
|
|
94
|
+
5. After download success, run BIDS preparation using `scripts/reorganize_abide.py`.
|
|
95
|
+
6. Delegate to modality skills:
|
|
96
|
+
- `smri-skill` for structural MRI (T1w)
|
|
97
|
+
- `fmri-skill` for resting-state fMRI (rs-fMRI)
|
|
98
|
+
7. If phenotype extraction is requested, run `scripts/extract_abide_phenotype.py`.
|
|
99
|
+
8. If QC summary is requested, run `scripts/abide_qc_summary.py`.
|
|
100
|
+
9. Save outputs into an ABIDE-centered structure under `abide_output/`.
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Input Layout (Example)
|
|
105
|
+
|
|
106
|
+
Subject `0050642` from site NYU:
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
abide_raw/
|
|
110
|
+
NYU/
|
|
111
|
+
0050642/
|
|
112
|
+
session_1/
|
|
113
|
+
anat_1/
|
|
114
|
+
anat.nii.gz
|
|
115
|
+
func_1/
|
|
116
|
+
func.nii.gz
|
|
117
|
+
phenotype/
|
|
118
|
+
ABIDE_phenotypic.csv
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Or flat layout:
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
abide_raw/
|
|
125
|
+
0050642/
|
|
126
|
+
anat/
|
|
127
|
+
T1w.nii.gz
|
|
128
|
+
func/
|
|
129
|
+
rest_bold.nii.gz
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## BIDS Preparation
|
|
135
|
+
|
|
136
|
+
### Script: `scripts/reorganize_abide.py`
|
|
137
|
+
|
|
138
|
+
Converts ABIDE raw directory structure to BIDS-compliant layout.
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
python skills/abide-skill/scripts/reorganize_abide.py \
|
|
142
|
+
--input /path/to/abide_raw \
|
|
143
|
+
--output /path/to/abide_bids \
|
|
144
|
+
--phenotype /path/to/abide_raw/phenotype/ABIDE_phenotypic.csv
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Features:
|
|
148
|
+
- Subject ID normalization: numeric ABIDE IDs to BIDS `sub-NNNNNNN`
|
|
149
|
+
- Site extraction and encoding in `participants.tsv`
|
|
150
|
+
- Modality routing: T1w, rs-fMRI
|
|
151
|
+
- Sidecar JSON preservation and validation
|
|
152
|
+
- `dataset_description.json` and `participants.tsv` generation with phenotype metadata
|
|
153
|
+
- Dry-run mode: `--dry-run` to preview without copying
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## Multimodal Processing Delegation
|
|
158
|
+
|
|
159
|
+
After BIDS staging completes, `abide-skill` delegates by modality:
|
|
160
|
+
|
|
161
|
+
| Modality | Delegated skill | Typical tasks | Main outputs |
|
|
162
|
+
|---|---|---|---|
|
|
163
|
+
| sMRI (T1w) | `smri-skill` | brain extraction, tissue segmentation, cortical reconstruction, ROI morphometry | `smri_output/` derivatives and stats |
|
|
164
|
+
| rs-fMRI | `fmri-skill` | preprocessing, denoising, ROI time series, connectivity | `fmri_output/` derivatives, timeseries, connectivity |
|
|
165
|
+
|
|
166
|
+
### Delegation Strategy
|
|
167
|
+
- If user asks for full ABIDE analysis: run sMRI -> fMRI in ordered phases.
|
|
168
|
+
- If user asks for one modality only: call only the corresponding modality skill.
|
|
169
|
+
- If compute resources are adequate and the user approves parallel runs: run modality pipelines in parallel.
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## Phenotype Extraction
|
|
174
|
+
|
|
175
|
+
### Script: `scripts/extract_abide_phenotype.py`
|
|
176
|
+
|
|
177
|
+
Extracts and merges ABIDE phenotype tables for downstream analysis.
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
python skills/abide-skill/scripts/extract_abide_phenotype.py \
|
|
181
|
+
--phenotype-dir /path/to/abide_raw/phenotype \
|
|
182
|
+
--output /path/to/abide_output/phenotype/merged_phenotype.csv \
|
|
183
|
+
--columns subject,DX_GROUP,AGE_AT_SCAN,SEX,FIQ,VIQ,PIQ,site \
|
|
184
|
+
--imaging-ids /path/to/abide_output/bids/participants.tsv
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
Features:
|
|
188
|
+
- Reads ABIDE phenotype CSV files (ABIDE I and II compatible)
|
|
189
|
+
- Standardizes column names (DX_GROUP: 1=ASD, 2=control)
|
|
190
|
+
- Column selection and renaming
|
|
191
|
+
- Site encoding and grouping
|
|
192
|
+
- Missing value handling
|
|
193
|
+
- Cross-reference with imaging subject list
|
|
194
|
+
- Outputs merged CSV ready for statistical analysis or model training
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## QC Integration
|
|
199
|
+
|
|
200
|
+
### Script: `scripts/abide_qc_summary.py`
|
|
201
|
+
|
|
202
|
+
Generates per-subject QC summaries and exclusion lists.
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
python skills/abide-skill/scripts/abide_qc_summary.py \
|
|
206
|
+
--fmriprep-dir /path/to/abide_output/fmriprep \
|
|
207
|
+
--freesurfer-dir /path/to/abide_output/smri/freesurfer \
|
|
208
|
+
--raw-qc /path/to/abide_raw/phenotype/ABIDE_phenotypic.csv \
|
|
209
|
+
--output /path/to/abide_output/qc/qc_summary.csv \
|
|
210
|
+
--exclude-output /path/to/abide_output/qc/exclude_list.csv \
|
|
211
|
+
--fd-threshold 0.3 \
|
|
212
|
+
--coverage-threshold 0.8
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
Features:
|
|
216
|
+
- Reads fMRIPrep confounds (framewise displacement, DVARS)
|
|
217
|
+
- Reads FreeSurfer recon-all QC metrics
|
|
218
|
+
- Incorporates ABIDE QC flags (QC_RATER_1, func_perc_fd, anat_rater_1, etc.)
|
|
219
|
+
- Applies exclusion criteria: motion threshold (FD), coverage threshold, structural quality
|
|
220
|
+
- Per-site QC summary for site-effect assessment
|
|
221
|
+
- Outputs per-subject QC summary CSV and exclusion list CSV
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## Recommended Output Layout
|
|
226
|
+
All assets should be organized under `./abide_output/`:
|
|
227
|
+
- `abide_output/raw/` (downloaded original ABIDE files)
|
|
228
|
+
- `abide_output/bids/` (staged BIDS data)
|
|
229
|
+
- `abide_output/staging/` (optional normalized staging intermediate)
|
|
230
|
+
- `abide_output/smri/` (links or copies from `smri_output/`)
|
|
231
|
+
- `abide_output/fmri/` (links or copies from `fmri_output/`)
|
|
232
|
+
- `abide_output/phenotype/` (merged phenotype tables)
|
|
233
|
+
- `abide_output/qc/` (QC summaries and exclusion lists)
|
|
234
|
+
- `abide_output/logs/` (download + orchestration logs)
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
## Benchmark Adapter Guidance
|
|
239
|
+
|
|
240
|
+
For benchmark-style prompts, do not force the full `download -> staging -> multimodal processing` orchestration when the task is only asking for local ABIDE data staging or organization.
|
|
241
|
+
|
|
242
|
+
- If the task starts from raw ABIDE data already present on disk and only asks for BIDS-style staging / organization:
|
|
243
|
+
- skip the mandatory download stage
|
|
244
|
+
- do not automatically delegate to `smri-skill` or `fmri-skill`
|
|
245
|
+
- default to the narrow path `local raw ABIDE discovery -> BIDS-style staging -> minimal metadata -> validation/report`
|
|
246
|
+
- In benchmark mode, do not require explicit confirmation before presenting the direct staging solution.
|
|
247
|
+
- Preserve the ABIDE-centered output contract under `abide_output/bids/` when the task is specifically a staging benchmark.
|
|
248
|
+
- Only use the full multimodal orchestration and confirmation-heavy workflow when the prompt explicitly asks for download, end-to-end ABIDE processing, or post-staging structural / functional analysis.
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
## Safety and Execution Policy
|
|
253
|
+
- No execution before explicit plan confirmation.
|
|
254
|
+
- All execution must be routed via `claw-shell`.
|
|
255
|
+
- Missing dependencies must be resolved by `dependency-planner` before running.
|
|
256
|
+
- If download fails for partial subjects, continue batch with clear failure report and retry list.
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
## Important Notes and Limitations
|
|
261
|
+
- ABIDE data from different sites may have varying acquisition parameters; site effects should be accounted for in analysis.
|
|
262
|
+
- ABIDE subject IDs are numeric and vary in length across sites.
|
|
263
|
+
- ABIDE I and II have different phenotype table formats; the extraction script handles both.
|
|
264
|
+
- ABIDE provides preprocessed derivatives from multiple pipelines (CPAC, DPARSF, CCS); raw data processing via fMRIPrep is recommended for reproducibility.
|
|
265
|
+
- ABIDE data does not include task-fMRI; only resting-state fMRI is available.
|
|
266
|
+
- `abide-skill` is orchestration-only; detailed preprocessing logic remains in `smri-skill` and `fmri-skill`.
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
## When to Call This Skill
|
|
271
|
+
- User asks for end-to-end ABIDE workflow.
|
|
272
|
+
- User asks to download ABIDE data and then run sMRI/rs-fMRI processing.
|
|
273
|
+
- User needs BIDS staging for raw ABIDE NIfTI files.
|
|
274
|
+
- User asks to extract and merge ABIDE phenotype tables.
|
|
275
|
+
- User asks for ABIDE-specific QC summaries and exclusion lists.
|
|
276
|
+
- User needs a single entry point for ABIDE multimodal orchestration.
|
|
277
|
+
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
## Complementary / Related Skills
|
|
281
|
+
- `smri-skill`
|
|
282
|
+
- `fmri-skill`
|
|
283
|
+
- `bids-organizer`
|
|
284
|
+
- `fmriprep-tool`
|
|
285
|
+
- `freesurfer-tool`
|
|
286
|
+
- `neurostorm`
|
|
287
|
+
- `brain_gnn`
|
|
288
|
+
- `dependency-planner`
|
|
289
|
+
- `conda-env-manager`
|
|
290
|
+
- `claw-shell`
|
|
291
|
+
|
|
292
|
+
---
|
|
293
|
+
|
|
294
|
+
## Reference
|
|
295
|
+
- ABIDE I: https://fcon_1000.projects.nitrc.org/indi/abide/
|
|
296
|
+
- ABIDE II: https://fcon_1000.projects.nitrc.org/indi/abide_II.html
|
|
297
|
+
- Di Martino et al., 2014, *The autism brain imaging data exchange: towards a large-scale evaluation of the intrinsic brain architecture in autism*
|
|
298
|
+
- BIDS spec: https://bids.neuroimaging.io/
|
|
299
|
+
|
|
300
|
+
Created At: 2026-05-06 01:45 HKT
|
|
301
|
+
Last Updated At: 2026-05-06 01:45 HKT
|
|
302
|
+
Author: chengwang96
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Generate per-subject QC summaries and exclusion lists for ABIDE.
|
|
3
|
+
|
|
4
|
+
Combines fMRIPrep confounds, FreeSurfer recon-all metrics, and ABIDE native
|
|
5
|
+
QC flags to produce a unified QC report with configurable exclusion criteria.
|
|
6
|
+
"""
|
|
7
|
+
import argparse
|
|
8
|
+
import csv
|
|
9
|
+
import sys
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from typing import Dict, List, Optional, Set, Tuple
|
|
12
|
+
|
|
13
|
+
try:
|
|
14
|
+
import pandas as pd
|
|
15
|
+
except ImportError:
|
|
16
|
+
print("Error: pandas is required. Install with: pip install pandas", file=sys.stderr)
|
|
17
|
+
sys.exit(1)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def detect_delimiter(file_path: Path) -> str:
|
|
21
|
+
"""Detect whether file uses tab or comma delimiter."""
|
|
22
|
+
with open(file_path, "r", encoding="utf-8") as f:
|
|
23
|
+
first_line = f.readline()
|
|
24
|
+
if "\t" in first_line:
|
|
25
|
+
return "\t"
|
|
26
|
+
return ","
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def collect_fmriprep_qc(fmriprep_dir: Path) -> Dict[str, Dict[str, float]]:
|
|
30
|
+
"""Collect QC metrics from fMRIPrep outputs."""
|
|
31
|
+
qc = {}
|
|
32
|
+
|
|
33
|
+
confounds_patterns = [
|
|
34
|
+
"**/desc-confounds_timeseries.tsv",
|
|
35
|
+
"**/*_desc-confounds_timeseries.tsv",
|
|
36
|
+
"**/confounds.tsv",
|
|
37
|
+
]
|
|
38
|
+
|
|
39
|
+
confounds_files = []
|
|
40
|
+
for pattern in confounds_patterns:
|
|
41
|
+
confounds_files.extend(fmriprep_dir.rglob(pattern))
|
|
42
|
+
|
|
43
|
+
for confounds_file in confounds_files:
|
|
44
|
+
subject_id = None
|
|
45
|
+
for part in confounds_file.parts:
|
|
46
|
+
if part.startswith("sub-"):
|
|
47
|
+
subject_id = part
|
|
48
|
+
break
|
|
49
|
+
if not subject_id:
|
|
50
|
+
continue
|
|
51
|
+
|
|
52
|
+
delimiter = detect_delimiter(confounds_file)
|
|
53
|
+
try:
|
|
54
|
+
df = pd.read_csv(confounds_file, sep=delimiter, low_memory=False)
|
|
55
|
+
except Exception as e:
|
|
56
|
+
print(f"[WARN] Failed to read {confounds_file}: {e}", file=sys.stderr)
|
|
57
|
+
continue
|
|
58
|
+
|
|
59
|
+
fd_col = None
|
|
60
|
+
for col_name in ["framewise_displacement", "fd", "FD"]:
|
|
61
|
+
if col_name in df.columns:
|
|
62
|
+
fd_col = col_name
|
|
63
|
+
break
|
|
64
|
+
|
|
65
|
+
dvars_col = None
|
|
66
|
+
for col_name in ["dvars", "DVARS", "std_dvars"]:
|
|
67
|
+
if col_name in df.columns:
|
|
68
|
+
dvars_col = col_name
|
|
69
|
+
break
|
|
70
|
+
|
|
71
|
+
metrics = {"n_volumes": len(df)}
|
|
72
|
+
|
|
73
|
+
if fd_col:
|
|
74
|
+
fd_values = pd.to_numeric(df[fd_col], errors="coerce").dropna()
|
|
75
|
+
if len(fd_values) > 0:
|
|
76
|
+
metrics["mean_fd"] = float(fd_values.mean())
|
|
77
|
+
metrics["max_fd"] = float(fd_values.max())
|
|
78
|
+
metrics["median_fd"] = float(fd_values.median())
|
|
79
|
+
else:
|
|
80
|
+
metrics["mean_fd"] = 0.0
|
|
81
|
+
metrics["max_fd"] = 0.0
|
|
82
|
+
metrics["median_fd"] = 0.0
|
|
83
|
+
|
|
84
|
+
if dvars_col:
|
|
85
|
+
dvars_values = pd.to_numeric(df[dvars_col], errors="coerce").dropna()
|
|
86
|
+
if len(dvars_values) > 0:
|
|
87
|
+
metrics["mean_dvars"] = float(dvars_values.mean())
|
|
88
|
+
|
|
89
|
+
if subject_id in qc:
|
|
90
|
+
existing = qc[subject_id]
|
|
91
|
+
existing["mean_fd"] = max(existing.get("mean_fd", 0), metrics.get("mean_fd", 0))
|
|
92
|
+
existing["max_fd"] = max(existing.get("max_fd", 0), metrics.get("max_fd", 0))
|
|
93
|
+
existing["n_volumes"] = existing.get("n_volumes", 0) + metrics.get("n_volumes", 0)
|
|
94
|
+
else:
|
|
95
|
+
qc[subject_id] = metrics
|
|
96
|
+
|
|
97
|
+
return qc
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def collect_freesurfer_qc(freesurfer_dir: Path) -> Dict[str, Dict[str, float]]:
|
|
101
|
+
"""Collect QC metrics from FreeSurfer recon-all outputs."""
|
|
102
|
+
qc = {}
|
|
103
|
+
|
|
104
|
+
for recon_log in freesurfer_dir.rglob("**/recon-all.log"):
|
|
105
|
+
# Extract subject ID from path
|
|
106
|
+
subject_id = None
|
|
107
|
+
for part in recon_log.parts:
|
|
108
|
+
if part.startswith("sub-"):
|
|
109
|
+
subject_id = part
|
|
110
|
+
break
|
|
111
|
+
if not subject_id:
|
|
112
|
+
continue
|
|
113
|
+
|
|
114
|
+
completed = False
|
|
115
|
+
try:
|
|
116
|
+
with open(recon_log, "r", encoding="utf-8", errors="ignore") as f:
|
|
117
|
+
content = f.read()
|
|
118
|
+
completed = "finished without error" in content.lower() or "recon-all -done" in content.lower()
|
|
119
|
+
except Exception:
|
|
120
|
+
pass
|
|
121
|
+
|
|
122
|
+
metrics = {"completed": completed}
|
|
123
|
+
|
|
124
|
+
# Try to read aseg.stats
|
|
125
|
+
aseg_matches = list(freesurfer_dir.rglob(f"{subject_id}**/aseg.stats"))
|
|
126
|
+
if aseg_matches:
|
|
127
|
+
try:
|
|
128
|
+
with open(aseg_matches[0], "r", encoding="utf-8", errors="ignore") as f:
|
|
129
|
+
for line in f:
|
|
130
|
+
if "EstimatedTotalIntraCranialVol" in line:
|
|
131
|
+
parts = line.split()
|
|
132
|
+
if len(parts) >= 4:
|
|
133
|
+
try:
|
|
134
|
+
metrics["etiv"] = float(parts[3])
|
|
135
|
+
except ValueError:
|
|
136
|
+
pass
|
|
137
|
+
elif "BrainSegVol" in line and "Not" not in line:
|
|
138
|
+
parts = line.split()
|
|
139
|
+
if len(parts) >= 4:
|
|
140
|
+
try:
|
|
141
|
+
metrics["total_brain_volume"] = float(parts[3])
|
|
142
|
+
except ValueError:
|
|
143
|
+
pass
|
|
144
|
+
except Exception:
|
|
145
|
+
pass
|
|
146
|
+
|
|
147
|
+
qc[subject_id] = metrics
|
|
148
|
+
|
|
149
|
+
return qc
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def collect_abide_native_qc(phenotype_file: Path) -> Dict[str, Dict[str, float]]:
|
|
153
|
+
"""Collect ABIDE native QC flags from phenotype file."""
|
|
154
|
+
qc = {}
|
|
155
|
+
if not phenotype_file.exists():
|
|
156
|
+
return qc
|
|
157
|
+
|
|
158
|
+
try:
|
|
159
|
+
df = pd.read_csv(phenotype_file, sep=None, engine="python", low_memory=False)
|
|
160
|
+
except Exception as e:
|
|
161
|
+
print(f"[WARN] Failed to read {phenotype_file}: {e}", file=sys.stderr)
|
|
162
|
+
return qc
|
|
163
|
+
|
|
164
|
+
id_col = None
|
|
165
|
+
for col_name in ["SUBJECT_ID", "subject", "Subject", "SUBJECT_KEY"]:
|
|
166
|
+
if col_name in df.columns:
|
|
167
|
+
id_col = col_name
|
|
168
|
+
break
|
|
169
|
+
if not id_col:
|
|
170
|
+
return qc
|
|
171
|
+
|
|
172
|
+
# Look for QC columns
|
|
173
|
+
qc_cols = [c for c in df.columns if "qc" in c.lower() or "rater" in c.lower() or "perc_fd" in c.lower()]
|
|
174
|
+
|
|
175
|
+
for _, row in df.iterrows():
|
|
176
|
+
sid = str(row[id_col]).strip()
|
|
177
|
+
metrics = {}
|
|
178
|
+
for col in qc_cols:
|
|
179
|
+
val = row.get(col)
|
|
180
|
+
if pd.notna(val):
|
|
181
|
+
try:
|
|
182
|
+
metrics[col] = float(val)
|
|
183
|
+
except (ValueError, TypeError):
|
|
184
|
+
metrics[col] = str(val)
|
|
185
|
+
qc[f"sub-{sid}"] = metrics
|
|
186
|
+
|
|
187
|
+
return qc
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def generate_qc_summary(
|
|
191
|
+
fmriprep_qc: Dict[str, Dict[str, float]],
|
|
192
|
+
freesurfer_qc: Dict[str, Dict[str, float]],
|
|
193
|
+
abide_qc: Dict[str, Dict[str, float]],
|
|
194
|
+
fd_threshold: float = 0.3,
|
|
195
|
+
max_fd_threshold: float = 5.0,
|
|
196
|
+
coverage_threshold: float = 0.8,
|
|
197
|
+
) -> Tuple["pd.DataFrame", List[str]]:
|
|
198
|
+
"""Generate QC summary DataFrame and exclusion list."""
|
|
199
|
+
all_subjects = set()
|
|
200
|
+
all_subjects.update(fmriprep_qc.keys())
|
|
201
|
+
all_subjects.update(freesurfer_qc.keys())
|
|
202
|
+
all_subjects.update(abide_qc.keys())
|
|
203
|
+
|
|
204
|
+
rows = []
|
|
205
|
+
excluded = []
|
|
206
|
+
|
|
207
|
+
for sub_id in sorted(all_subjects):
|
|
208
|
+
row = {"subject_id": sub_id}
|
|
209
|
+
exclude_reasons = []
|
|
210
|
+
|
|
211
|
+
fp = fmriprep_qc.get(sub_id, {})
|
|
212
|
+
row["mean_fd"] = fp.get("mean_fd", None)
|
|
213
|
+
row["max_fd"] = fp.get("max_fd", None)
|
|
214
|
+
row["median_fd"] = fp.get("median_fd", None)
|
|
215
|
+
row["mean_dvars"] = fp.get("mean_dvars", None)
|
|
216
|
+
row["n_volumes"] = fp.get("n_volumes", None)
|
|
217
|
+
|
|
218
|
+
fs = freesurfer_qc.get(sub_id, {})
|
|
219
|
+
row["fs_completed"] = fs.get("completed", None)
|
|
220
|
+
row["total_brain_volume"] = fs.get("total_brain_volume", None)
|
|
221
|
+
row["etiv"] = fs.get("etiv", None)
|
|
222
|
+
|
|
223
|
+
abcd = abide_qc.get(sub_id, {})
|
|
224
|
+
for key, val in abcd.items():
|
|
225
|
+
row[f"abide_{key}"] = val
|
|
226
|
+
|
|
227
|
+
if row["mean_fd"] is not None and row["mean_fd"] > fd_threshold:
|
|
228
|
+
exclude_reasons.append(f"mean_fd={row['mean_fd']:.3f}>{fd_threshold}")
|
|
229
|
+
|
|
230
|
+
if row["max_fd"] is not None and row["max_fd"] > max_fd_threshold:
|
|
231
|
+
exclude_reasons.append(f"max_fd={row['max_fd']:.3f}>{max_fd_threshold}")
|
|
232
|
+
|
|
233
|
+
if row["fs_completed"] is False:
|
|
234
|
+
exclude_reasons.append("FreeSurfer recon-all incomplete")
|
|
235
|
+
|
|
236
|
+
row["exclude"] = len(exclude_reasons) > 0
|
|
237
|
+
row["exclude_reasons"] = "; ".join(exclude_reasons) if exclude_reasons else ""
|
|
238
|
+
|
|
239
|
+
if exclude_reasons:
|
|
240
|
+
excluded.append(sub_id)
|
|
241
|
+
|
|
242
|
+
rows.append(row)
|
|
243
|
+
|
|
244
|
+
df = pd.DataFrame(rows)
|
|
245
|
+
return df, excluded
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
def main() -> int:
|
|
249
|
+
parser = argparse.ArgumentParser(
|
|
250
|
+
description="Generate per-subject QC summaries and exclusion lists for ABIDE."
|
|
251
|
+
)
|
|
252
|
+
parser.add_argument("--fmriprep-dir", help="Path to fMRIPrep output directory")
|
|
253
|
+
parser.add_argument("--freesurfer-dir", help="Path to FreeSurfer output directory")
|
|
254
|
+
parser.add_argument("--raw-qc", help="Path to ABIDE phenotype CSV with QC flags")
|
|
255
|
+
parser.add_argument("--output", required=True, help="Output path for QC summary CSV")
|
|
256
|
+
parser.add_argument("--exclude-output", help="Output path for exclusion list CSV")
|
|
257
|
+
parser.add_argument("--fd-threshold", type=float, default=0.3, help="Mean FD threshold (default: 0.3)")
|
|
258
|
+
parser.add_argument("--max-fd-threshold", type=float, default=5.0, help="Max FD threshold (default: 5.0)")
|
|
259
|
+
parser.add_argument("--coverage-threshold", type=float, default=0.8, help="Coverage threshold (default: 0.8)")
|
|
260
|
+
args = parser.parse_args()
|
|
261
|
+
|
|
262
|
+
fmriprep_qc = {}
|
|
263
|
+
freesurfer_qc = {}
|
|
264
|
+
abide_qc = {}
|
|
265
|
+
|
|
266
|
+
if args.fmriprep_dir:
|
|
267
|
+
fp_dir = Path(args.fmriprep_dir).resolve()
|
|
268
|
+
if fp_dir.exists():
|
|
269
|
+
print(f"Collecting fMRIPrep QC from {fp_dir}...")
|
|
270
|
+
fmriprep_qc = collect_fmriprep_qc(fp_dir)
|
|
271
|
+
print(f" Found {len(fmriprep_qc)} subjects")
|
|
272
|
+
|
|
273
|
+
if args.freesurfer_dir:
|
|
274
|
+
fs_dir = Path(args.freesurfer_dir).resolve()
|
|
275
|
+
if fs_dir.exists():
|
|
276
|
+
print(f"Collecting FreeSurfer QC from {fs_dir}...")
|
|
277
|
+
freesurfer_qc = collect_freesurfer_qc(fs_dir)
|
|
278
|
+
print(f" Found {len(freesurfer_qc)} subjects")
|
|
279
|
+
|
|
280
|
+
if args.raw_qc:
|
|
281
|
+
raw_qc_path = Path(args.raw_qc).resolve()
|
|
282
|
+
if raw_qc_path.exists():
|
|
283
|
+
print(f"Collecting ABIDE native QC from {raw_qc_path}...")
|
|
284
|
+
abide_qc = collect_abide_native_qc(raw_qc_path)
|
|
285
|
+
print(f" Found {len(abide_qc)} subjects")
|
|
286
|
+
|
|
287
|
+
if not fmriprep_qc and not freesurfer_qc and not abide_qc:
|
|
288
|
+
print("[ERROR] No QC data collected. Check input paths.", file=sys.stderr)
|
|
289
|
+
return 1
|
|
290
|
+
|
|
291
|
+
summary_df, excluded = generate_qc_summary(
|
|
292
|
+
fmriprep_qc=fmriprep_qc,
|
|
293
|
+
freesurfer_qc=freesurfer_qc,
|
|
294
|
+
abide_qc=abide_qc,
|
|
295
|
+
fd_threshold=args.fd_threshold,
|
|
296
|
+
max_fd_threshold=args.max_fd_threshold,
|
|
297
|
+
coverage_threshold=args.coverage_threshold,
|
|
298
|
+
)
|
|
299
|
+
|
|
300
|
+
output_path = Path(args.output).resolve()
|
|
301
|
+
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
302
|
+
summary_df.to_csv(output_path, index=False)
|
|
303
|
+
print(f"\nQC Summary: {len(summary_df)} subjects -> {output_path}")
|
|
304
|
+
print(f" Excluded: {len(excluded)} / {len(summary_df)} ({100*len(excluded)/max(len(summary_df),1):.1f}%)")
|
|
305
|
+
|
|
306
|
+
if args.exclude_output:
|
|
307
|
+
exclude_path = Path(args.exclude_output).resolve()
|
|
308
|
+
exclude_path.parent.mkdir(parents=True, exist_ok=True)
|
|
309
|
+
exclude_df = summary_df[summary_df["exclude"] == True][["subject_id", "exclude_reasons"]]
|
|
310
|
+
exclude_df.to_csv(exclude_path, index=False)
|
|
311
|
+
print(f" Exclusion list: {exclude_path}")
|
|
312
|
+
|
|
313
|
+
return 0
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
if __name__ == "__main__":
|
|
317
|
+
sys.exit(main())
|