@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,232 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Extract and preprocess UK Biobank phenotype data for brain-related analysis.
|
|
3
|
+
|
|
4
|
+
Adapted from UKBAnalytica_v2 variable_preprocess.R (Nan He, Southern Medical University).
|
|
5
|
+
Provides field ID mapping, automatic preprocessing, and covariate table generation.
|
|
6
|
+
|
|
7
|
+
Usage:
|
|
8
|
+
python extract_ukb_phenotype.py --input ukb_raw.csv --output phenotype.csv
|
|
9
|
+
python extract_ukb_phenotype.py --input ukb_raw.csv --variables sex,age,bmi,smoking --output covariates.csv
|
|
10
|
+
python extract_ukb_phenotype.py --input ukb_raw.csv --custom-mapping mapping.json --output custom.csv
|
|
11
|
+
"""
|
|
12
|
+
import argparse
|
|
13
|
+
import csv
|
|
14
|
+
import json
|
|
15
|
+
import sys
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
from typing import Dict, List, Optional
|
|
18
|
+
|
|
19
|
+
import pandas as pd
|
|
20
|
+
|
|
21
|
+
# UKB field ID -> column name mapping (adapted from UKBAnalytica_v2)
|
|
22
|
+
VARIABLE_MAPPING = {
|
|
23
|
+
# Demographics
|
|
24
|
+
"sex": {"field_id": 31, "ukb_col": "p31", "description": "Sex (0=Female, 1=Male)"},
|
|
25
|
+
"age": {"field_id": 21022, "ukb_col": "p21022", "description": "Age at recruitment"},
|
|
26
|
+
"ethnicity": {"field_id": 21000, "ukb_col": "p21000_i0", "description": "Ethnic background"},
|
|
27
|
+
"birth_year": {"field_id": 34, "ukb_col": "p34", "description": "Year of birth"},
|
|
28
|
+
"assessment_centre": {"field_id": 54, "ukb_col": "p54_i0", "description": "UK Biobank assessment centre"},
|
|
29
|
+
"baseline_date": {"field_id": 53, "ukb_col": "p53_i0", "description": "Date of baseline assessment"},
|
|
30
|
+
|
|
31
|
+
# Anthropometrics
|
|
32
|
+
"bmi": {"field_id": 21001, "ukb_col": "p21001_i0", "description": "BMI (kg/m^2)"},
|
|
33
|
+
"height": {"field_id": 50, "ukb_col": "p50_i0", "description": "Standing height (cm)"},
|
|
34
|
+
"weight": {"field_id": 21002, "ukb_col": "p21002_i0", "description": "Weight (kg)"},
|
|
35
|
+
"waist": {"field_id": 48, "ukb_col": "p48_i0", "description": "Waist circumference (cm)"},
|
|
36
|
+
|
|
37
|
+
# Lifestyle
|
|
38
|
+
"smoking": {"field_id": 20116, "ukb_col": "p20116_i0", "description": "Smoking status (0=Never, 1=Previous, 2=Current)"},
|
|
39
|
+
"drinking": {"field_id": 20117, "ukb_col": "p20117_i0", "description": "Alcohol drinker status"},
|
|
40
|
+
"sleep_duration": {"field_id": 1160, "ukb_col": "p1160_i0", "description": "Sleep duration (hours/day)"},
|
|
41
|
+
"physical_activity": {"field_id": 22032, "ukb_col": "p22032_i0", "description": "Physical activity level"},
|
|
42
|
+
|
|
43
|
+
# Socioeconomic
|
|
44
|
+
"education": {"field_id": 6138, "ukb_col": "p6138_i0", "description": "Qualifications"},
|
|
45
|
+
"income": {"field_id": 738, "ukb_col": "p738_i0", "description": "Average total household income"},
|
|
46
|
+
"townsend": {"field_id": 189, "ukb_col": "p189", "description": "Townsend deprivation index"},
|
|
47
|
+
|
|
48
|
+
# Blood Pressure
|
|
49
|
+
"sbp_auto": {"field_id": 4080, "ukb_col": "p4080_i0_a0", "description": "SBP automated reading"},
|
|
50
|
+
"dbp_auto": {"field_id": 4079, "ukb_col": "p4079_i0_a0", "description": "DBP automated reading"},
|
|
51
|
+
|
|
52
|
+
# Biomarkers
|
|
53
|
+
"triglycerides": {"field_id": 30870, "ukb_col": "p30870_i0", "description": "Triglycerides (mmol/L)"},
|
|
54
|
+
"ldl": {"field_id": 30780, "ukb_col": "p30780_i0", "description": "LDL cholesterol (mmol/L)"},
|
|
55
|
+
"hdl": {"field_id": 30760, "ukb_col": "p30760_i0", "description": "HDL cholesterol (mmol/L)"},
|
|
56
|
+
"hba1c": {"field_id": 30750, "ukb_col": "p30750_i0", "description": "HbA1c (mmol/mol)"},
|
|
57
|
+
"glucose": {"field_id": 30740, "ukb_col": "p30740_i0", "description": "Glucose (mmol/L)"},
|
|
58
|
+
"crp": {"field_id": 30710, "ukb_col": "p30710_i0", "description": "C-reactive protein"},
|
|
59
|
+
|
|
60
|
+
# Brain imaging (IDPs)
|
|
61
|
+
"brain_volume": {"field_id": 25000, "ukb_col": "p25000_i0", "description": "Total brain volume (GM+WM)"},
|
|
62
|
+
"gm_volume": {"field_id": 25001, "ukb_col": "p25001_i0", "description": "Grey matter volume"},
|
|
63
|
+
"wm_volume": {"field_id": 25002, "ukb_col": "p25002_i0", "description": "White matter volume"},
|
|
64
|
+
"hippocampus_volume": {"field_id": 25003, "ukb_col": "p25003_i0", "description": "Hippocampal volume"},
|
|
65
|
+
"wmh_volume": {"field_id": 25004, "ukb_col": "p25004_i0", "description": "White matter hyperintensity volume"},
|
|
66
|
+
"ventricular_volume": {"field_id": 25005, "ukb_col": "p25005_i0", "description": "Ventricular volume"},
|
|
67
|
+
|
|
68
|
+
# Cognition
|
|
69
|
+
"fluid_intelligence": {"field_id": 20016, "ukb_col": "p20016_i0", "description": "Fluid intelligence score"},
|
|
70
|
+
"reaction_time": {"field_id": 20023, "ukb_col": "p20023_i0", "description": "Mean reaction time"},
|
|
71
|
+
"memory_pairs": {"field_id": 399, "ukb_col": "p399_i0", "description": "Numeric memory (max digits)"},
|
|
72
|
+
"trail_making_a": {"field_id": 20156, "ukb_col": "p20156_i0", "description": "Trail making test A"},
|
|
73
|
+
"trail_making_b": {"field_id": 20157, "ukb_col": "p20157_i0", "description": "Trail making test B"},
|
|
74
|
+
|
|
75
|
+
# APOE genotype
|
|
76
|
+
"apoe": {"field_id": 22616, "ukb_col": "p22616", "description": "APOE genotype"},
|
|
77
|
+
|
|
78
|
+
# Death
|
|
79
|
+
"death_date": {"field_id": 40000, "ukb_col": "p40000_i0", "description": "Date of death"},
|
|
80
|
+
"death_cause": {"field_id": 40001, "ukb_col": "p40001_i0", "description": "Primary cause of death (ICD-10)"},
|
|
81
|
+
|
|
82
|
+
# Hospital inpatient
|
|
83
|
+
"icd10_primary": {"field_id": 41202, "ukb_col": "p41202", "description": "ICD-10 primary diagnoses"},
|
|
84
|
+
"icd10_date": {"field_id": 41280, "ukb_col": "p41280", "description": "ICD-10 diagnosis dates"},
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
# UKB invalid codes (treated as missing)
|
|
88
|
+
INVALID_CODES = [-1, -3, -9]
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def preprocess_variable(series: pd.Series, var_name: str, invalid_codes: List[int]) -> pd.Series:
|
|
92
|
+
"""Apply variable-specific preprocessing."""
|
|
93
|
+
s = series.copy()
|
|
94
|
+
|
|
95
|
+
# Replace invalid codes with NaN
|
|
96
|
+
if s.dtype in ("int64", "float64"):
|
|
97
|
+
for code in invalid_codes:
|
|
98
|
+
s = s.replace(code, pd.NA)
|
|
99
|
+
|
|
100
|
+
# Variable-specific transformations
|
|
101
|
+
if var_name == "ethnicity":
|
|
102
|
+
# Recode: White=0, non-White=1
|
|
103
|
+
s = s.apply(lambda x: 0 if x == 1 else (1 if pd.notna(x) and x > 0 else pd.NA))
|
|
104
|
+
|
|
105
|
+
elif var_name == "education":
|
|
106
|
+
# Recode: College/University degree -> High; A levels/GCSEs -> Medium; None -> Low
|
|
107
|
+
def edu_recode(x):
|
|
108
|
+
if pd.isna(x):
|
|
109
|
+
return pd.NA
|
|
110
|
+
x = int(x)
|
|
111
|
+
if x in [1, 2, 3, 4]: # College/University
|
|
112
|
+
return 3
|
|
113
|
+
elif x in [5, 6]: # A levels, O levels/GCSEs
|
|
114
|
+
return 2
|
|
115
|
+
elif x in [7]: # CSEs
|
|
116
|
+
return 1
|
|
117
|
+
else:
|
|
118
|
+
return 1
|
|
119
|
+
s = s.apply(edu_recode)
|
|
120
|
+
|
|
121
|
+
elif var_name == "smoking":
|
|
122
|
+
# 0=Never, 1=Previous, 2=Current
|
|
123
|
+
s = s.apply(lambda x: x if x in [0, 1, 2] else pd.NA)
|
|
124
|
+
|
|
125
|
+
return s
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def load_custom_mapping(path: Path) -> Dict:
|
|
129
|
+
"""Load custom variable mapping from JSON file."""
|
|
130
|
+
with open(path, "r", encoding="utf-8") as f:
|
|
131
|
+
return json.load(f)
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def extract_phenotype(
|
|
135
|
+
input_path: Path,
|
|
136
|
+
variables: Optional[List[str]] = None,
|
|
137
|
+
custom_mapping: Optional[Dict] = None,
|
|
138
|
+
drop_missing: bool = False,
|
|
139
|
+
) -> pd.DataFrame:
|
|
140
|
+
"""Extract and preprocess UKB phenotype data."""
|
|
141
|
+
df = pd.read_csv(input_path, low_memory=False)
|
|
142
|
+
print(f"Loaded {len(df)} rows, {len(df.columns)} columns")
|
|
143
|
+
|
|
144
|
+
# Merge mappings
|
|
145
|
+
mapping = dict(VARIABLE_MAPPING)
|
|
146
|
+
if custom_mapping:
|
|
147
|
+
mapping.update(custom_mapping)
|
|
148
|
+
|
|
149
|
+
# Default variables: demographics + key covariates
|
|
150
|
+
if variables is None:
|
|
151
|
+
variables = ["sex", "age", "ethnicity", "bmi", "smoking", "education", "townsend"]
|
|
152
|
+
|
|
153
|
+
# Validate
|
|
154
|
+
invalid = [v for v in variables if v not in mapping]
|
|
155
|
+
if invalid:
|
|
156
|
+
print(f"[WARN] Unknown variables: {invalid}")
|
|
157
|
+
variables = [v for v in variables if v in mapping]
|
|
158
|
+
|
|
159
|
+
# Process each variable
|
|
160
|
+
result = pd.DataFrame()
|
|
161
|
+
result["eid"] = df["eid"]
|
|
162
|
+
|
|
163
|
+
processed = []
|
|
164
|
+
for var in variables:
|
|
165
|
+
var_info = mapping[var]
|
|
166
|
+
ukb_col = var_info["ukb_col"]
|
|
167
|
+
|
|
168
|
+
# Try exact column match, then prefix match
|
|
169
|
+
if ukb_col in df.columns:
|
|
170
|
+
col = ukb_col
|
|
171
|
+
else:
|
|
172
|
+
candidates = [c for c in df.columns if c.startswith(ukb_col)]
|
|
173
|
+
col = candidates[0] if candidates else None
|
|
174
|
+
|
|
175
|
+
if col is None:
|
|
176
|
+
print(f"[WARN] Column '{ukb_col}' not found for variable '{var}', skipping")
|
|
177
|
+
continue
|
|
178
|
+
|
|
179
|
+
result[var] = preprocess_variable(df[col], var, INVALID_CODES)
|
|
180
|
+
processed.append(var)
|
|
181
|
+
|
|
182
|
+
print(f"Processed {len(processed)} variables: {processed}")
|
|
183
|
+
|
|
184
|
+
if drop_missing:
|
|
185
|
+
before = len(result)
|
|
186
|
+
result = result.dropna(subset=processed)
|
|
187
|
+
print(f"Dropped {before - len(result)} rows with missing values")
|
|
188
|
+
|
|
189
|
+
return result
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
def main() -> int:
|
|
193
|
+
parser = argparse.ArgumentParser(description="Extract UKB phenotype data.")
|
|
194
|
+
parser.add_argument("--input", required=True, help="Path to UKB raw CSV")
|
|
195
|
+
parser.add_argument("--output", required=True, help="Output path for phenotype CSV")
|
|
196
|
+
parser.add_argument("--variables", help="Comma-separated variable names (default: core covariates)")
|
|
197
|
+
parser.add_argument("--custom-mapping", help="JSON file with custom variable mappings")
|
|
198
|
+
parser.add_argument("--drop-missing", action="store_true", help="Drop rows with missing values")
|
|
199
|
+
parser.add_argument("--list-variables", action="store_true", help="List available variables and exit")
|
|
200
|
+
args = parser.parse_args()
|
|
201
|
+
|
|
202
|
+
if args.list_variables:
|
|
203
|
+
print("Available variables:")
|
|
204
|
+
for name, info in VARIABLE_MAPPING.items():
|
|
205
|
+
print(f" {name}: {info['description']} (field {info['field_id']}, col {info['ukb_col']})")
|
|
206
|
+
return 0
|
|
207
|
+
|
|
208
|
+
input_path = Path(args.input).resolve()
|
|
209
|
+
if not input_path.exists():
|
|
210
|
+
print(f"Input file not found: {input_path}", file=sys.stderr)
|
|
211
|
+
return 1
|
|
212
|
+
|
|
213
|
+
variables = None
|
|
214
|
+
if args.variables:
|
|
215
|
+
variables = [v.strip() for v in args.variables.split(",")]
|
|
216
|
+
|
|
217
|
+
custom_mapping = None
|
|
218
|
+
if args.custom_mapping:
|
|
219
|
+
custom_mapping = load_custom_mapping(Path(args.custom_mapping).resolve())
|
|
220
|
+
|
|
221
|
+
result = extract_phenotype(input_path, variables, custom_mapping, args.drop_missing)
|
|
222
|
+
|
|
223
|
+
output_path = Path(args.output).resolve()
|
|
224
|
+
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
225
|
+
result.to_csv(output_path, index=False)
|
|
226
|
+
print(f"Saved {len(result)} rows, {len(result.columns)} columns -> {output_path}")
|
|
227
|
+
|
|
228
|
+
return 0
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
if __name__ == "__main__":
|
|
232
|
+
sys.exit(main())
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Generate QC summaries for UK Biobank brain-related data.
|
|
3
|
+
|
|
4
|
+
Tracks data completeness, imaging availability, and exclusion criteria.
|
|
5
|
+
|
|
6
|
+
Usage:
|
|
7
|
+
python ukb_qc_summary.py --input ukb_raw.csv --output qc_summary.csv
|
|
8
|
+
python ukb_qc_summary.py --input ukb_raw.csv --imaging-check --output qc_imaging.csv
|
|
9
|
+
"""
|
|
10
|
+
import argparse
|
|
11
|
+
import sys
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from typing import Dict, List
|
|
14
|
+
|
|
15
|
+
import pandas as pd
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def check_completeness(df: pd.DataFrame, required_cols: List[str]) -> Dict:
|
|
19
|
+
"""Check data completeness for required columns."""
|
|
20
|
+
stats = {}
|
|
21
|
+
for col in required_cols:
|
|
22
|
+
if col in df.columns:
|
|
23
|
+
n_missing = df[col].isna().sum()
|
|
24
|
+
stats[col] = {
|
|
25
|
+
"n_present": len(df) - n_missing,
|
|
26
|
+
"n_missing": n_missing,
|
|
27
|
+
"pct_complete": (len(df) - n_missing) / len(df) * 100,
|
|
28
|
+
}
|
|
29
|
+
else:
|
|
30
|
+
stats[col] = {"n_present": 0, "n_missing": len(df), "pct_complete": 0}
|
|
31
|
+
return stats
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def check_imaging_availability(df: pd.DataFrame) -> Dict:
|
|
35
|
+
"""Check brain imaging data availability."""
|
|
36
|
+
imaging_checks = {
|
|
37
|
+
"T1w": ["p25000_i0", "p25001_i0", "p25002_i0"], # Brain volume IDPs
|
|
38
|
+
"T2_FLAIR": ["p25004_i0"], # WMH volume
|
|
39
|
+
"dMRI": ["p25008_i0", "p25009_i0"], # DTI IDPs
|
|
40
|
+
"rsfMRI": ["p25010_i0", "p25011_i0"], # fMRI IDPs
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
results = {}
|
|
44
|
+
for modality, cols in imaging_checks.items():
|
|
45
|
+
available = [c for c in cols if c in df.columns]
|
|
46
|
+
if available:
|
|
47
|
+
# Has data if at least one imaging column is non-null
|
|
48
|
+
has_data = df[available].notna().any(axis=1).sum()
|
|
49
|
+
results[modality] = {"n_available": has_data, "pct": has_data / len(df) * 100}
|
|
50
|
+
else:
|
|
51
|
+
results[modality] = {"n_available": 0, "pct": 0}
|
|
52
|
+
|
|
53
|
+
return results
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def generate_qc(
|
|
57
|
+
df: pd.DataFrame,
|
|
58
|
+
required_cols: List[str] = None,
|
|
59
|
+
imaging_check: bool = False,
|
|
60
|
+
age_range: tuple = None,
|
|
61
|
+
) -> pd.DataFrame:
|
|
62
|
+
"""Generate per-subject QC summary."""
|
|
63
|
+
if required_cols is None:
|
|
64
|
+
required_cols = ["p31", "p21022", "p21001_i0"] # sex, age, bmi
|
|
65
|
+
|
|
66
|
+
result = pd.DataFrame({"eid": df["eid"]})
|
|
67
|
+
|
|
68
|
+
# Age filtering
|
|
69
|
+
if age_range and "p21022" in df.columns:
|
|
70
|
+
age = df["p21022"]
|
|
71
|
+
result["in_age_range"] = ((age >= age_range[0]) & (age <= age_range[1])).astype(int)
|
|
72
|
+
else:
|
|
73
|
+
result["in_age_range"] = 1
|
|
74
|
+
|
|
75
|
+
# Missing data count
|
|
76
|
+
available_required = [c for c in required_cols if c in df.columns]
|
|
77
|
+
if available_required:
|
|
78
|
+
result["n_missing_covariates"] = df[available_required].isna().sum(axis=1)
|
|
79
|
+
result["complete_covariates"] = (result["n_missing_covariates"] == 0).astype(int)
|
|
80
|
+
else:
|
|
81
|
+
result["n_missing_covariates"] = 0
|
|
82
|
+
result["complete_covariates"] = 1
|
|
83
|
+
|
|
84
|
+
# Imaging availability
|
|
85
|
+
if imaging_check:
|
|
86
|
+
imaging_cols = {
|
|
87
|
+
"has_brain_volume": ["p25000_i0"],
|
|
88
|
+
"has_gm_volume": ["p25001_i0"],
|
|
89
|
+
"has_wm_volume": ["p25002_i0"],
|
|
90
|
+
"has_hippocampus": ["p25003_i0"],
|
|
91
|
+
"has_wmh": ["p25004_i0"],
|
|
92
|
+
}
|
|
93
|
+
for name, cols in imaging_cols.items():
|
|
94
|
+
available = [c for c in cols if c in df.columns]
|
|
95
|
+
if available:
|
|
96
|
+
result[name] = df[available].notna().any(axis=1).astype(int)
|
|
97
|
+
else:
|
|
98
|
+
result[name] = 0
|
|
99
|
+
|
|
100
|
+
# Overall QC pass
|
|
101
|
+
qc_pass = (result["complete_covariates"] == 1) & (result["in_age_range"] == 1)
|
|
102
|
+
result["qc_pass"] = qc_pass.astype(int)
|
|
103
|
+
|
|
104
|
+
return result
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def main() -> int:
|
|
108
|
+
parser = argparse.ArgumentParser(description="Generate UKB QC summary.")
|
|
109
|
+
parser.add_argument("--input", required=True, help="Path to UKB raw CSV")
|
|
110
|
+
parser.add_argument("--output", required=True, help="Output path for QC summary CSV")
|
|
111
|
+
parser.add_argument("--imaging-check", action="store_true", help="Include imaging availability check")
|
|
112
|
+
parser.add_argument("--age-min", type=float, default=None, help="Minimum age filter")
|
|
113
|
+
parser.add_argument("--age-max", type=float, default=None, help="Maximum age filter")
|
|
114
|
+
parser.add_argument("--required-cols", help="Comma-separated required column names")
|
|
115
|
+
args = parser.parse_args()
|
|
116
|
+
|
|
117
|
+
input_path = Path(args.input).resolve()
|
|
118
|
+
if not input_path.exists():
|
|
119
|
+
print(f"Input file not found: {input_path}", file=sys.stderr)
|
|
120
|
+
return 1
|
|
121
|
+
|
|
122
|
+
df = pd.read_csv(input_path, low_memory=False)
|
|
123
|
+
print(f"Loaded {len(df)} subjects")
|
|
124
|
+
|
|
125
|
+
required_cols = None
|
|
126
|
+
if args.required_cols:
|
|
127
|
+
required_cols = [c.strip() for c in args.required_cols.split(",")]
|
|
128
|
+
|
|
129
|
+
age_range = None
|
|
130
|
+
if args.age_min is not None and args.age_max is not None:
|
|
131
|
+
age_range = (args.age_min, args.age_max)
|
|
132
|
+
|
|
133
|
+
result = generate_qc(df, required_cols, args.imaging_check, age_range)
|
|
134
|
+
|
|
135
|
+
# Summary
|
|
136
|
+
n_total = len(result)
|
|
137
|
+
n_pass = result["qc_pass"].sum()
|
|
138
|
+
print(f"\nQC Summary:")
|
|
139
|
+
print(f" Total subjects: {n_total}")
|
|
140
|
+
print(f" QC pass: {n_pass} ({n_pass/n_total*100:.1f}%)")
|
|
141
|
+
print(f" QC fail: {n_total - n_pass} ({(n_total-n_pass)/n_total*100:.1f}%)")
|
|
142
|
+
|
|
143
|
+
if args.imaging_check:
|
|
144
|
+
for col in ["has_brain_volume", "has_gm_volume", "has_wm_volume", "has_hippocampus", "has_wmh"]:
|
|
145
|
+
if col in result.columns:
|
|
146
|
+
n = result[col].sum()
|
|
147
|
+
print(f" {col}: {n} ({n/n_total*100:.1f}%)")
|
|
148
|
+
|
|
149
|
+
output_path = Path(args.output).resolve()
|
|
150
|
+
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
151
|
+
result.to_csv(output_path, index=False)
|
|
152
|
+
print(f"Saved -> {output_path}")
|
|
153
|
+
|
|
154
|
+
return 0
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
if __name__ == "__main__":
|
|
158
|
+
sys.exit(main())
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: wmh-segmentation
|
|
3
|
+
description: "Use this skill whenever the user wants to perform automated white matter hyperintensity (WMH) segmentation on structural MRI data using the MARS-WMH nnU-Net model. Requires one FLAIR and one T1w NIfTI image (no contrast). Triggers include: 'wmh', 'white matter hyperintensities', 'WMH segmentation', 'MARS-WMH', 'wmh-nnunet', 'segment FLAIR T1', 'white matter lesions', 'vascular WMH', 'mars wmh', or any request to run nnU-Net WMH segmentation on FLAIR+T1w pair."
|
|
4
|
+
license: MIT License (NeuroClaw custom skill – freely modifiable within the project)
|
|
5
|
+
layer: base
|
|
6
|
+
skill_type: tool
|
|
7
|
+
dependencies:
|
|
8
|
+
- claw-shell
|
|
9
|
+
---
|
|
10
|
+
# WMH Segmentation (MARS-WMH nnU-Net)
|
|
11
|
+
|
|
12
|
+
## Overview
|
|
13
|
+
MARS-WMH is the state-of-the-art, clinically-validated deep-learning tool (nnU-Net architecture) for segmenting brain white matter hyperintensities of presumed vascular origin. It takes a FLAIR image (recommended 1 mm isotropic) and a co-registered or registrable T1w image (1 mm isotropic, no contrast) and outputs a precise WMH segmentation mask in NIfTI format (returned in the original input resolution).
|
|
14
|
+
|
|
15
|
+
This skill serves as the **NeuroClaw interface-layer wrapper** for the official MARS-WMH Docker container (`ghcr.io/miac-research/wmh-nnunet:latest`) and strictly follows the hierarchical design:
|
|
16
|
+
|
|
17
|
+
1. Check whether Docker (with NVIDIA Container Toolkit) is installed (`docker --version` + `nvidia-smi` via `claw-shell`).
|
|
18
|
+
2. If `nvidia-smi` fails → immediately print the exact NVIDIA Container Toolkit installation commands and instruct the user to run them manually before retry.
|
|
19
|
+
3. If paths not provided → interactively ask the user for FLAIR and T1w full paths and confirm they exist on disk.
|
|
20
|
+
4. If paths provided → verify file existence and readability.
|
|
21
|
+
5. Prepare clean working directory, copy inputs, generate exact Docker pull/tag + run commands.
|
|
22
|
+
6. Generate a numbered execution plan.
|
|
23
|
+
7. Present the plan, estimated runtime (~5–15 min on GPU), requirements and risks → wait for explicit user confirmation (“YES” / “execute” / “proceed”).
|
|
24
|
+
8. On confirmation → delegate **all** shell execution to `claw-shell`.
|
|
25
|
+
9. Report completion, exact output mask location, and next steps.
|
|
26
|
+
|
|
27
|
+
**Key design principle (2026 update)**: All Docker execution is routed through `claw-shell`.
|
|
28
|
+
|
|
29
|
+
## Quick Reference (Common Use Cases)
|
|
30
|
+
|
|
31
|
+
| Task | Recommended approach |
|
|
32
|
+
|-----------------------------------|-----------------------------------------------------------|
|
|
33
|
+
| Standard WMH segmentation | Default Docker run (nnU-Net, GPU) |
|
|
34
|
+
| Already co-registered images | Add `--skipRegistration` flag |
|
|
35
|
+
| CPU-only fallback | Remove `--gpus all` (slow) |
|
|
36
|
+
|
|
37
|
+
## Installation Check & Setup
|
|
38
|
+
Installation of Docker is delegated to `dependency-planner`.
|
|
39
|
+
|
|
40
|
+
GPU check performed before every run:
|
|
41
|
+
|
|
42
|
+
- If `nvidia-smi` fails, prompt user to run:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | \
|
|
46
|
+
sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
|
|
47
|
+
curl -fsSL https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
|
|
48
|
+
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#' | \
|
|
49
|
+
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list > /dev/null
|
|
50
|
+
sudo apt-get update
|
|
51
|
+
sudo apt-get install -y nvidia-container-toolkit
|
|
52
|
+
sudo nvidia-ctk runtime configure --runtime=docker
|
|
53
|
+
sudo systemctl restart docker
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
**Prerequisites**:
|
|
57
|
+
- `dependency-planner`
|
|
58
|
+
- `claw-shell`
|
|
59
|
+
- NVIDIA GPU + drivers
|
|
60
|
+
- ≥8 GB VRAM
|
|
61
|
+
|
|
62
|
+
## NeuroClaw recommended wrapper script
|
|
63
|
+
```bash
|
|
64
|
+
# WMH Segmentation Shell Commands (execute via claw-shell)
|
|
65
|
+
|
|
66
|
+
# 0. GPU check
|
|
67
|
+
nvidia-smi >/dev/null 2>&1 || {
|
|
68
|
+
echo "GPU not detected. Run the following commands to install NVIDIA Container Toolkit:"
|
|
69
|
+
cat << 'EOF'
|
|
70
|
+
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | \
|
|
71
|
+
sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
|
|
72
|
+
curl -fsSL https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
|
|
73
|
+
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#' | \
|
|
74
|
+
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list > /dev/null
|
|
75
|
+
sudo apt-get update
|
|
76
|
+
sudo apt-get install -y nvidia-container-toolkit
|
|
77
|
+
sudo nvidia-ctk runtime configure --runtime=docker
|
|
78
|
+
sudo systemctl restart docker
|
|
79
|
+
EOF
|
|
80
|
+
exit 1
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
# 1. Pull & tag
|
|
84
|
+
docker pull ghcr.io/miac-research/wmh-nnunet:latest
|
|
85
|
+
docker tag ghcr.io/miac-research/wmh-nnunet:latest mars-wmh-nnunet:latest
|
|
86
|
+
|
|
87
|
+
# 2. Prepare workspace (replace paths with user-provided FLAIR/T1w)
|
|
88
|
+
FLAIR="/path/to/FLAIR.nii.gz"
|
|
89
|
+
T1="/path/to/T1w.nii.gz"
|
|
90
|
+
OUTPUT_DIR="wmh_output"
|
|
91
|
+
mkdir -p "$OUTPUT_DIR"
|
|
92
|
+
cp "$FLAIR" "$OUTPUT_DIR/FLAIR.nii.gz"
|
|
93
|
+
cp "$T1" "$OUTPUT_DIR/T1w.nii.gz"
|
|
94
|
+
|
|
95
|
+
# 3. Fix Docker data directory permission issues (common on Ubuntu)
|
|
96
|
+
chmod -R 777 "$OUTPUT_DIR"
|
|
97
|
+
|
|
98
|
+
# 4. Run inference
|
|
99
|
+
docker run --rm --gpus all \
|
|
100
|
+
-v "$(pwd)/$OUTPUT_DIR:/data" \
|
|
101
|
+
mars-wmh-nnunet:latest \
|
|
102
|
+
--flair /data/FLAIR.nii.gz \
|
|
103
|
+
--t1 /data/T1w.nii.gz
|
|
104
|
+
|
|
105
|
+
# 5. Show output mask
|
|
106
|
+
ls -lh "$OUTPUT_DIR"/*.nii*
|
|
107
|
+
echo "WMH segmentation mask saved in $OUTPUT_DIR"
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Important Notes & Limitations
|
|
111
|
+
- Docker data directory permission issues are automatically fixed with `chmod -R 777` on the output directory.
|
|
112
|
+
- If `docker run` fails with permission denied → run `newgrp docker` first, then retry.
|
|
113
|
+
- First run pulls image (~several GB); subsequent runs are fast.
|
|
114
|
+
- Input must be NIfTI; use `dcm2nii` if starting from DICOM.
|
|
115
|
+
- Output mask appears in `$OUTPUT_DIR` (exact filename shown by final `ls`).
|
|
116
|
+
|
|
117
|
+
## When to Call This Skill
|
|
118
|
+
- User provides FLAIR + T1w and wants WMH segmentation.
|
|
119
|
+
- Any mention of MARS-WMH, nnU-Net WMH, white matter lesions segmentation.
|
|
120
|
+
|
|
121
|
+
## Complementary / Related Skills
|
|
122
|
+
- `dcm2nii` → convert DICOM to NIfTI input
|
|
123
|
+
- `dependency-planner` → install Docker and NVIDIA Container Toolkit
|
|
124
|
+
- `claw-shell` → safe Docker execution
|
|
125
|
+
|
|
126
|
+
## Reference
|
|
127
|
+
Official repo: https://github.com/miac-research/MARS-WMH
|
|
128
|
+
Docker image: `ghcr.io/miac-research/wmh-nnunet:latest`
|
|
129
|
+
Custom NeuroClaw skill.
|
|
130
|
+
|
|
131
|
+
Created At: 2026-03-23
|
|
132
|
+
Last Updated At: 2026-03-26 00:29 HKT
|
|
133
|
+
Author: chengwang96
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: detrending
|
|
3
|
+
description: "Use this model doc whenever the user wants to perform neuroimaging signal denoising with classical detrending methods. This is a non-deep-learning preprocessing route focused on removing low-frequency drift and linear trends from time series before downstream analysis."
|
|
4
|
+
license: MIT License (NeuroClaw custom skill - freely modifiable within the project)
|
|
5
|
+
layer: base
|
|
6
|
+
skill_type: model
|
|
7
|
+
dependencies:
|
|
8
|
+
- fmri-skill
|
|
9
|
+
- nilearn-tool
|
|
10
|
+
- run_models
|
|
11
|
+
---
|
|
12
|
+
# Detrending Model Doc
|
|
13
|
+
|
|
14
|
+
## Overview
|
|
15
|
+
Detrending is a classical non-deep-learning method for neuroimaging signal denoising.
|
|
16
|
+
|
|
17
|
+
- Model family: non-deep-learning preprocessing and denoising method
|
|
18
|
+
- Typical objectives:
|
|
19
|
+
- remove low-frequency drift and temporal trends
|
|
20
|
+
- stabilize time series before connectivity, decoding, or statistical analysis
|
|
21
|
+
- prepare cleaner voxel-wise or ROI-wise time series for downstream workflows
|
|
22
|
+
- Primary input: preprocessed fMRI time series, optional confounds, optional mask, TR
|
|
23
|
+
- Primary output: cleaned BOLD image, cleaned ROI time series, optional QC summaries
|
|
24
|
+
|
|
25
|
+
In NeuroClaw, this document is model-level guidance for detrending workflows rather than predictive modeling.
|
|
26
|
+
|
|
27
|
+
Upstream preparation should usually be delegated to:
|
|
28
|
+
- `fmri-skill` for modality-level denoising planning and validated preprocessing sequences
|
|
29
|
+
- `nilearn-tool` for concrete detrending and cleaned time series export
|
|
30
|
+
|
|
31
|
+
**Research use only.**
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Quick Start
|
|
36
|
+
|
|
37
|
+
### 1) Prepare denoising inputs
|
|
38
|
+
Expected inputs:
|
|
39
|
+
- preprocessed BOLD image
|
|
40
|
+
- repetition time (`TR`)
|
|
41
|
+
- optional confounds TSV
|
|
42
|
+
- optional brain mask
|
|
43
|
+
|
|
44
|
+
If images are not preprocessed yet, delegate to `fmri-skill` first.
|
|
45
|
+
|
|
46
|
+
### 2) Detrending route
|
|
47
|
+
Representative operations:
|
|
48
|
+
- load preprocessed image or extracted ROI time series
|
|
49
|
+
- remove constant and linear temporal trends
|
|
50
|
+
- optionally combine detrending with confound regression or standardization
|
|
51
|
+
- export cleaned image or time series table
|
|
52
|
+
|
|
53
|
+
Example execution route:
|
|
54
|
+
```bash
|
|
55
|
+
# delegated through claw-shell after preprocessing is confirmed
|
|
56
|
+
python skills/nilearn-tool/scripts/denoise_timeseries_reference.py \
|
|
57
|
+
--bold path/to/sub-001_rest_preproc_bold.nii.gz \
|
|
58
|
+
--confounds path/to/sub-001_confounds.tsv \
|
|
59
|
+
--tr 2.0 \
|
|
60
|
+
--detrend \
|
|
61
|
+
--output-dir run_models_output/detrending
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Input / Output Contract
|
|
67
|
+
|
|
68
|
+
### Required inputs
|
|
69
|
+
- preprocessed BOLD image or extracted time series
|
|
70
|
+
- TR when combined with temporal cleaning workflow metadata
|
|
71
|
+
|
|
72
|
+
### Optional inputs
|
|
73
|
+
- confounds table
|
|
74
|
+
- mask image
|
|
75
|
+
- standardization options
|
|
76
|
+
|
|
77
|
+
### Produced outputs
|
|
78
|
+
- cleaned BOLD image or cleaned time series
|
|
79
|
+
- optional QC summary of detrending settings
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Recommended Delegation
|
|
84
|
+
|
|
85
|
+
- modality-level denoising plan -> `fmri-skill`
|
|
86
|
+
- concrete implementation of detrending -> `nilearn-tool`
|
|
87
|
+
- shell execution and logging -> `claw-shell`
|
|
88
|
+
|
|
89
|
+
No execution before explicit plan confirmation.
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## When to Use Detrending
|
|
94
|
+
|
|
95
|
+
- The user wants signal cleaning rather than statistical modeling or prediction.
|
|
96
|
+
- The goal is to remove drift before connectivity or decoding.
|
|
97
|
+
- The workflow needs standardized temporal preprocessing before ROI extraction.
|
|
98
|
+
- A classical transparent denoising baseline is preferred over learned denoising methods.
|
|
99
|
+
- The user explicitly asks for detrending or drift removal.
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## Limitations and Notes
|
|
104
|
+
|
|
105
|
+
- Detrending alone does not remove motion or physiological confounds unless combined with regression.
|
|
106
|
+
- Detrending choices should be reported because they directly affect downstream analyses.
|
|
107
|
+
- Aggressive cleaning sequences can alter downstream effect estimates if applied without task awareness.
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Reference
|
|
112
|
+
|
|
113
|
+
- Ciric R et al. Benchmarking of participant-level confound regression strategies for the control of motion artifact in studies of functional connectivity.
|
|
114
|
+
- Nilearn signal cleaning documentation: https://nilearn.github.io/stable/modules/generated/nilearn.image.clean_img.html
|
|
115
|
+
|
|
116
|
+
Created At: 2026-04-14 00:40 HKT
|
|
117
|
+
Last Updated At: 2026-04-14 00:45 HKT
|
|
118
|
+
Author: chengwang96
|