@brainpilot/skills 0.0.6 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/skills/01_Meta-Skills/academic-research-hub/SKILL.md +108 -0
- package/skills/01_Meta-Skills/academic-research-hub/scripts/requirements.txt +17 -0
- package/skills/01_Meta-Skills/academic-research-hub/scripts/research.py +781 -0
- package/skills/01_Meta-Skills/beautiful-log/SKILL.md +64 -0
- package/skills/01_Meta-Skills/beautiful-log/scripts/beautiful_log.py +274 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/SKILL.md +130 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/assets/config.template.yaml +54 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/assets/top5_digest_template.md +5 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/build_top5_digest.py +300 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/common.py +137 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/merge_results.py +106 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/run_pipeline.py +177 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/search_arxiv.py +162 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/search_pubmed.py +202 -0
- package/skills/01_Meta-Skills/ethoclaw-normalize-tabular/SKILL.md +173 -0
- package/skills/01_Meta-Skills/ethoclaw-normalize-tabular/scripts/normalize_data.py +874 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/SKILL.md +134 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/references/confirmation-prompts.md +31 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/references/output-patterns.md +45 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/build_markdown_deliverables.py +41 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/build_research_log.py +84 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/build_summary_md.py +63 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/extract_pdf_bundle.py +140 -0
- package/skills/01_Meta-Skills/experiment-controller/SKILL.md +140 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/SKILL.md +366 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/entity_resolution.py +120 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/extraction_prompt_template.txt +19 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/graph_query.py +106 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/hypothesis_cli_reference.py +42 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/new_data_source_template.py +116 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/requirements.txt +15 -0
- package/skills/01_Meta-Skills/method-design/SKILL.md +61 -0
- package/skills/01_Meta-Skills/multi-search-engine/SKILL.md +119 -0
- package/skills/01_Meta-Skills/research-idea/SKILL.md +65 -0
- package/skills/05_EEG_ERP/eeg-skill/SKILL.md +197 -0
- package/skills/05_EEG_ERP/meg-skill/SKILL.md +188 -0
- package/skills/05_EEG_ERP/meg-skill/scripts/time_frequency.py +223 -0
- package/skills/05_EEG_ERP/mne-eeg-tool/SKILL.md +165 -0
- package/skills/05_EEG_ERP/mne-eeg-tool/scripts/eeg_pipeline_reference.py +231 -0
- package/skills/05_EEG_ERP/seed-iv-skill/SKILL.md +184 -0
- package/skills/05_EEG_ERP/seed-iv-skill/scripts/classify_seed_iv.py +154 -0
- package/skills/05_EEG_ERP/seed-iv-skill/scripts/extract_seed_iv_features.py +190 -0
- package/skills/05_EEG_ERP/seed-iv-skill/scripts/validate_seed_iv.py +102 -0
- package/skills/05_EEG_ERP/seed-vig-skill/SKILL.md +182 -0
- package/skills/05_EEG_ERP/seed-vig-skill/scripts/classify_seed_vig.py +165 -0
- package/skills/05_EEG_ERP/seed-vig-skill/scripts/extract_seed_vig_features.py +185 -0
- package/skills/05_EEG_ERP/seed-vig-skill/scripts/validate_seed_vig.py +88 -0
- package/skills/06_fMRI_Neuroimaging/abcd-skill/SKILL.md +308 -0
- package/skills/06_fMRI_Neuroimaging/abcd-skill/scripts/abcd_qc_summary.py +449 -0
- package/skills/06_fMRI_Neuroimaging/abcd-skill/scripts/extract_abcd_phenotype.py +292 -0
- package/skills/06_fMRI_Neuroimaging/abcd-skill/scripts/reorganize_abcd.py +387 -0
- package/skills/06_fMRI_Neuroimaging/abide-skill/SKILL.md +302 -0
- package/skills/06_fMRI_Neuroimaging/abide-skill/scripts/abide_qc_summary.py +317 -0
- package/skills/06_fMRI_Neuroimaging/abide-skill/scripts/extract_abide_phenotype.py +267 -0
- package/skills/06_fMRI_Neuroimaging/abide-skill/scripts/reorganize_abide.py +387 -0
- package/skills/06_fMRI_Neuroimaging/adhd200-skill/SKILL.md +244 -0
- package/skills/06_fMRI_Neuroimaging/adhd200-skill/scripts/adhd200_qc_summary.py +98 -0
- package/skills/06_fMRI_Neuroimaging/adhd200-skill/scripts/extract_adhd200_phenotype.py +134 -0
- package/skills/06_fMRI_Neuroimaging/adhd200-skill/scripts/reorganize_adhd200.py +206 -0
- package/skills/06_fMRI_Neuroimaging/adni-skill/SKILL.md +358 -0
- package/skills/06_fMRI_Neuroimaging/adni-skill/scripts/generate_adni_task_files.py +1305 -0
- package/skills/06_fMRI_Neuroimaging/adni-skill/scripts/generate_vqa_from_tasks.py +766 -0
- package/skills/06_fMRI_Neuroimaging/adni-skill/scripts/reorganize_adni.py +491 -0
- package/skills/06_fMRI_Neuroimaging/aibl-skill/SKILL.md +295 -0
- package/skills/06_fMRI_Neuroimaging/aibl-skill/scripts/aibl_qc_summary.py +260 -0
- package/skills/06_fMRI_Neuroimaging/aibl-skill/scripts/extract_aibl_phenotype.py +365 -0
- package/skills/06_fMRI_Neuroimaging/aibl-skill/scripts/reorganize_aibl.py +394 -0
- package/skills/06_fMRI_Neuroimaging/aomic-skill/SKILL.md +292 -0
- package/skills/06_fMRI_Neuroimaging/aomic-skill/scripts/aomic_qc_summary.py +258 -0
- package/skills/06_fMRI_Neuroimaging/aomic-skill/scripts/extract_aomic_phenotype.py +284 -0
- package/skills/06_fMRI_Neuroimaging/aomic-skill/scripts/reorganize_aomic.py +322 -0
- package/skills/06_fMRI_Neuroimaging/asl-skill/SKILL.md +168 -0
- package/skills/06_fMRI_Neuroimaging/asl-skill/scripts/compute_cbf.py +224 -0
- package/skills/06_fMRI_Neuroimaging/bids-organizer/SKILL.md +241 -0
- package/skills/06_fMRI_Neuroimaging/bold5000-skill/SKILL.md +186 -0
- package/skills/06_fMRI_Neuroimaging/bold5000-skill/scripts/bold5000_qc_summary.py +96 -0
- package/skills/06_fMRI_Neuroimaging/bold5000-skill/scripts/extract_bold5000_stimulus.py +125 -0
- package/skills/06_fMRI_Neuroimaging/bold5000-skill/scripts/reorganize_bold5000.py +102 -0
- package/skills/06_fMRI_Neuroimaging/camcan-skill/SKILL.md +213 -0
- package/skills/06_fMRI_Neuroimaging/camcan-skill/scripts/camcan_qc_summary.py +131 -0
- package/skills/06_fMRI_Neuroimaging/camcan-skill/scripts/extract_camcan_phenotype.py +145 -0
- package/skills/06_fMRI_Neuroimaging/camcan-skill/scripts/validate_camcan.py +141 -0
- package/skills/06_fMRI_Neuroimaging/cobre-skill/SKILL.md +201 -0
- package/skills/06_fMRI_Neuroimaging/cobre-skill/scripts/cobre_qc_summary.py +95 -0
- package/skills/06_fMRI_Neuroimaging/cobre-skill/scripts/extract_cobre_phenotype.py +104 -0
- package/skills/06_fMRI_Neuroimaging/cobre-skill/scripts/reorganize_cobre.py +140 -0
- package/skills/06_fMRI_Neuroimaging/conn-tool/SKILL.md +180 -0
- package/skills/06_fMRI_Neuroimaging/dcm2nii/SKILL.md +189 -0
- package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/SKILL.md +183 -0
- package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/scripts/dmt_har_med_qc_summary.py +96 -0
- package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/scripts/extract_dmt_har_med_phenotype.py +121 -0
- package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/scripts/reorganize_dmt_har_med.py +125 -0
- package/skills/06_fMRI_Neuroimaging/dwi-skill/SKILL.md +359 -0
- package/skills/06_fMRI_Neuroimaging/fmri-skill/SKILL.md +371 -0
- package/skills/06_fMRI_Neuroimaging/fmriprep-tool/SKILL.md +228 -0
- package/skills/06_fMRI_Neuroimaging/freesurfer-tool/SKILL.md +286 -0
- package/skills/06_fMRI_Neuroimaging/freesurfer-tool/scripts/freesurfer_processor.py +145 -0
- package/skills/06_fMRI_Neuroimaging/fsl-tool/SKILL.md +208 -0
- package/skills/06_fMRI_Neuroimaging/hbn-skill/SKILL.md +271 -0
- package/skills/06_fMRI_Neuroimaging/hbn-skill/scripts/extract_hbn_phenotype.py +107 -0
- package/skills/06_fMRI_Neuroimaging/hbn-skill/scripts/hbn_qc_summary.py +96 -0
- package/skills/06_fMRI_Neuroimaging/hbn-skill/scripts/reorganize_hbn.py +150 -0
- package/skills/06_fMRI_Neuroimaging/hcpa-skill/SKILL.md +210 -0
- package/skills/06_fMRI_Neuroimaging/hcpa-skill/scripts/extract_hcpa_phenotype.py +146 -0
- package/skills/06_fMRI_Neuroimaging/hcpa-skill/scripts/hcpa_qc_summary.py +120 -0
- package/skills/06_fMRI_Neuroimaging/hcpa-skill/scripts/reorganize_hcpa.py +155 -0
- package/skills/06_fMRI_Neuroimaging/hcpd-skill/SKILL.md +210 -0
- package/skills/06_fMRI_Neuroimaging/hcpd-skill/scripts/extract_hcpd_phenotype.py +148 -0
- package/skills/06_fMRI_Neuroimaging/hcpd-skill/scripts/hcpd_qc_summary.py +125 -0
- package/skills/06_fMRI_Neuroimaging/hcpd-skill/scripts/reorganize_hcpd.py +146 -0
- package/skills/06_fMRI_Neuroimaging/hcpep-skill/SKILL.md +215 -0
- package/skills/06_fMRI_Neuroimaging/hcpep-skill/scripts/extract_hcpep_phenotype.py +157 -0
- package/skills/06_fMRI_Neuroimaging/hcpep-skill/scripts/hcpep_qc_summary.py +143 -0
- package/skills/06_fMRI_Neuroimaging/hcpep-skill/scripts/reorganize_hcpep.py +146 -0
- package/skills/06_fMRI_Neuroimaging/hcppipeline-tool/SKILL.md +217 -0
- package/skills/06_fMRI_Neuroimaging/hcpya-skill/SKILL.md +214 -0
- package/skills/06_fMRI_Neuroimaging/hcpya-skill/scripts/extract_hcpya_phenotype.py +190 -0
- package/skills/06_fMRI_Neuroimaging/hcpya-skill/scripts/hcpya_qc_summary.py +152 -0
- package/skills/06_fMRI_Neuroimaging/hcpya-skill/scripts/reorganize_hcpya.py +203 -0
- package/skills/06_fMRI_Neuroimaging/ixi-skill/SKILL.md +198 -0
- package/skills/06_fMRI_Neuroimaging/ixi-skill/scripts/ixi_qc_summary.py +137 -0
- package/skills/06_fMRI_Neuroimaging/ixi-skill/scripts/reorganize_ixi.py +190 -0
- package/skills/06_fMRI_Neuroimaging/mnd-skill/SKILL.md +191 -0
- package/skills/06_fMRI_Neuroimaging/mnd-skill/scripts/extract_mnd_phenotype.py +143 -0
- package/skills/06_fMRI_Neuroimaging/mnd-skill/scripts/mnd_qc_summary.py +120 -0
- package/skills/06_fMRI_Neuroimaging/mnd-skill/scripts/validate_mnd.py +107 -0
- package/skills/06_fMRI_Neuroimaging/mschallenge-skill/SKILL.md +203 -0
- package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/analyze_lesions.py +119 -0
- package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/longitudinal_lesion.py +148 -0
- package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/mschallenge_qc_summary.py +132 -0
- package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/validate_mschallenge.py +116 -0
- package/skills/06_fMRI_Neuroimaging/nibabel-skill/SKILL.md +184 -0
- package/skills/06_fMRI_Neuroimaging/nibabel-skill/scripts/atlas_coordinate_reference.py +61 -0
- package/skills/06_fMRI_Neuroimaging/nibabel-skill/scripts/freesurfer_io_reference.py +34 -0
- package/skills/06_fMRI_Neuroimaging/nibabel-skill/scripts/nifti_inspection_reference.py +35 -0
- package/skills/06_fMRI_Neuroimaging/nifd-skill/SKILL.md +205 -0
- package/skills/06_fMRI_Neuroimaging/nifd-skill/scripts/extract_nifd_phenotype.py +132 -0
- package/skills/06_fMRI_Neuroimaging/nifd-skill/scripts/nifd_qc_summary.py +111 -0
- package/skills/06_fMRI_Neuroimaging/nifd-skill/scripts/validate_nifd.py +111 -0
- package/skills/06_fMRI_Neuroimaging/nii2dcm/SKILL.md +143 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/SKILL.md +266 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/connectome_reference.py +65 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/denoise_timeseries_reference.py +58 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/hierarchical_parcellation_reference.py +53 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/kmeans_parcellation_reference.py +53 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/preprocess_bold_reference.py +76 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/rest_dictlearning_reference.py +56 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/rest_ica_reference.py +59 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/second_level_glm_reference.py +58 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/spacenet_classifier_reference.py +59 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/svm_classifier_reference.py +60 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/task_glm_reference.py +63 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/zalff_summary_reference.py +109 -0
- package/skills/06_fMRI_Neuroimaging/nsd-skill/SKILL.md +210 -0
- package/skills/06_fMRI_Neuroimaging/nsd-skill/scripts/extract_nsd_stimulus.py +171 -0
- package/skills/06_fMRI_Neuroimaging/nsd-skill/scripts/nsd_qc_summary.py +142 -0
- package/skills/06_fMRI_Neuroimaging/nsd-skill/scripts/validate_nsd.py +142 -0
- package/skills/06_fMRI_Neuroimaging/oasis-skill/SKILL.md +205 -0
- package/skills/06_fMRI_Neuroimaging/oasis-skill/scripts/extract_oasis_phenotype.py +126 -0
- package/skills/06_fMRI_Neuroimaging/oasis-skill/scripts/oasis_qc_summary.py +115 -0
- package/skills/06_fMRI_Neuroimaging/oasis-skill/scripts/validate_oasis.py +119 -0
- package/skills/06_fMRI_Neuroimaging/pet-skill/SKILL.md +173 -0
- package/skills/06_fMRI_Neuroimaging/pet-skill/scripts/compute_suvr.py +202 -0
- package/skills/06_fMRI_Neuroimaging/pnc-skill/SKILL.md +206 -0
- package/skills/06_fMRI_Neuroimaging/pnc-skill/scripts/extract_pnc_phenotype.py +136 -0
- package/skills/06_fMRI_Neuroimaging/pnc-skill/scripts/pnc_qc_summary.py +116 -0
- package/skills/06_fMRI_Neuroimaging/pnc-skill/scripts/validate_pnc.py +120 -0
- package/skills/06_fMRI_Neuroimaging/ppmi-skill/SKILL.md +209 -0
- package/skills/06_fMRI_Neuroimaging/ppmi-skill/scripts/extract_ppmi_phenotype.py +138 -0
- package/skills/06_fMRI_Neuroimaging/ppmi-skill/scripts/ppmi_qc_summary.py +111 -0
- package/skills/06_fMRI_Neuroimaging/ppmi-skill/scripts/validate_ppmi.py +117 -0
- package/skills/06_fMRI_Neuroimaging/qsiprep-tool/SKILL.md +320 -0
- package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/SKILL.md +215 -0
- package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/extract_rest_mdd_phenotype.py +132 -0
- package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/harmonize_sites.py +152 -0
- package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/rest_mdd_qc_summary.py +124 -0
- package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/validate_rest_mdd.py +103 -0
- package/skills/06_fMRI_Neuroimaging/smri-skill/SKILL.md +302 -0
- package/skills/06_fMRI_Neuroimaging/tcp-skill/SKILL.md +204 -0
- package/skills/06_fMRI_Neuroimaging/tcp-skill/scripts/extract_tcp_phenotype.py +139 -0
- package/skills/06_fMRI_Neuroimaging/tcp-skill/scripts/tcp_qc_summary.py +111 -0
- package/skills/06_fMRI_Neuroimaging/tcp-skill/scripts/validate_tcp.py +99 -0
- package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/SKILL.md +217 -0
- package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/scripts/extract_ucla_cnp_phenotype.py +145 -0
- package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/scripts/ucla_cnp_qc_summary.py +111 -0
- package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/scripts/validate_ucla_cnp.py +113 -0
- package/skills/06_fMRI_Neuroimaging/ukb-skill/SKILL.md +310 -0
- package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/build_ukb_survival.py +210 -0
- package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/extract_ukb_cases.py +308 -0
- package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/extract_ukb_phenotype.py +232 -0
- package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/ukb_qc_summary.py +158 -0
- package/skills/06_fMRI_Neuroimaging/wmh-segmentation/SKILL.md +133 -0
- package/skills/07_Computational_Modeling/detrending/SKILL.md +118 -0
- package/skills/07_Computational_Modeling/dictlearning/SKILL.md +122 -0
- package/skills/07_Computational_Modeling/filtering/SKILL.md +121 -0
- package/skills/07_Computational_Modeling/glm/SKILL.md +153 -0
- package/skills/07_Computational_Modeling/hierarchical/SKILL.md +121 -0
- package/skills/07_Computational_Modeling/ica/SKILL.md +122 -0
- package/skills/07_Computational_Modeling/kmeans/SKILL.md +119 -0
- package/skills/07_Computational_Modeling/run_models/SKILL.md +427 -0
- package/skills/07_Computational_Modeling/spacenet/SKILL.md +122 -0
- package/skills/07_Computational_Modeling/svm/SKILL.md +120 -0
- package/skills/08_Computational_Neuroscience/brain_gnn/SKILL.md +183 -0
- package/skills/08_Computational_Neuroscience/dipy-tool/SKILL.md +239 -0
- package/skills/08_Computational_Neuroscience/dipy-tool/scripts/dti_metrics_reference.py +70 -0
- package/skills/08_Computational_Neuroscience/dipy-tool/scripts/load_and_mask_reference.py +76 -0
- package/skills/08_Computational_Neuroscience/dipy-tool/scripts/roi_stats_reference.py +59 -0
- package/skills/08_Computational_Neuroscience/fm_app/SKILL.md +195 -0
- package/skills/08_Computational_Neuroscience/neurostorm/SKILL.md +151 -0
- package/skills/13_Visualization/brain-visualization/SKILL.md +191 -0
- package/skills/13_Visualization/brain-visualization/scripts/connectome_reference.py +108 -0
- package/skills/13_Visualization/brain-visualization/scripts/freesurfer_ply_reference.py +54 -0
- package/skills/13_Visualization/brain-visualization/scripts/zalff_summary_reference.py +116 -0
- package/skills/13_Visualization/ethoclaw-paper-figure-layout/SKILL.md +78 -0
- package/skills/13_Visualization/ethoclaw-paper-figure-layout/assets/naturecomm_figures.tex +74 -0
- package/skills/13_Visualization/ethoclaw-paper-figure-layout/scripts/layout_results_foldered.py +579 -0
- package/skills/14_Writing/overleaf-skill/SKILL.md +184 -0
- package/skills/14_Writing/overleaf-skill/scripts/install.sh +30 -0
- package/skills/14_Writing/paper-writing/SKILL.md +146 -0
- package/skills/14_Writing/paper-writing/scripts/data_statement_templates.py +164 -0
- package/skills/14_Writing/paper-writing/scripts/figure_templates.py +315 -0
- package/skills/14_Writing/paper-writing/scripts/nature_figure_style.py +214 -0
- package/skills/14_Writing/paper-writing/scripts/section_phrasebank.py +246 -0
- package/skills/16_Animal_Behavior/deeplabcut/SKILL.md +154 -0
- package/skills/16_Animal_Behavior/deeplabcut/references/3d-pose.md +89 -0
- package/skills/16_Animal_Behavior/deeplabcut/references/maDLC.md +123 -0
- package/skills/16_Animal_Behavior/deeplabcut/references/modelzoo.md +98 -0
- package/skills/16_Animal_Behavior/deeplabcut/references/standard-pipeline.md +165 -0
- package/skills/16_Animal_Behavior/deeplabcut/references/utilities.md +146 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/SKILL.md +274 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/report_template_en.html +112 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/report_template_en.md +21 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/cluster-section.md +5 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/heatmap-section.md +5 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/integrated-interpretation.md +3 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/overview.md +3 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/project-summary.md +3 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/radar-section.md +5 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/raw-trajectory.md +3 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/sample-check.md +3 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/single-subject-section.md +3 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/stats-section.md +5 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/epm.md +52 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/fst.md +37 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/nor.md +39 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/oft.md +43 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/tcst.md +45 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/tst.md +36 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/input-types.md +59 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/interpretation-guardrails.md +45 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/metadata-schema.md +57 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/report-sections.md +86 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/section-selection-rules.md +169 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/scripts/build_report_manifest.py +27 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/scripts/render_report.py +34 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/scripts/report_utils.py +1121 -0
- package/skills/16_Animal_Behavior/ethoclaw-animal-grounding/SKILL.md +390 -0
- package/skills/16_Animal_Behavior/ethoclaw-animal-grounding/reference_code.py +98 -0
- package/skills/16_Animal_Behavior/ethoclaw-animal-pose-estimation/SKILL.md +336 -0
- package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/README.md +21 -0
- package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/SKILL.md +41 -0
- package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/batch_kinematic_generator.py +663 -0
- package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/config.json +19 -0
- package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/generate_kinematic_parameter.py +401 -0
- package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/kinematic_generator.py +265 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/SKILL.md +72 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/references/config.example.toml +56 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/scripts/cluster_all_params.py +232 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/scripts/cluster_all_params_from_config.py +236 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-radar-generate/SKILL.md +68 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-radar-generate/references/notes.md +5 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-radar-generate/scripts/plot_h5_radar.py +513 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/SKILL.md +52 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/config.toml +81 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/references/stats-rule.md +18 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/scripts/h5_inspect.py +79 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/scripts/h5_violin_batch.py +624 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/scripts/h5_violin_stats.py +438 -0
- package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/SKILL.md +280 -0
- package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/core_scripts/heatmap_trajectory.py +790 -0
- package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/core_scripts/heatmap_velocity.py +855 -0
- package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/reference_data/reference_2d.csv +101 -0
- package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/reference_data/reference_2d.h5 +0 -0
- package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/reference_data/reference_data_readme.md +126 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Extract and merge UCLA CNP phenotype data.
|
|
3
|
+
|
|
4
|
+
Reads UCLA CNP phenotype files (diagnosis, cognitive battery, behavioral)
|
|
5
|
+
and produces a merged phenotype table aligned with imaging subject list.
|
|
6
|
+
"""
|
|
7
|
+
import argparse
|
|
8
|
+
import csv
|
|
9
|
+
import sys
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from typing import Dict, List, Optional
|
|
12
|
+
|
|
13
|
+
COLUMN_MAP = {
|
|
14
|
+
"subject_id": ["subject", "Subject", "participant_id", "SubID"],
|
|
15
|
+
"age": ["age", "Age"],
|
|
16
|
+
"sex": ["sex", "Sex", "Gender"],
|
|
17
|
+
"race": ["race", "Race"],
|
|
18
|
+
"ethnicity": ["ethnicity", "Ethnicity"],
|
|
19
|
+
"handedness": ["handedness", "Handedness"],
|
|
20
|
+
"diagnosis": ["diagnosis", "Diagnosis", "Group", "DX"],
|
|
21
|
+
"diagnosis_detail": ["diagnosis_detail", "Diagnosis_Detail"],
|
|
22
|
+
# Cognitive battery
|
|
23
|
+
"digit_span_fwd": ["DigitSpan_Forward", "digit_span_fwd"],
|
|
24
|
+
"digit_span_bwd": ["DigitSpan_Backward", "digit_span_bwd"],
|
|
25
|
+
"trail_a": ["TrailA", "trail_a"],
|
|
26
|
+
"trail_b": ["TrailB", "trail_b"],
|
|
27
|
+
"cpt_dprime": ["CPT_dprime", "cpt_dprime"],
|
|
28
|
+
"lns": ["LNS", "lns"],
|
|
29
|
+
# Task performance
|
|
30
|
+
"stopsignal_srt": ["StopSignal_SRT", "stopsignal_srt"],
|
|
31
|
+
"stopsignal_ssrt": ["StopSignal_SSRT", "stopsignal_ssrt"],
|
|
32
|
+
"spatialwm_accuracy": ["SpatialWM_Acc", "spatialwm_accuracy"],
|
|
33
|
+
"facememory_accuracy": ["FaceMem_Acc", "facememory_accuracy"],
|
|
34
|
+
# Clinical
|
|
35
|
+
"bdi": ["BDI", "bdi"],
|
|
36
|
+
"bai": ["BAI", "bai"],
|
|
37
|
+
"panss_positive": ["PANSS_Pos", "panss_positive"],
|
|
38
|
+
"panss_negative": ["PANSS_Neg", "panss_negative"],
|
|
39
|
+
"panss_general": ["PANSS_Gen", "panss_general"],
|
|
40
|
+
"ymrs": ["YMRS", "ymrs"],
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def load_csv(path: Path) -> List[Dict[str, str]]:
|
|
45
|
+
delimiter = "\t" if path.suffix == ".tsv" else ","
|
|
46
|
+
with open(path, "r", encoding="utf-8") as f:
|
|
47
|
+
reader = csv.DictReader(f, delimiter=delimiter)
|
|
48
|
+
return list(reader)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def find_column(row: Dict[str, str], candidates: List[str]) -> Optional[str]:
|
|
52
|
+
for col in candidates:
|
|
53
|
+
if col in row:
|
|
54
|
+
return col
|
|
55
|
+
return None
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def extract_phenotype(
|
|
59
|
+
phenotype_files: List[Path],
|
|
60
|
+
imaging_ids: Optional[List[str]] = None,
|
|
61
|
+
columns: Optional[List[str]] = None,
|
|
62
|
+
) -> List[Dict[str, str]]:
|
|
63
|
+
all_data = []
|
|
64
|
+
for fpath in phenotype_files:
|
|
65
|
+
rows = load_csv(fpath)
|
|
66
|
+
all_data.extend(rows)
|
|
67
|
+
|
|
68
|
+
if not all_data:
|
|
69
|
+
return []
|
|
70
|
+
|
|
71
|
+
target_columns = columns if columns else list(COLUMN_MAP.keys())
|
|
72
|
+
merged = {}
|
|
73
|
+
|
|
74
|
+
for row in all_data:
|
|
75
|
+
subj_col = find_column(row, COLUMN_MAP["subject_id"])
|
|
76
|
+
if subj_col is None:
|
|
77
|
+
continue
|
|
78
|
+
subj_id = row[subj_col].strip()
|
|
79
|
+
if not subj_id:
|
|
80
|
+
continue
|
|
81
|
+
|
|
82
|
+
if subj_id not in merged:
|
|
83
|
+
merged[subj_id] = {"subject_id": subj_id}
|
|
84
|
+
|
|
85
|
+
for target_col in target_columns:
|
|
86
|
+
if target_col == "subject_id":
|
|
87
|
+
continue
|
|
88
|
+
if target_col in merged[subj_id] and merged[subj_id][target_col]:
|
|
89
|
+
continue
|
|
90
|
+
candidates = COLUMN_MAP.get(target_col, [target_col])
|
|
91
|
+
src_col = find_column(row, candidates)
|
|
92
|
+
if src_col and row.get(src_col, "").strip():
|
|
93
|
+
merged[subj_id][target_col] = row[src_col].strip()
|
|
94
|
+
|
|
95
|
+
result = list(merged.values())
|
|
96
|
+
if imaging_ids:
|
|
97
|
+
imaging_set = set(imaging_ids)
|
|
98
|
+
result = [r for r in result if r["subject_id"] in imaging_set]
|
|
99
|
+
return result
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def main() -> int:
|
|
103
|
+
parser = argparse.ArgumentParser(description="Extract UCLA CNP phenotype data.")
|
|
104
|
+
parser.add_argument("--phenotype-files", required=True, nargs="+")
|
|
105
|
+
parser.add_argument("--output", required=True)
|
|
106
|
+
parser.add_argument("--imaging-ids")
|
|
107
|
+
parser.add_argument("--columns")
|
|
108
|
+
args = parser.parse_args()
|
|
109
|
+
|
|
110
|
+
phenotype_files = [Path(f).resolve() for f in args.phenotype_files]
|
|
111
|
+
for f in phenotype_files:
|
|
112
|
+
if not f.exists():
|
|
113
|
+
print(f"File not found: {f}", file=sys.stderr)
|
|
114
|
+
return 1
|
|
115
|
+
|
|
116
|
+
imaging_ids = None
|
|
117
|
+
if args.imaging_ids:
|
|
118
|
+
id_file = Path(args.imaging_ids).resolve()
|
|
119
|
+
if id_file.exists():
|
|
120
|
+
imaging_ids = [l.strip() for l in id_file.read_text().splitlines() if l.strip()]
|
|
121
|
+
|
|
122
|
+
columns = None
|
|
123
|
+
if args.columns:
|
|
124
|
+
columns = [c.strip() for c in args.columns.split(",")]
|
|
125
|
+
|
|
126
|
+
merged = extract_phenotype(phenotype_files, imaging_ids, columns)
|
|
127
|
+
if not merged:
|
|
128
|
+
print("[ERROR] No phenotype data extracted.", file=sys.stderr)
|
|
129
|
+
return 1
|
|
130
|
+
|
|
131
|
+
output_path = Path(args.output).resolve()
|
|
132
|
+
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
133
|
+
fieldnames = list(merged[0].keys())
|
|
134
|
+
with open(output_path, "w", newline="", encoding="utf-8") as f:
|
|
135
|
+
writer = csv.DictWriter(f, fieldnames=fieldnames)
|
|
136
|
+
writer.writeheader()
|
|
137
|
+
writer.writerows(merged)
|
|
138
|
+
|
|
139
|
+
diag_groups = set(r.get("diagnosis", "") for r in merged if r.get("diagnosis"))
|
|
140
|
+
print(f"Phenotype: {len(merged)} subjects, {len(fieldnames)} columns, {len(diag_groups)} groups -> {output_path}")
|
|
141
|
+
return 0
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
if __name__ == "__main__":
|
|
145
|
+
sys.exit(main())
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Generate per-subject QC summaries for UCLA CNP processing.
|
|
3
|
+
|
|
4
|
+
Multi-disorder: tracks diagnostic group and applies appropriate QC criteria.
|
|
5
|
+
"""
|
|
6
|
+
import argparse
|
|
7
|
+
import csv
|
|
8
|
+
import sys
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import Dict, List
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def load_confounds(confounds_path: Path) -> Dict[str, float]:
|
|
14
|
+
metrics = {"fd_mean": float("nan"), "fd_max": float("nan")}
|
|
15
|
+
try:
|
|
16
|
+
import pandas as pd
|
|
17
|
+
df = pd.read_csv(confounds_path, sep="\t")
|
|
18
|
+
if "framewise_displacement" in df.columns:
|
|
19
|
+
fd = df["framewise_displacement"].dropna()
|
|
20
|
+
metrics["fd_mean"] = float(fd.mean())
|
|
21
|
+
metrics["fd_max"] = float(fd.max())
|
|
22
|
+
except Exception:
|
|
23
|
+
pass
|
|
24
|
+
return metrics
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def check_exclusion(metrics: Dict[str, float], fd_threshold: float = 0.3) -> List[str]:
|
|
28
|
+
reasons = []
|
|
29
|
+
if not (metrics["fd_mean"] != metrics["fd_mean"]):
|
|
30
|
+
if metrics["fd_mean"] > fd_threshold:
|
|
31
|
+
reasons.append(f"FD mean {metrics['fd_mean']:.3f} > {fd_threshold}")
|
|
32
|
+
return reasons
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def main() -> int:
|
|
36
|
+
parser = argparse.ArgumentParser(description="Generate QC summaries for UCLA CNP processing.")
|
|
37
|
+
parser.add_argument("--fmriprep-dir", help="Path to fMRIPrep output directory")
|
|
38
|
+
parser.add_argument("--output", required=True)
|
|
39
|
+
parser.add_argument("--exclude-output")
|
|
40
|
+
parser.add_argument("--fd-threshold", type=float, default=0.3)
|
|
41
|
+
parser.add_argument("--diagnosis-file", help="CSV with subject diagnosis info")
|
|
42
|
+
args = parser.parse_args()
|
|
43
|
+
|
|
44
|
+
output_path = Path(args.output).resolve()
|
|
45
|
+
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
46
|
+
|
|
47
|
+
diagnosis_map = {}
|
|
48
|
+
if args.diagnosis_file:
|
|
49
|
+
diag_path = Path(args.diagnosis_file).resolve()
|
|
50
|
+
if diag_path.exists():
|
|
51
|
+
with open(diag_path, "r", encoding="utf-8") as f:
|
|
52
|
+
reader = csv.DictReader(f)
|
|
53
|
+
for row in reader:
|
|
54
|
+
subj = row.get("subject_id") or row.get("Subject", "")
|
|
55
|
+
diag = row.get("diagnosis") or row.get("Diagnosis") or row.get("Group", "")
|
|
56
|
+
if subj and diag:
|
|
57
|
+
diagnosis_map[subj] = diag
|
|
58
|
+
|
|
59
|
+
subjects = set()
|
|
60
|
+
if args.fmriprep_dir:
|
|
61
|
+
fmriprep_dir = Path(args.fmriprep_dir).resolve()
|
|
62
|
+
if fmriprep_dir.exists():
|
|
63
|
+
for d in fmriprep_dir.glob("sub-*"):
|
|
64
|
+
if d.is_dir():
|
|
65
|
+
subjects.add(d.name)
|
|
66
|
+
|
|
67
|
+
if not subjects:
|
|
68
|
+
print("[WARN] No subjects found.", file=sys.stderr)
|
|
69
|
+
return 1
|
|
70
|
+
|
|
71
|
+
results = []
|
|
72
|
+
excluded = []
|
|
73
|
+
for subj in sorted(subjects):
|
|
74
|
+
metrics = {"subject_id": subj}
|
|
75
|
+
if diagnosis_map:
|
|
76
|
+
metrics["diagnosis"] = diagnosis_map.get(subj, "unknown")
|
|
77
|
+
|
|
78
|
+
if args.fmriprep_dir:
|
|
79
|
+
confounds_files = list(Path(args.fmriprep_dir).glob(f"{subj}/func/*_desc-confounds_timeseries.tsv"))
|
|
80
|
+
if confounds_files:
|
|
81
|
+
metrics.update(load_confounds(confounds_files[0]))
|
|
82
|
+
|
|
83
|
+
exclusion_reasons = check_exclusion(metrics, args.fd_threshold)
|
|
84
|
+
metrics["excluded"] = len(exclusion_reasons) > 0
|
|
85
|
+
metrics["exclusion_reasons"] = "; ".join(exclusion_reasons)
|
|
86
|
+
|
|
87
|
+
results.append(metrics)
|
|
88
|
+
if exclusion_reasons:
|
|
89
|
+
excluded.append({"subject_id": subj, "reasons": "; ".join(exclusion_reasons)})
|
|
90
|
+
|
|
91
|
+
if results:
|
|
92
|
+
fieldnames = list(results[0].keys())
|
|
93
|
+
with open(output_path, "w", newline="", encoding="utf-8") as f:
|
|
94
|
+
writer = csv.DictWriter(f, fieldnames=fieldnames)
|
|
95
|
+
writer.writeheader()
|
|
96
|
+
writer.writerows(results)
|
|
97
|
+
print(f"QC: {len(results)} subjects, {len(excluded)} excluded -> {output_path}")
|
|
98
|
+
|
|
99
|
+
if args.exclude_output and excluded:
|
|
100
|
+
exclude_path = Path(args.exclude_output).resolve()
|
|
101
|
+
exclude_path.parent.mkdir(parents=True, exist_ok=True)
|
|
102
|
+
with open(exclude_path, "w", newline="", encoding="utf-8") as f:
|
|
103
|
+
writer = csv.DictWriter(f, fieldnames=["subject_id", "reasons"])
|
|
104
|
+
writer.writeheader()
|
|
105
|
+
writer.writerows(excluded)
|
|
106
|
+
|
|
107
|
+
return 0
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
if __name__ == "__main__":
|
|
111
|
+
sys.exit(main())
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Validate UCLA CNP BIDS structure and generate compliance report.
|
|
3
|
+
|
|
4
|
+
Checks directory structure, modality completeness, and task paradigm presence.
|
|
5
|
+
"""
|
|
6
|
+
import argparse
|
|
7
|
+
import csv
|
|
8
|
+
import sys
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import Dict, List
|
|
11
|
+
|
|
12
|
+
EXPECTED_TASKS = ["stopsignal", "spatialwm", "facememory", "barts", "taskswitch"]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def validate_subject(subject_dir: Path) -> Dict[str, any]:
|
|
16
|
+
report = {
|
|
17
|
+
"subject": subject_dir.name,
|
|
18
|
+
"anat_complete": False,
|
|
19
|
+
"task_fMRI_present": False,
|
|
20
|
+
"dwi_present": False,
|
|
21
|
+
"n_task_runs": 0,
|
|
22
|
+
"tasks_found": [],
|
|
23
|
+
"missing_files": [],
|
|
24
|
+
"warnings": [],
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
anat_dir = subject_dir / "anat"
|
|
28
|
+
if anat_dir.exists():
|
|
29
|
+
t1w_files = list(anat_dir.glob("*_T1w.nii.gz"))
|
|
30
|
+
report["anat_complete"] = len(t1w_files) > 0
|
|
31
|
+
if not t1w_files:
|
|
32
|
+
report["missing_files"].append("anat/*_T1w.nii.gz")
|
|
33
|
+
else:
|
|
34
|
+
report["missing_files"].append("anat/")
|
|
35
|
+
|
|
36
|
+
func_dir = subject_dir / "func"
|
|
37
|
+
if func_dir.exists():
|
|
38
|
+
bold_files = list(func_dir.glob("*_bold.nii.gz"))
|
|
39
|
+
report["n_task_runs"] = len(bold_files)
|
|
40
|
+
|
|
41
|
+
tasks_found = set()
|
|
42
|
+
for f in bold_files:
|
|
43
|
+
name = f.name
|
|
44
|
+
for task in EXPECTED_TASKS:
|
|
45
|
+
if f"task-{task}" in name:
|
|
46
|
+
tasks_found.add(task)
|
|
47
|
+
report["tasks_found"] = sorted(tasks_found)
|
|
48
|
+
report["task_fMRI_present"] = len(tasks_found) > 0
|
|
49
|
+
else:
|
|
50
|
+
report["missing_files"].append("func/")
|
|
51
|
+
|
|
52
|
+
dwi_dir = subject_dir / "dwi"
|
|
53
|
+
if dwi_dir.exists():
|
|
54
|
+
dwi_files = list(dwi_dir.glob("*_dwi.nii.gz"))
|
|
55
|
+
report["dwi_present"] = len(dwi_files) > 0
|
|
56
|
+
else:
|
|
57
|
+
report["warnings"].append("No dwi directory")
|
|
58
|
+
|
|
59
|
+
return report
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def main() -> int:
|
|
63
|
+
parser = argparse.ArgumentParser(description="Validate UCLA CNP BIDS structure.")
|
|
64
|
+
parser.add_argument("--input", required=True)
|
|
65
|
+
parser.add_argument("--output", required=True)
|
|
66
|
+
args = parser.parse_args()
|
|
67
|
+
|
|
68
|
+
input_dir = Path(args.input).resolve()
|
|
69
|
+
if not input_dir.exists():
|
|
70
|
+
print(f"Input directory not found: {input_dir}", file=sys.stderr)
|
|
71
|
+
return 1
|
|
72
|
+
|
|
73
|
+
subjects = sorted([d for d in input_dir.glob("sub-*") if d.is_dir()])
|
|
74
|
+
print(f"Found {len(subjects)} subjects in {input_dir}")
|
|
75
|
+
|
|
76
|
+
if not subjects:
|
|
77
|
+
print("[ERROR] No subjects found.", file=sys.stderr)
|
|
78
|
+
return 1
|
|
79
|
+
|
|
80
|
+
results = []
|
|
81
|
+
for sub_dir in subjects:
|
|
82
|
+
report = validate_subject(sub_dir)
|
|
83
|
+
results.append(report)
|
|
84
|
+
|
|
85
|
+
output_path = Path(args.output).resolve()
|
|
86
|
+
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
87
|
+
|
|
88
|
+
fieldnames = [
|
|
89
|
+
"subject", "anat_complete", "task_fMRI_present", "dwi_present",
|
|
90
|
+
"n_task_runs", "tasks_found", "missing_files", "warnings",
|
|
91
|
+
]
|
|
92
|
+
with open(output_path, "w", newline="", encoding="utf-8") as f:
|
|
93
|
+
writer = csv.DictWriter(f, fieldnames=fieldnames)
|
|
94
|
+
writer.writeheader()
|
|
95
|
+
for r in results:
|
|
96
|
+
r["tasks_found"] = "; ".join(r["tasks_found"])
|
|
97
|
+
r["missing_files"] = "; ".join(r["missing_files"])
|
|
98
|
+
r["warnings"] = "; ".join(r["warnings"])
|
|
99
|
+
writer.writerow(r)
|
|
100
|
+
|
|
101
|
+
print(f"\nValidation Summary:")
|
|
102
|
+
print(f" Total subjects: {len(results)}")
|
|
103
|
+
print(f" With T1w: {sum(1 for r in results if r['anat_complete'])}")
|
|
104
|
+
print(f" With task-fMRI: {sum(1 for r in results if r['task_fMRI_present'])}")
|
|
105
|
+
print(f" With dMRI: {sum(1 for r in results if r['dwi_present'])}")
|
|
106
|
+
print(f" Avg task runs: {sum(r['n_task_runs'] for r in results) / max(len(results), 1):.1f}")
|
|
107
|
+
print(f" Output: {output_path}")
|
|
108
|
+
|
|
109
|
+
return 0
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
if __name__ == "__main__":
|
|
113
|
+
sys.exit(main())
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ukb-skill
|
|
3
|
+
description: "Use this skill whenever the user wants to analyze already available UK Biobank data for brain-related research, including neurological outcomes, cognitive phenotypes, brain MRI derived phenotypes, survival analysis, subgroup analysis, propensity score analysis, mediation analysis, sensitivity analysis, machine learning, visualization, or manuscript-ready summaries. This skill only covers post-extraction analysis and explicitly excludes RAP access and data download guidance."
|
|
4
|
+
license: MIT License (NeuroClaw custom skill – freely modifiable within the project)
|
|
5
|
+
layer: subagent
|
|
6
|
+
skill_type: dataset
|
|
7
|
+
dependencies:
|
|
8
|
+
- nilearn-tool
|
|
9
|
+
- fsl-tool
|
|
10
|
+
- claw-shell
|
|
11
|
+
---
|
|
12
|
+
# UKB Skill (Dataset Layer)
|
|
13
|
+
|
|
14
|
+
## Overview
|
|
15
|
+
|
|
16
|
+
`ukb-skill` is the NeuroClaw **analysis-layer** skill for **brain-focused UK Biobank downstream research**.
|
|
17
|
+
|
|
18
|
+
This skill is designed for users who already have local UK Biobank tables, derived phenotype tables, or neuroimaging-derived feature matrices and want to run downstream statistical or machine learning analyses.
|
|
19
|
+
|
|
20
|
+
It follows the NeuroClaw hierarchical design principles:
|
|
21
|
+
- This skill describes **WHAT needs to be analyzed** and **which existing skill should handle each part**.
|
|
22
|
+
- It contains **no RAP download workflow** and **no cloud export instructions**.
|
|
23
|
+
- It contains **no direct implementation code** and **no direct shell commands**.
|
|
24
|
+
- All concrete execution should be delegated through `claw-shell` and related downstream skills.
|
|
25
|
+
|
|
26
|
+
**Core workflow (never bypassed):**
|
|
27
|
+
1. Confirm that the user already has accessible UK Biobank-derived local data.
|
|
28
|
+
2. Identify the research target: neurological endpoint, cognitive phenotype, brain MRI phenotype, or predictive modeling task.
|
|
29
|
+
3. Identify the analysis type: regression, survival analysis, subgroup analysis, propensity score analysis, mediation analysis, sensitivity analysis, machine learning, visualization, or manuscript support.
|
|
30
|
+
4. Check the minimum required columns, files, and assumptions.
|
|
31
|
+
5. Generate a **numbered execution plan** with outputs, delegated skills, and risks.
|
|
32
|
+
6. Present the plan and wait for explicit user confirmation ("YES" / "execute" / "proceed").
|
|
33
|
+
7. On confirmation, delegate all execution through `claw-shell` and the target skills.
|
|
34
|
+
|
|
35
|
+
**Research use only.**
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Scope Boundaries
|
|
40
|
+
|
|
41
|
+
### Included
|
|
42
|
+
- Brain-related UK Biobank disease endpoint analysis using existing tables
|
|
43
|
+
- Cognitive and brain-health phenotype modeling
|
|
44
|
+
- Brain MRI derived phenotype association analysis
|
|
45
|
+
- Survival / logistic / linear modeling on UK Biobank-derived tables
|
|
46
|
+
- Sensitivity analysis, subgroup analysis, propensity score analysis, and mediation analysis
|
|
47
|
+
- Machine learning on brain-related tabular or derived neuroimaging features
|
|
48
|
+
- Visualization and manuscript-ready result summarization
|
|
49
|
+
|
|
50
|
+
### Excluded
|
|
51
|
+
- UK Biobank RAP access setup
|
|
52
|
+
- UK Biobank application, governance, or approval procedures
|
|
53
|
+
- Downloading demographics, proteomics, metabolomics, or raw UKB exports
|
|
54
|
+
- Cloud-side field selection or export helper workflows
|
|
55
|
+
- Low-level data download scripts
|
|
56
|
+
|
|
57
|
+
If the user asks how to obtain or download UK Biobank data, state that this skill only supports post-extraction analysis after the data has already been exported or derived.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Benchmark-Facing Default Mainline
|
|
62
|
+
|
|
63
|
+
For benchmark-style prompts, choose the narrowest valid UK Biobank brain-analysis route first and do not widen the response into unrelated epidemiology branches.
|
|
64
|
+
|
|
65
|
+
- If the task is incident neurological disease modeling:
|
|
66
|
+
- Default to `analysis-ready table -> survival endpoint check -> Cox regression -> sensitivity analysis if requested -> result summary`.
|
|
67
|
+
- Do not expand into unrelated imaging preprocessing or data download steps.
|
|
68
|
+
- If the task is cross-sectional cognition or brain-phenotype association analysis:
|
|
69
|
+
- Default to `feature table -> covariate check -> linear/logistic regression -> ranked outputs -> visualization if requested`.
|
|
70
|
+
- Do not expand into unrelated survival analysis unless the prompt explicitly asks for incident-event modeling.
|
|
71
|
+
- If the task is predictive modeling on brain-related UKB features:
|
|
72
|
+
- Default to `clean feature matrix -> train/validation split -> model fitting -> metrics -> interpretation`.
|
|
73
|
+
- Delegate predictive modeling to `run_models` when appropriate.
|
|
74
|
+
- If required columns or files are missing:
|
|
75
|
+
- State `Missing required input` explicitly.
|
|
76
|
+
- Do not invent UKB field names, event dates, or covariates.
|
|
77
|
+
- Do not introduce RAP, cloud export, or downloader guidance in benchmark mode.
|
|
78
|
+
|
|
79
|
+
When multiple valid analysis routes exist, prefer one explicit mainline plus a short note about blocked optional branches.
|
|
80
|
+
|
|
81
|
+
**Research use only.**
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## Quick Reference (Common UKB Brain Tasks → Delegation Map)
|
|
86
|
+
|
|
87
|
+
| Task | What needs to be done (high level) | Delegate to which skill | Expected outputs |
|
|
88
|
+
|---|---|---|---|
|
|
89
|
+
| Phenotype extraction | Extract and preprocess UKB variables with field ID mapping | `scripts/extract_ukb_phenotype.py` | Preprocessed phenotype CSV |
|
|
90
|
+
| Case extraction | Extract brain-related disease cases by ICD-10/ICD-9 codes | `scripts/extract_ukb_cases.py` | Case/control CSV with prevalence stats |
|
|
91
|
+
| Survival dataset | Build survival dataset with prevalent/incident separation | `scripts/build_ukb_survival.py` | Survival CSV (time, status) |
|
|
92
|
+
| QC summary | Generate per-subject QC with imaging availability | `scripts/ukb_qc_summary.py` | QC summary + exclusion list |
|
|
93
|
+
| Neurological survival analysis | Validate incident-event table, define endpoint, run Cox regression, summarize hazard ratios | `claw-shell` | model summaries, hazard ratio tables, survival outputs |
|
|
94
|
+
| Cognitive phenotype association | Regress cognition or brain-health phenotype on exposure or imaging features | `claw-shell` | beta/OR tables, cleaned regression outputs |
|
|
95
|
+
| Brain MRI phenotype association | Analyze ROI volumes, cortical thickness, WMH burden, diffusion or connectivity summaries | `claw-shell` | ranked effect tables, feature association summaries |
|
|
96
|
+
| Predictive modeling on UKB brain features | Fit classification or regression models and interpret them | `run_models` | metrics, predictions, SHAP summaries, model comparisons |
|
|
97
|
+
| Subgroup analysis | Test heterogeneity by sex, age band, APOE, vascular risk, or other subgroup | `claw-shell` | subgroup effect tables, interaction summaries |
|
|
98
|
+
| Propensity score analysis | Estimate propensity scores, run matching or weighting, assess balance | `claw-shell` | matched/weighted dataset summaries, balance outputs |
|
|
99
|
+
| Mediation analysis | Test whether a biomarker or imaging phenotype mediates a brain-related outcome | `claw-shell` | direct/indirect effect summaries, mediation tables |
|
|
100
|
+
| Sensitivity analysis | Exclude early events or rows with missing covariates, then rerun the same model | `claw-shell` | sensitivity tables, robustness comparison summaries |
|
|
101
|
+
| Brain-result visualization | Turn ranked brain-region or connectome outputs into figures | `brain-visualization` | PNG figures, ranked region tables, connectome plots |
|
|
102
|
+
| Manuscript-ready methods/results | Convert the finished analysis into text for reports or papers | `paper-writing` | draft methods, results text, figure legends |
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Recommended Strategy (Decision Logic)
|
|
107
|
+
|
|
108
|
+
- If the goal is **incident neurological disease analysis** such as dementia, stroke, or Parkinson's disease:
|
|
109
|
+
- Prefer the survival-analysis route.
|
|
110
|
+
- Confirm prevalent vs incident definition, censoring rule, and time/status columns before modeling.
|
|
111
|
+
- Best for: longitudinal UKB outcome studies.
|
|
112
|
+
|
|
113
|
+
- If the goal is **cross-sectional cognition or brain-health association analysis**:
|
|
114
|
+
- Prefer linear or logistic regression on a cleaned participant-level table.
|
|
115
|
+
- Best for: baseline phenotype studies, association screens, cognition analyses.
|
|
116
|
+
|
|
117
|
+
- If the goal is **brain MRI phenotype association analysis** using ROI tables, cortical thickness, WMH burden, diffusion summaries, or connectome summaries:
|
|
118
|
+
- Prefer a feature-table association route.
|
|
119
|
+
- Best for: imaging-derived phenotype studies and region-wise effect ranking.
|
|
120
|
+
|
|
121
|
+
- If the goal is **predictive modeling** on UKB brain-related features:
|
|
122
|
+
- Prefer `run_models` for model fitting, model comparison, and interpretation.
|
|
123
|
+
- Best for: disease risk prediction, cognitive outcome prediction, multimodal tabular modeling.
|
|
124
|
+
|
|
125
|
+
- If the goal is **effect heterogeneity or causal approximation**:
|
|
126
|
+
- Prefer subgroup, propensity score, or mediation workflows.
|
|
127
|
+
- Best for: mechanistic analyses, treatment/exposure comparison, robustness studies.
|
|
128
|
+
|
|
129
|
+
- If the goal is **publication-ready figures or writing**:
|
|
130
|
+
- Prefer `brain-visualization` for figures and `paper-writing` for text output.
|
|
131
|
+
- Best for: reporting, paper drafting, slide-ready summaries.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Minimal Input Requirements
|
|
136
|
+
|
|
137
|
+
### For Survival Analysis
|
|
138
|
+
- participant ID column
|
|
139
|
+
- survival time or baseline and event/censoring dates
|
|
140
|
+
- event indicator/status column
|
|
141
|
+
- clearly defined neurological or brain-related outcome
|
|
142
|
+
- covariates
|
|
143
|
+
|
|
144
|
+
### For Cross-Sectional Regression
|
|
145
|
+
- participant ID column
|
|
146
|
+
- exposure or predictor columns
|
|
147
|
+
- target phenotype column
|
|
148
|
+
- covariates
|
|
149
|
+
|
|
150
|
+
### For Brain Feature Modeling
|
|
151
|
+
- participant ID column
|
|
152
|
+
- ROI / IDP / derived feature columns
|
|
153
|
+
- target phenotype or outcome
|
|
154
|
+
- optional scanner, site, or confound columns
|
|
155
|
+
|
|
156
|
+
If the required inputs are not present, return a concrete missing-input list instead of inventing fields.
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## Brain-Relevant UKB Targets
|
|
161
|
+
|
|
162
|
+
This skill is intentionally restricted to brain-related UK Biobank content. Typical targets include:
|
|
163
|
+
- neurodegenerative outcomes: dementia, Alzheimer's disease, Parkinson's disease
|
|
164
|
+
- cerebrovascular outcomes: stroke and vascular brain-health outcomes
|
|
165
|
+
- cognition: memory, reaction time, executive function, fluid intelligence, cognitive decline
|
|
166
|
+
- psychiatric or brain-health outcomes when explicitly tied to brain-focused analysis
|
|
167
|
+
- imaging-derived brain phenotypes: cortical thickness, regional volume, subcortical volume, WMH burden, diffusion metrics, functional connectivity summaries
|
|
168
|
+
|
|
169
|
+
If the request is mainly non-brain UK Biobank epidemiology, this skill should state that it is out of scope.
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## When to Call This Skill
|
|
174
|
+
|
|
175
|
+
- Any request involving UK Biobank brain-related downstream analysis on already available local data.
|
|
176
|
+
- Any request involving dementia, stroke, cognition, brain MRI phenotypes, WMH burden, or brain-feature prediction in UKB.
|
|
177
|
+
- Any request asking for subgroup analysis, propensity score analysis, mediation analysis, or sensitivity analysis in a brain-focused UKB setting.
|
|
178
|
+
|
|
179
|
+
Do not call this skill for RAP export, field download, or raw neuroimaging preprocessing from DICOM/NIfTI.
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## Complementary / Related Skills
|
|
184
|
+
|
|
185
|
+
- `run_models` -> predictive modeling and interpretation on derived UKB brain features
|
|
186
|
+
- `brain-visualization` -> convert effect tables or connectome outputs into figures
|
|
187
|
+
- `paper-writing` -> manuscript-ready methods/results writing
|
|
188
|
+
- `method-design` -> analysis design refinement for neurological UKB studies
|
|
189
|
+
- `academic-research-hub` -> literature-backed design support and research grounding
|
|
190
|
+
- `smri-skill` -> raw structural MRI preprocessing before UKB-level tabular analysis
|
|
191
|
+
- `fmri-skill` -> raw functional MRI preprocessing before UKB-level tabular analysis
|
|
192
|
+
- `wmh-segmentation` -> WMH extraction before UKB-level association or prediction analysis
|
|
193
|
+
- `claw-shell` -> all concrete execution
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## Important Notes & Limitations
|
|
198
|
+
|
|
199
|
+
- This skill assumes that the user already has legal access to UK Biobank data and has already exported or derived the needed local analysis files.
|
|
200
|
+
- This skill does not define fixed UKB field IDs because field selection differs across studies and exports.
|
|
201
|
+
- This skill should not guess disease definitions, date columns, or censoring rules when they are not provided.
|
|
202
|
+
- Sensitivity analysis should be framed as filtered-data reruns of the same main model, not as unrelated new pipelines.
|
|
203
|
+
- If multiple candidate outcomes or feature tables exist, the skill should first ask which one is primary before execution.
|
|
204
|
+
- This skill is intended for research workflows and not for clinical decision-making.
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## Default Response Pattern
|
|
209
|
+
|
|
210
|
+
When this skill is triggered, the response should:
|
|
211
|
+
1. Restate the exact UK Biobank brain-related analysis goal.
|
|
212
|
+
2. State that the skill assumes local data is already available and does not cover downloading.
|
|
213
|
+
3. List the minimum required columns or files.
|
|
214
|
+
4. Provide a numbered execution plan.
|
|
215
|
+
5. State which NeuroClaw skills will be delegated to.
|
|
216
|
+
6. Wait for confirmation before execution.
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
## Companion Scripts
|
|
221
|
+
|
|
222
|
+
Adapted from [UKBAnalytica_v2](https://github.com/Hinna0818/UKBAnalytica_v2) (Nan He, Southern Medical University).
|
|
223
|
+
|
|
224
|
+
### `scripts/extract_ukb_phenotype.py`
|
|
225
|
+
|
|
226
|
+
Extract and preprocess UKB phenotype data with automatic field ID mapping.
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
python skills/ukb-skill/scripts/extract_ukb_phenotype.py \
|
|
230
|
+
--input ukb_raw.csv --output phenotype.csv
|
|
231
|
+
|
|
232
|
+
python skills/ukb-skill/scripts/extract_ukb_phenotype.py \
|
|
233
|
+
--input ukb_raw.csv --variables sex,age,bmi,smoking,townsend --output covariates.csv
|
|
234
|
+
|
|
235
|
+
python skills/ukb-skill/scripts/extract_ukb_phenotype.py --list-variables
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
Features:
|
|
239
|
+
- 50+ predefined UKB field ID mappings (demographics, lifestyle, biomarkers, brain IDPs, cognition)
|
|
240
|
+
- Automatic preprocessing: invalid code removal, variable-specific recoding
|
|
241
|
+
- Custom variable mapping via JSON
|
|
242
|
+
- Lists all available variables with `--list-variables`
|
|
243
|
+
|
|
244
|
+
### `scripts/extract_ukb_cases.py`
|
|
245
|
+
|
|
246
|
+
Extract brain-related disease cases using ICD-10/ICD-9 codes.
|
|
247
|
+
|
|
248
|
+
```bash
|
|
249
|
+
python skills/ukb-skill/scripts/extract_ukb_cases.py \
|
|
250
|
+
--input ukb_raw.csv --disease dementia --output dementia_cases.csv
|
|
251
|
+
|
|
252
|
+
python skills/ukb-skill/scripts/extract_ukb_cases.py \
|
|
253
|
+
--input ukb_raw.csv --custom-icd G20 --output custom_cases.csv
|
|
254
|
+
|
|
255
|
+
python skills/ukb-skill/scripts/extract_ukb_cases.py --list-diseases
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
Features:
|
|
259
|
+
- 15 predefined brain-related disease definitions (dementia, Alzheimer's, stroke, Parkinson's, MS, epilepsy, depression, anxiety, schizophrenia, bipolar, brain tumour, TBI)
|
|
260
|
+
- Multi-source ascertainment: ICD-10, ICD-9, Death register
|
|
261
|
+
- Custom ICD-10 pattern support
|
|
262
|
+
- Prevalence statistics per disease
|
|
263
|
+
|
|
264
|
+
### `scripts/build_ukb_survival.py`
|
|
265
|
+
|
|
266
|
+
Build survival analysis datasets with prevalent/incident case separation.
|
|
267
|
+
|
|
268
|
+
```bash
|
|
269
|
+
python skills/ukb-skill/scripts/build_ukb_survival.py \
|
|
270
|
+
--input ukb_raw.csv --disease dementia --output survival.csv
|
|
271
|
+
|
|
272
|
+
python skills/ukb-skill/scripts/build_ukb_survival.py \
|
|
273
|
+
--input ukb_raw.csv --disease stroke --censor-date 2023-10-31 --output stroke_survival.csv
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
Features:
|
|
277
|
+
- Follow-up time calculation (years from baseline)
|
|
278
|
+
- Prevalent vs incident case separation
|
|
279
|
+
- Censoring at death or administrative censor date
|
|
280
|
+
- Compatible with Cox regression in downstream analysis
|
|
281
|
+
|
|
282
|
+
### `scripts/ukb_qc_summary.py`
|
|
283
|
+
|
|
284
|
+
Generate per-subject QC summaries for brain-related UKB data.
|
|
285
|
+
|
|
286
|
+
```bash
|
|
287
|
+
python skills/ukb-skill/scripts/ukb_qc_summary.py \
|
|
288
|
+
--input ukb_raw.csv --output qc_summary.csv
|
|
289
|
+
|
|
290
|
+
python skills/ukb-skill/scripts/ukb_qc_summary.py \
|
|
291
|
+
--input ukb_raw.csv --imaging-check --age-min 45 --age-max 80 --output qc_imaging.csv
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
Features:
|
|
295
|
+
- Covariate completeness check
|
|
296
|
+
- Brain imaging availability (T1w, FLAIR, dMRI, rs-fMRI IDPs)
|
|
297
|
+
- Age range filtering
|
|
298
|
+
- Per-subject QC pass/fail flag
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
302
|
+
## Reference
|
|
303
|
+
|
|
304
|
+
Companion scripts adapted from [UKBAnalytica_v2](https://github.com/Hinna0818/UKBAnalytica_v2) by Nan He (Southern Medical University). SKILL.md analysis design narrowed to brain-focused UK Biobank research.
|
|
305
|
+
|
|
306
|
+
Custom NeuroClaw skill.
|
|
307
|
+
|
|
308
|
+
Created At: 2026-04-20 15:47 HKT
|
|
309
|
+
Last Updated At: 2026-05-06 15:12 HKT
|
|
310
|
+
Author: chengwang96
|