@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,136 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Extract and merge PNC phenotype data.
|
|
3
|
+
|
|
4
|
+
Reads PNC phenotype files (cognitive battery, psychiatric, demographics)
|
|
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", "bblid"],
|
|
15
|
+
"age": ["age", "Age", "age_at_scan"],
|
|
16
|
+
"sex": ["sex", "Sex", "Gender"],
|
|
17
|
+
"race": ["race", "Race"],
|
|
18
|
+
"ethnicity": ["ethnicity", "Ethnicity"],
|
|
19
|
+
"handedness": ["handedness", "Handedness"],
|
|
20
|
+
# Psychiatric
|
|
21
|
+
"goassess_diag": ["goassess_diag", "DX", "diagnosis"],
|
|
22
|
+
"goassess_diag_detail": ["goassess_diag_detail", "DX_detail"],
|
|
23
|
+
"psychosis_yn": ["psychosis_yn", "Psychosis"],
|
|
24
|
+
# Cognitive (Penn CNB)
|
|
25
|
+
"cpf_correct": ["CPF_correct", "cpf_correct"],
|
|
26
|
+
"cpt_correct": ["CPT_correct", "cpt_correct"],
|
|
27
|
+
"lt_correct": ["LT_correct", "lt_correct"],
|
|
28
|
+
"pmat_correct": ["PMAT_correct", "pmat_correct"],
|
|
29
|
+
"wrat_standard": ["WRAT_standard", "wrat_standard"],
|
|
30
|
+
"tap_correct": ["TAP_correct", "tap_correct"],
|
|
31
|
+
"er40_correct": ["ER40_correct", "er40_correct"],
|
|
32
|
+
"pvrt_correct": ["PVRT_correct", "pvrt_correct"],
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def load_csv(path: Path) -> List[Dict[str, str]]:
|
|
37
|
+
delimiter = "\t" if path.suffix == ".tsv" else ","
|
|
38
|
+
with open(path, "r", encoding="utf-8") as f:
|
|
39
|
+
reader = csv.DictReader(f, delimiter=delimiter)
|
|
40
|
+
return list(reader)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def find_column(row: Dict[str, str], candidates: List[str]) -> Optional[str]:
|
|
44
|
+
for col in candidates:
|
|
45
|
+
if col in row:
|
|
46
|
+
return col
|
|
47
|
+
return None
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def extract_phenotype(
|
|
51
|
+
phenotype_files: List[Path],
|
|
52
|
+
imaging_ids: Optional[List[str]] = None,
|
|
53
|
+
columns: Optional[List[str]] = None,
|
|
54
|
+
) -> List[Dict[str, str]]:
|
|
55
|
+
all_data = []
|
|
56
|
+
for fpath in phenotype_files:
|
|
57
|
+
rows = load_csv(fpath)
|
|
58
|
+
all_data.extend(rows)
|
|
59
|
+
|
|
60
|
+
if not all_data:
|
|
61
|
+
return []
|
|
62
|
+
|
|
63
|
+
target_columns = columns if columns else list(COLUMN_MAP.keys())
|
|
64
|
+
merged = {}
|
|
65
|
+
|
|
66
|
+
for row in all_data:
|
|
67
|
+
subj_col = find_column(row, COLUMN_MAP["subject_id"])
|
|
68
|
+
if subj_col is None:
|
|
69
|
+
continue
|
|
70
|
+
subj_id = row[subj_col].strip()
|
|
71
|
+
if not subj_id:
|
|
72
|
+
continue
|
|
73
|
+
|
|
74
|
+
if subj_id not in merged:
|
|
75
|
+
merged[subj_id] = {"subject_id": subj_id}
|
|
76
|
+
|
|
77
|
+
for target_col in target_columns:
|
|
78
|
+
if target_col == "subject_id":
|
|
79
|
+
continue
|
|
80
|
+
if target_col in merged[subj_id] and merged[subj_id][target_col]:
|
|
81
|
+
continue
|
|
82
|
+
candidates = COLUMN_MAP.get(target_col, [target_col])
|
|
83
|
+
src_col = find_column(row, candidates)
|
|
84
|
+
if src_col and row.get(src_col, "").strip():
|
|
85
|
+
merged[subj_id][target_col] = row[src_col].strip()
|
|
86
|
+
|
|
87
|
+
result = list(merged.values())
|
|
88
|
+
if imaging_ids:
|
|
89
|
+
imaging_set = set(imaging_ids)
|
|
90
|
+
result = [r for r in result if r["subject_id"] in imaging_set]
|
|
91
|
+
return result
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def main() -> int:
|
|
95
|
+
parser = argparse.ArgumentParser(description="Extract PNC phenotype data.")
|
|
96
|
+
parser.add_argument("--phenotype-files", required=True, nargs="+")
|
|
97
|
+
parser.add_argument("--output", required=True)
|
|
98
|
+
parser.add_argument("--imaging-ids")
|
|
99
|
+
parser.add_argument("--columns")
|
|
100
|
+
args = parser.parse_args()
|
|
101
|
+
|
|
102
|
+
phenotype_files = [Path(f).resolve() for f in args.phenotype_files]
|
|
103
|
+
for f in phenotype_files:
|
|
104
|
+
if not f.exists():
|
|
105
|
+
print(f"File not found: {f}", file=sys.stderr)
|
|
106
|
+
return 1
|
|
107
|
+
|
|
108
|
+
imaging_ids = None
|
|
109
|
+
if args.imaging_ids:
|
|
110
|
+
id_file = Path(args.imaging_ids).resolve()
|
|
111
|
+
if id_file.exists():
|
|
112
|
+
imaging_ids = [l.strip() for l in id_file.read_text().splitlines() if l.strip()]
|
|
113
|
+
|
|
114
|
+
columns = None
|
|
115
|
+
if args.columns:
|
|
116
|
+
columns = [c.strip() for c in args.columns.split(",")]
|
|
117
|
+
|
|
118
|
+
merged = extract_phenotype(phenotype_files, imaging_ids, columns)
|
|
119
|
+
if not merged:
|
|
120
|
+
print("[ERROR] No phenotype data extracted.", file=sys.stderr)
|
|
121
|
+
return 1
|
|
122
|
+
|
|
123
|
+
output_path = Path(args.output).resolve()
|
|
124
|
+
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
125
|
+
fieldnames = list(merged[0].keys())
|
|
126
|
+
with open(output_path, "w", newline="", encoding="utf-8") as f:
|
|
127
|
+
writer = csv.DictWriter(f, fieldnames=fieldnames)
|
|
128
|
+
writer.writeheader()
|
|
129
|
+
writer.writerows(merged)
|
|
130
|
+
|
|
131
|
+
print(f"Phenotype: {len(merged)} subjects, {len(fieldnames)} columns -> {output_path}")
|
|
132
|
+
return 0
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
if __name__ == "__main__":
|
|
136
|
+
sys.exit(main())
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Generate per-subject QC summaries for PNC processing.
|
|
3
|
+
|
|
4
|
+
Pediatric-specific: uses higher FD threshold (0.4mm) for developmental data.
|
|
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.4) -> 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 PNC 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.4,
|
|
41
|
+
help="FD threshold (default: 0.4mm, higher for pediatric)")
|
|
42
|
+
parser.add_argument("--phenotype-file", help="CSV with age/diagnosis info")
|
|
43
|
+
args = parser.parse_args()
|
|
44
|
+
|
|
45
|
+
output_path = Path(args.output).resolve()
|
|
46
|
+
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
47
|
+
|
|
48
|
+
phenotype_map = {}
|
|
49
|
+
if args.phenotype_file:
|
|
50
|
+
pheno_path = Path(args.phenotype_file).resolve()
|
|
51
|
+
if pheno_path.exists():
|
|
52
|
+
with open(pheno_path, "r", encoding="utf-8") as f:
|
|
53
|
+
reader = csv.DictReader(f)
|
|
54
|
+
for row in reader:
|
|
55
|
+
subj = row.get("subject_id") or row.get("Subject", "")
|
|
56
|
+
if subj:
|
|
57
|
+
phenotype_map[subj] = row
|
|
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
|
+
|
|
76
|
+
if subj in phenotype_map:
|
|
77
|
+
pheno = phenotype_map[subj]
|
|
78
|
+
if "age" in pheno:
|
|
79
|
+
metrics["age"] = pheno["age"]
|
|
80
|
+
if "goassess_diag" in pheno:
|
|
81
|
+
metrics["diagnosis"] = pheno["goassess_diag"]
|
|
82
|
+
|
|
83
|
+
if args.fmriprep_dir:
|
|
84
|
+
confounds_files = list(Path(args.fmriprep_dir).glob(f"{subj}/func/*_desc-confounds_timeseries.tsv"))
|
|
85
|
+
if confounds_files:
|
|
86
|
+
metrics.update(load_confounds(confounds_files[0]))
|
|
87
|
+
|
|
88
|
+
exclusion_reasons = check_exclusion(metrics, args.fd_threshold)
|
|
89
|
+
metrics["excluded"] = len(exclusion_reasons) > 0
|
|
90
|
+
metrics["exclusion_reasons"] = "; ".join(exclusion_reasons)
|
|
91
|
+
|
|
92
|
+
results.append(metrics)
|
|
93
|
+
if exclusion_reasons:
|
|
94
|
+
excluded.append({"subject_id": subj, "reasons": "; ".join(exclusion_reasons)})
|
|
95
|
+
|
|
96
|
+
if results:
|
|
97
|
+
fieldnames = list(results[0].keys())
|
|
98
|
+
with open(output_path, "w", newline="", encoding="utf-8") as f:
|
|
99
|
+
writer = csv.DictWriter(f, fieldnames=fieldnames)
|
|
100
|
+
writer.writeheader()
|
|
101
|
+
writer.writerows(results)
|
|
102
|
+
print(f"QC: {len(results)} subjects, {len(excluded)} excluded -> {output_path}")
|
|
103
|
+
|
|
104
|
+
if args.exclude_output and excluded:
|
|
105
|
+
exclude_path = Path(args.exclude_output).resolve()
|
|
106
|
+
exclude_path.parent.mkdir(parents=True, exist_ok=True)
|
|
107
|
+
with open(exclude_path, "w", newline="", encoding="utf-8") as f:
|
|
108
|
+
writer = csv.DictWriter(f, fieldnames=["subject_id", "reasons"])
|
|
109
|
+
writer.writeheader()
|
|
110
|
+
writer.writerows(excluded)
|
|
111
|
+
|
|
112
|
+
return 0
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
if __name__ == "__main__":
|
|
116
|
+
sys.exit(main())
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Validate PNC 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 = ["rest", "gonogo", "emotion", "lineorientation", "wordmemory"]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def validate_subject(subject_dir: Path) -> Dict[str, any]:
|
|
16
|
+
report = {
|
|
17
|
+
"subject": subject_dir.name,
|
|
18
|
+
"anat_complete": False,
|
|
19
|
+
"rs_fMRI_present": False,
|
|
20
|
+
"task_fMRI_present": False,
|
|
21
|
+
"dwi_present": False,
|
|
22
|
+
"n_task_runs": 0,
|
|
23
|
+
"tasks_found": [],
|
|
24
|
+
"missing_files": [],
|
|
25
|
+
"warnings": [],
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
# Check anat
|
|
29
|
+
anat_dir = subject_dir / "anat"
|
|
30
|
+
if anat_dir.exists():
|
|
31
|
+
t1w_files = list(anat_dir.glob("*_T1w.nii.gz"))
|
|
32
|
+
report["anat_complete"] = len(t1w_files) > 0
|
|
33
|
+
if not t1w_files:
|
|
34
|
+
report["missing_files"].append("anat/*_T1w.nii.gz")
|
|
35
|
+
else:
|
|
36
|
+
report["missing_files"].append("anat/")
|
|
37
|
+
|
|
38
|
+
# Check func
|
|
39
|
+
func_dir = subject_dir / "func"
|
|
40
|
+
if func_dir.exists():
|
|
41
|
+
bold_files = list(func_dir.glob("*_bold.nii.gz"))
|
|
42
|
+
report["n_task_runs"] = len(bold_files)
|
|
43
|
+
|
|
44
|
+
tasks_found = set()
|
|
45
|
+
for f in bold_files:
|
|
46
|
+
name = f.name
|
|
47
|
+
for task in EXPECTED_TASKS:
|
|
48
|
+
if f"task-{task}" in name:
|
|
49
|
+
tasks_found.add(task)
|
|
50
|
+
report["tasks_found"] = sorted(tasks_found)
|
|
51
|
+
report["rs_fMRI_present"] = "rest" in tasks_found
|
|
52
|
+
report["task_fMRI_present"] = len(tasks_found - {"rest"}) > 0
|
|
53
|
+
else:
|
|
54
|
+
report["missing_files"].append("func/")
|
|
55
|
+
|
|
56
|
+
# Check dwi
|
|
57
|
+
dwi_dir = subject_dir / "dwi"
|
|
58
|
+
if dwi_dir.exists():
|
|
59
|
+
dwi_files = list(dwi_dir.glob("*_dwi.nii.gz"))
|
|
60
|
+
report["dwi_present"] = len(dwi_files) > 0
|
|
61
|
+
else:
|
|
62
|
+
report["warnings"].append("No dwi directory")
|
|
63
|
+
|
|
64
|
+
return report
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def main() -> int:
|
|
68
|
+
parser = argparse.ArgumentParser(description="Validate PNC BIDS structure.")
|
|
69
|
+
parser.add_argument("--input", required=True)
|
|
70
|
+
parser.add_argument("--output", required=True)
|
|
71
|
+
args = parser.parse_args()
|
|
72
|
+
|
|
73
|
+
input_dir = Path(args.input).resolve()
|
|
74
|
+
if not input_dir.exists():
|
|
75
|
+
print(f"Input directory not found: {input_dir}", file=sys.stderr)
|
|
76
|
+
return 1
|
|
77
|
+
|
|
78
|
+
subjects = sorted([d for d in input_dir.glob("sub-*") if d.is_dir()])
|
|
79
|
+
print(f"Found {len(subjects)} subjects in {input_dir}")
|
|
80
|
+
|
|
81
|
+
if not subjects:
|
|
82
|
+
print("[ERROR] No subjects found.", file=sys.stderr)
|
|
83
|
+
return 1
|
|
84
|
+
|
|
85
|
+
results = []
|
|
86
|
+
for sub_dir in subjects:
|
|
87
|
+
report = validate_subject(sub_dir)
|
|
88
|
+
results.append(report)
|
|
89
|
+
|
|
90
|
+
output_path = Path(args.output).resolve()
|
|
91
|
+
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
92
|
+
|
|
93
|
+
fieldnames = [
|
|
94
|
+
"subject", "anat_complete", "rs_fMRI_present", "task_fMRI_present",
|
|
95
|
+
"dwi_present", "n_task_runs", "tasks_found", "missing_files", "warnings",
|
|
96
|
+
]
|
|
97
|
+
with open(output_path, "w", newline="", encoding="utf-8") as f:
|
|
98
|
+
writer = csv.DictWriter(f, fieldnames=fieldnames)
|
|
99
|
+
writer.writeheader()
|
|
100
|
+
for r in results:
|
|
101
|
+
r["tasks_found"] = "; ".join(r["tasks_found"])
|
|
102
|
+
r["missing_files"] = "; ".join(r["missing_files"])
|
|
103
|
+
r["warnings"] = "; ".join(r["warnings"])
|
|
104
|
+
writer.writerow(r)
|
|
105
|
+
|
|
106
|
+
complete = sum(1 for r in results if r["anat_complete"] and r["rs_fMRI_present"])
|
|
107
|
+
print(f"\nValidation Summary:")
|
|
108
|
+
print(f" Total subjects: {len(results)}")
|
|
109
|
+
print(f" Complete (anat + rs-fMRI): {complete}")
|
|
110
|
+
print(f" With T1w: {sum(1 for r in results if r['anat_complete'])}")
|
|
111
|
+
print(f" With rs-fMRI: {sum(1 for r in results if r['rs_fMRI_present'])}")
|
|
112
|
+
print(f" With task-fMRI: {sum(1 for r in results if r['task_fMRI_present'])}")
|
|
113
|
+
print(f" With dMRI: {sum(1 for r in results if r['dwi_present'])}")
|
|
114
|
+
print(f" Output: {output_path}")
|
|
115
|
+
|
|
116
|
+
return 0
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
if __name__ == "__main__":
|
|
120
|
+
sys.exit(main())
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ppmi-skill
|
|
3
|
+
description: "Use this skill whenever the user wants an end-to-end workflow for the Parkinson's Progression Markers Initiative (PPMI) dataset, including BIDS validation, multimodal processing of sMRI, rs-fMRI, and dMRI, phenotype extraction, and QC integration. Triggers include: 'PPMI', 'Parkinson', 'Parkinson disease', 'process PPMI data', 'PPMI fMRI', or any request to run the PPMI multimodal pipeline."
|
|
4
|
+
license: MIT License (NeuroClaw custom skill - freely modifiable within the project)
|
|
5
|
+
layer: subagent
|
|
6
|
+
skill_type: dataset
|
|
7
|
+
dependencies:
|
|
8
|
+
- smri-skill
|
|
9
|
+
- fmri-skill
|
|
10
|
+
- dwi-skill
|
|
11
|
+
- bids-organizer
|
|
12
|
+
- claw-shell
|
|
13
|
+
complementary_skills:
|
|
14
|
+
- brain-visualization
|
|
15
|
+
- pet-skill
|
|
16
|
+
---
|
|
17
|
+
# PPMI Skill (Dataset-Orchestration Layer)
|
|
18
|
+
|
|
19
|
+
## Overview
|
|
20
|
+
|
|
21
|
+
`ppmi-skill` is the NeuroClaw orchestration skill for the **Parkinson's Progression Markers Initiative (PPMI)** dataset, launched by The Michael J. Fox Foundation.
|
|
22
|
+
|
|
23
|
+
It strictly follows the NeuroClaw hierarchical design principles:
|
|
24
|
+
- This skill **only describes WHAT needs to be done** and **which tool skill to delegate to**.
|
|
25
|
+
- It contains **no implementation code or concrete commands**.
|
|
26
|
+
- All concrete execution is delegated to existing base/tool skills via `claw-shell`.
|
|
27
|
+
- Companion scripts in `scripts/` provide reference implementations for BIDS validation, phenotype extraction, and QC.
|
|
28
|
+
|
|
29
|
+
**Core workflow (never bypassed):**
|
|
30
|
+
1. Identify input PPMI data and target modalities.
|
|
31
|
+
2. Generate a **numbered execution plan** clearly stating WHAT needs to be done and which tool skill will handle each step.
|
|
32
|
+
3. Present the full plan, estimated runtime, resource requirements, and risks to the user and wait for explicit confirmation ("YES" / "execute" / "proceed").
|
|
33
|
+
4. On confirmation, delegate every step to the appropriate skill via `claw-shell`.
|
|
34
|
+
5. After execution, save all outputs in a clean directory structure (`ppmi_output/`).
|
|
35
|
+
|
|
36
|
+
**Research use only.**
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Quick Reference
|
|
41
|
+
|
|
42
|
+
| Task | What needs to be done | Delegate to | Expected output |
|
|
43
|
+
|---|---|---|---|
|
|
44
|
+
| BIDS validation | Validate PPMI BIDS structure | `scripts/validate_ppmi.py` | Validation report |
|
|
45
|
+
| sMRI processing | Brain extraction, tissue segmentation | `smri-skill` | `smri_output/` derivatives |
|
|
46
|
+
| rs-fMRI processing | Preprocessing, denoising, connectivity | `fmri-skill` | `fmri_output/` connectivity |
|
|
47
|
+
| dMRI processing | Diffusion preprocessing, tensor metrics | `dwi-skill` | `dwi_output/` metrics |
|
|
48
|
+
| Phenotype extraction | Motor scores, cognitive, biomarkers | `scripts/extract_ppmi_phenotype.py` | Merged phenotype CSV |
|
|
49
|
+
| QC summary | Per-subject quality control | `scripts/ppmi_qc_summary.py` | QC summary + exclusion list |
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## Dataset Characteristics
|
|
54
|
+
|
|
55
|
+
- **Cohort**: ~2,000+ participants
|
|
56
|
+
- **PD patients**: Parkinson's disease (early stage, drug-naive)
|
|
57
|
+
- **Prodromal**: REM sleep behavior disorder, hyposmia
|
|
58
|
+
- **Healthy controls**: Age-matched
|
|
59
|
+
- **Scanner**: 3T Siemens (multi-site)
|
|
60
|
+
- **Modalities**: T1w sMRI, rs-fMRI, dMRI/DTI, DaTscan SPECT
|
|
61
|
+
- **Clinical**: MDS-UPDRS, MoCA, UPSIT, REM sleep, DAT imaging
|
|
62
|
+
- **Access**: LONI IDA (ida.loni.usc.edu), PPMI data portal
|
|
63
|
+
- **Format**: BIDS-compliant (community conversion)
|
|
64
|
+
- **Reference**: Marek et al. (2011), Lancet Neurology
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Supported Modalities
|
|
69
|
+
|
|
70
|
+
| Modality | Description | Details |
|
|
71
|
+
|---|---|---|
|
|
72
|
+
| T1w | High-resolution structural MRI | 1mm isotropic, substantia nigra volumetry |
|
|
73
|
+
| rs-fMRI | Resting-state functional MRI | Basal ganglia connectivity |
|
|
74
|
+
| dMRI | Diffusion-weighted imaging | DTI, nigrostriatal tract integrity |
|
|
75
|
+
| DaTscan | SPECT dopamine transporter | Striatal binding ratios |
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## PPMI Clinical Measures
|
|
80
|
+
|
|
81
|
+
| Measure | Description | Domain |
|
|
82
|
+
|---|---|---|
|
|
83
|
+
| MDS-UPDRS | Movement Disorder Society Unified PD Rating Scale | Motor function |
|
|
84
|
+
| MoCA | Montreal Cognitive Assessment | Global cognition |
|
|
85
|
+
| UPSIT | University of Pennsylvania Smell Identification Test | Olfaction |
|
|
86
|
+
| RBD | REM Sleep Behavior Disorder screening | Sleep |
|
|
87
|
+
| H&Y | Hoehn and Yahr staging | Disease stage |
|
|
88
|
+
| DAT | Dopamine transporter binding (SPECT) | Dopaminergic function |
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## BIDS Preparation
|
|
93
|
+
|
|
94
|
+
### Script: `scripts/validate_ppmi.py`
|
|
95
|
+
|
|
96
|
+
Validates PPMI BIDS structure and generates a compliance report.
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
python skills/ppmi-skill/scripts/validate_ppmi.py \
|
|
100
|
+
--input /path/to/PPMI/bids \
|
|
101
|
+
--output /path/to/ppmi_output/qc/bids_validation.csv
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Features:
|
|
105
|
+
- BIDS directory structure validation
|
|
106
|
+
- Diagnostic group completeness (PD, prodromal, control)
|
|
107
|
+
- Modality completeness (T1w, rs-fMRI, dMRI)
|
|
108
|
+
- Clinical measure availability check
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Core Workflow (Never Bypassed)
|
|
113
|
+
|
|
114
|
+
1. Identify user target: full PPMI processing, imaging subset, phenotype extraction, or BIDS validation only.
|
|
115
|
+
2. Generate a numbered plan with tools, outputs, runtime, storage, and risks.
|
|
116
|
+
3. Wait for explicit confirmation (`YES` / `execute` / `proceed`).
|
|
117
|
+
4. On confirmation, run BIDS validation using `scripts/validate_ppmi.py`.
|
|
118
|
+
5. Delegate to `smri-skill` for structural MRI processing.
|
|
119
|
+
6. Delegate to `fmri-skill` for rs-fMRI processing.
|
|
120
|
+
7. Delegate to `dwi-skill` for dMRI processing.
|
|
121
|
+
8. If phenotype extraction is requested, run `scripts/extract_ppmi_phenotype.py`.
|
|
122
|
+
9. If QC summary is requested, run `scripts/ppmi_qc_summary.py`.
|
|
123
|
+
10. Save outputs into `ppmi_output/`.
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Modality Processing Delegation
|
|
128
|
+
|
|
129
|
+
| Modality | Delegated skill | Typical tasks | Main outputs |
|
|
130
|
+
|---|---|---|---|
|
|
131
|
+
| sMRI (T1w) | `smri-skill` | brain extraction, tissue segmentation | `smri_output/` derivatives |
|
|
132
|
+
| rs-fMRI | `fmri-skill` | preprocessing, denoising, connectivity | `fmri_output/` connectivity |
|
|
133
|
+
| dMRI | `dwi-skill` | diffusion preprocessing, tensor metrics | `dwi_output/` metrics |
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## Standard Output Layout
|
|
138
|
+
|
|
139
|
+
```
|
|
140
|
+
ppmi_output/
|
|
141
|
+
├── bids/ # BIDS-staged data (or validation report)
|
|
142
|
+
├── smri/ # Structural MRI derivatives
|
|
143
|
+
├── fmri/ # Functional MRI derivatives (rs-fMRI connectivity)
|
|
144
|
+
├── dwi/ # Diffusion MRI derivatives (DTI metrics)
|
|
145
|
+
├── phenotype/ # Merged phenotype tables (motor, cognitive, biomarkers)
|
|
146
|
+
├── qc/ # QC summaries and exclusion lists
|
|
147
|
+
└── logs/ # Processing logs
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## Benchmark Adapter Guidance
|
|
153
|
+
|
|
154
|
+
For benchmark-style prompts, do not force the full orchestration when the task only asks for local PPMI data validation.
|
|
155
|
+
|
|
156
|
+
- If the task starts from PPMI data already present on disk and only asks for BIDS validation:
|
|
157
|
+
- Skip the download stage
|
|
158
|
+
- Default to the narrow path `local PPMI discovery -> BIDS validation -> report`
|
|
159
|
+
- In benchmark mode, do not require explicit confirmation before presenting the validation solution.
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## Safety and Execution Policy
|
|
164
|
+
- No execution before explicit plan confirmation.
|
|
165
|
+
- All execution must be routed via `claw-shell`.
|
|
166
|
+
- Missing dependencies must be resolved by `dependency-planner` before running.
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## Important Notes and Limitations
|
|
171
|
+
- PPMI is a multi-site study; site effects should be modeled in group analyses.
|
|
172
|
+
- Early-stage PD patients are often drug-naive, which is valuable for studying untreated disease.
|
|
173
|
+
- DaTscan SPECT provides dopaminergic imaging but may not follow standard BIDS conventions.
|
|
174
|
+
- Longitudinal design enables progression modeling.
|
|
175
|
+
- Large sample size and rich clinical phenotyping make PPMI ideal for biomarker discovery.
|
|
176
|
+
- `ppmi-skill` is orchestration-only; detailed preprocessing logic remains in modality skills.
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## When to Call This Skill
|
|
181
|
+
- User asks for end-to-end PPMI workflow.
|
|
182
|
+
- User asks to process PPMI neuroimaging data.
|
|
183
|
+
- User needs BIDS validation for PPMI data.
|
|
184
|
+
- User asks to extract PPMI phenotype data (MDS-UPDRS, MoCA, DAT).
|
|
185
|
+
- User asks for Parkinson's disease neuroimaging analysis.
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## Complementary / Related Skills
|
|
190
|
+
- `smri-skill` → structural MRI preprocessing
|
|
191
|
+
- `fmri-skill` → functional MRI preprocessing and analysis
|
|
192
|
+
- `dwi-skill` → diffusion MRI preprocessing
|
|
193
|
+
- `pet-skill` → PET imaging (if available)
|
|
194
|
+
- `bids-organizer` → BIDS validation and organization
|
|
195
|
+
- `brain-visualization` → visualization of derivatives
|
|
196
|
+
- `dependency-planner` → dependency resolution
|
|
197
|
+
- `conda-env-manager` → environment management
|
|
198
|
+
- `claw-shell` → command execution
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## Reference
|
|
203
|
+
- PPMI: https://www.ppmi-info.org/
|
|
204
|
+
- Marek et al. (2011): The Parkinson Progression Marker Initiative (PPMI). Lancet Neurology.
|
|
205
|
+
- LONI IDA: https://ida.loni.usc.edu/
|
|
206
|
+
|
|
207
|
+
Created At: 2026-05-06 13:55 HKT
|
|
208
|
+
Last Updated At: 2026-05-06 13:55 HKT
|
|
209
|
+
Author: chengwang96
|