@brainpilot/skills 0.0.6 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/skills/01_Meta-Skills/academic-research-hub/SKILL.md +108 -0
- package/skills/01_Meta-Skills/academic-research-hub/scripts/requirements.txt +17 -0
- package/skills/01_Meta-Skills/academic-research-hub/scripts/research.py +781 -0
- package/skills/01_Meta-Skills/beautiful-log/SKILL.md +64 -0
- package/skills/01_Meta-Skills/beautiful-log/scripts/beautiful_log.py +274 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/SKILL.md +130 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/assets/config.template.yaml +54 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/assets/top5_digest_template.md +5 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/build_top5_digest.py +300 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/common.py +137 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/merge_results.py +106 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/run_pipeline.py +177 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/search_arxiv.py +162 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/search_pubmed.py +202 -0
- package/skills/01_Meta-Skills/ethoclaw-normalize-tabular/SKILL.md +173 -0
- package/skills/01_Meta-Skills/ethoclaw-normalize-tabular/scripts/normalize_data.py +874 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/SKILL.md +134 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/references/confirmation-prompts.md +31 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/references/output-patterns.md +45 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/build_markdown_deliverables.py +41 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/build_research_log.py +84 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/build_summary_md.py +63 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/extract_pdf_bundle.py +140 -0
- package/skills/01_Meta-Skills/experiment-controller/SKILL.md +140 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/SKILL.md +366 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/entity_resolution.py +120 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/extraction_prompt_template.txt +19 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/graph_query.py +106 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/hypothesis_cli_reference.py +42 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/new_data_source_template.py +116 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/requirements.txt +15 -0
- package/skills/01_Meta-Skills/method-design/SKILL.md +61 -0
- package/skills/01_Meta-Skills/multi-search-engine/SKILL.md +119 -0
- package/skills/01_Meta-Skills/research-idea/SKILL.md +65 -0
- package/skills/05_EEG_ERP/eeg-skill/SKILL.md +197 -0
- package/skills/05_EEG_ERP/meg-skill/SKILL.md +188 -0
- package/skills/05_EEG_ERP/meg-skill/scripts/time_frequency.py +223 -0
- package/skills/05_EEG_ERP/mne-eeg-tool/SKILL.md +165 -0
- package/skills/05_EEG_ERP/mne-eeg-tool/scripts/eeg_pipeline_reference.py +231 -0
- package/skills/05_EEG_ERP/seed-iv-skill/SKILL.md +184 -0
- package/skills/05_EEG_ERP/seed-iv-skill/scripts/classify_seed_iv.py +154 -0
- package/skills/05_EEG_ERP/seed-iv-skill/scripts/extract_seed_iv_features.py +190 -0
- package/skills/05_EEG_ERP/seed-iv-skill/scripts/validate_seed_iv.py +102 -0
- package/skills/05_EEG_ERP/seed-vig-skill/SKILL.md +182 -0
- package/skills/05_EEG_ERP/seed-vig-skill/scripts/classify_seed_vig.py +165 -0
- package/skills/05_EEG_ERP/seed-vig-skill/scripts/extract_seed_vig_features.py +185 -0
- package/skills/05_EEG_ERP/seed-vig-skill/scripts/validate_seed_vig.py +88 -0
- package/skills/06_fMRI_Neuroimaging/abcd-skill/SKILL.md +308 -0
- package/skills/06_fMRI_Neuroimaging/abcd-skill/scripts/abcd_qc_summary.py +449 -0
- package/skills/06_fMRI_Neuroimaging/abcd-skill/scripts/extract_abcd_phenotype.py +292 -0
- package/skills/06_fMRI_Neuroimaging/abcd-skill/scripts/reorganize_abcd.py +387 -0
- package/skills/06_fMRI_Neuroimaging/abide-skill/SKILL.md +302 -0
- package/skills/06_fMRI_Neuroimaging/abide-skill/scripts/abide_qc_summary.py +317 -0
- package/skills/06_fMRI_Neuroimaging/abide-skill/scripts/extract_abide_phenotype.py +267 -0
- package/skills/06_fMRI_Neuroimaging/abide-skill/scripts/reorganize_abide.py +387 -0
- package/skills/06_fMRI_Neuroimaging/adhd200-skill/SKILL.md +244 -0
- package/skills/06_fMRI_Neuroimaging/adhd200-skill/scripts/adhd200_qc_summary.py +98 -0
- package/skills/06_fMRI_Neuroimaging/adhd200-skill/scripts/extract_adhd200_phenotype.py +134 -0
- package/skills/06_fMRI_Neuroimaging/adhd200-skill/scripts/reorganize_adhd200.py +206 -0
- package/skills/06_fMRI_Neuroimaging/adni-skill/SKILL.md +358 -0
- package/skills/06_fMRI_Neuroimaging/adni-skill/scripts/generate_adni_task_files.py +1305 -0
- package/skills/06_fMRI_Neuroimaging/adni-skill/scripts/generate_vqa_from_tasks.py +766 -0
- package/skills/06_fMRI_Neuroimaging/adni-skill/scripts/reorganize_adni.py +491 -0
- package/skills/06_fMRI_Neuroimaging/aibl-skill/SKILL.md +295 -0
- package/skills/06_fMRI_Neuroimaging/aibl-skill/scripts/aibl_qc_summary.py +260 -0
- package/skills/06_fMRI_Neuroimaging/aibl-skill/scripts/extract_aibl_phenotype.py +365 -0
- package/skills/06_fMRI_Neuroimaging/aibl-skill/scripts/reorganize_aibl.py +394 -0
- package/skills/06_fMRI_Neuroimaging/aomic-skill/SKILL.md +292 -0
- package/skills/06_fMRI_Neuroimaging/aomic-skill/scripts/aomic_qc_summary.py +258 -0
- package/skills/06_fMRI_Neuroimaging/aomic-skill/scripts/extract_aomic_phenotype.py +284 -0
- package/skills/06_fMRI_Neuroimaging/aomic-skill/scripts/reorganize_aomic.py +322 -0
- package/skills/06_fMRI_Neuroimaging/asl-skill/SKILL.md +168 -0
- package/skills/06_fMRI_Neuroimaging/asl-skill/scripts/compute_cbf.py +224 -0
- package/skills/06_fMRI_Neuroimaging/bids-organizer/SKILL.md +241 -0
- package/skills/06_fMRI_Neuroimaging/bold5000-skill/SKILL.md +186 -0
- package/skills/06_fMRI_Neuroimaging/bold5000-skill/scripts/bold5000_qc_summary.py +96 -0
- package/skills/06_fMRI_Neuroimaging/bold5000-skill/scripts/extract_bold5000_stimulus.py +125 -0
- package/skills/06_fMRI_Neuroimaging/bold5000-skill/scripts/reorganize_bold5000.py +102 -0
- package/skills/06_fMRI_Neuroimaging/camcan-skill/SKILL.md +213 -0
- package/skills/06_fMRI_Neuroimaging/camcan-skill/scripts/camcan_qc_summary.py +131 -0
- package/skills/06_fMRI_Neuroimaging/camcan-skill/scripts/extract_camcan_phenotype.py +145 -0
- package/skills/06_fMRI_Neuroimaging/camcan-skill/scripts/validate_camcan.py +141 -0
- package/skills/06_fMRI_Neuroimaging/cobre-skill/SKILL.md +201 -0
- package/skills/06_fMRI_Neuroimaging/cobre-skill/scripts/cobre_qc_summary.py +95 -0
- package/skills/06_fMRI_Neuroimaging/cobre-skill/scripts/extract_cobre_phenotype.py +104 -0
- package/skills/06_fMRI_Neuroimaging/cobre-skill/scripts/reorganize_cobre.py +140 -0
- package/skills/06_fMRI_Neuroimaging/conn-tool/SKILL.md +180 -0
- package/skills/06_fMRI_Neuroimaging/dcm2nii/SKILL.md +189 -0
- package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/SKILL.md +183 -0
- package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/scripts/dmt_har_med_qc_summary.py +96 -0
- package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/scripts/extract_dmt_har_med_phenotype.py +121 -0
- package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/scripts/reorganize_dmt_har_med.py +125 -0
- package/skills/06_fMRI_Neuroimaging/dwi-skill/SKILL.md +359 -0
- package/skills/06_fMRI_Neuroimaging/fmri-skill/SKILL.md +371 -0
- package/skills/06_fMRI_Neuroimaging/fmriprep-tool/SKILL.md +228 -0
- package/skills/06_fMRI_Neuroimaging/freesurfer-tool/SKILL.md +286 -0
- package/skills/06_fMRI_Neuroimaging/freesurfer-tool/scripts/freesurfer_processor.py +145 -0
- package/skills/06_fMRI_Neuroimaging/fsl-tool/SKILL.md +208 -0
- package/skills/06_fMRI_Neuroimaging/hbn-skill/SKILL.md +271 -0
- package/skills/06_fMRI_Neuroimaging/hbn-skill/scripts/extract_hbn_phenotype.py +107 -0
- package/skills/06_fMRI_Neuroimaging/hbn-skill/scripts/hbn_qc_summary.py +96 -0
- package/skills/06_fMRI_Neuroimaging/hbn-skill/scripts/reorganize_hbn.py +150 -0
- package/skills/06_fMRI_Neuroimaging/hcpa-skill/SKILL.md +210 -0
- package/skills/06_fMRI_Neuroimaging/hcpa-skill/scripts/extract_hcpa_phenotype.py +146 -0
- package/skills/06_fMRI_Neuroimaging/hcpa-skill/scripts/hcpa_qc_summary.py +120 -0
- package/skills/06_fMRI_Neuroimaging/hcpa-skill/scripts/reorganize_hcpa.py +155 -0
- package/skills/06_fMRI_Neuroimaging/hcpd-skill/SKILL.md +210 -0
- package/skills/06_fMRI_Neuroimaging/hcpd-skill/scripts/extract_hcpd_phenotype.py +148 -0
- package/skills/06_fMRI_Neuroimaging/hcpd-skill/scripts/hcpd_qc_summary.py +125 -0
- package/skills/06_fMRI_Neuroimaging/hcpd-skill/scripts/reorganize_hcpd.py +146 -0
- package/skills/06_fMRI_Neuroimaging/hcpep-skill/SKILL.md +215 -0
- package/skills/06_fMRI_Neuroimaging/hcpep-skill/scripts/extract_hcpep_phenotype.py +157 -0
- package/skills/06_fMRI_Neuroimaging/hcpep-skill/scripts/hcpep_qc_summary.py +143 -0
- package/skills/06_fMRI_Neuroimaging/hcpep-skill/scripts/reorganize_hcpep.py +146 -0
- package/skills/06_fMRI_Neuroimaging/hcppipeline-tool/SKILL.md +217 -0
- package/skills/06_fMRI_Neuroimaging/hcpya-skill/SKILL.md +214 -0
- package/skills/06_fMRI_Neuroimaging/hcpya-skill/scripts/extract_hcpya_phenotype.py +190 -0
- package/skills/06_fMRI_Neuroimaging/hcpya-skill/scripts/hcpya_qc_summary.py +152 -0
- package/skills/06_fMRI_Neuroimaging/hcpya-skill/scripts/reorganize_hcpya.py +203 -0
- package/skills/06_fMRI_Neuroimaging/ixi-skill/SKILL.md +198 -0
- package/skills/06_fMRI_Neuroimaging/ixi-skill/scripts/ixi_qc_summary.py +137 -0
- package/skills/06_fMRI_Neuroimaging/ixi-skill/scripts/reorganize_ixi.py +190 -0
- package/skills/06_fMRI_Neuroimaging/mnd-skill/SKILL.md +191 -0
- package/skills/06_fMRI_Neuroimaging/mnd-skill/scripts/extract_mnd_phenotype.py +143 -0
- package/skills/06_fMRI_Neuroimaging/mnd-skill/scripts/mnd_qc_summary.py +120 -0
- package/skills/06_fMRI_Neuroimaging/mnd-skill/scripts/validate_mnd.py +107 -0
- package/skills/06_fMRI_Neuroimaging/mschallenge-skill/SKILL.md +203 -0
- package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/analyze_lesions.py +119 -0
- package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/longitudinal_lesion.py +148 -0
- package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/mschallenge_qc_summary.py +132 -0
- package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/validate_mschallenge.py +116 -0
- package/skills/06_fMRI_Neuroimaging/nibabel-skill/SKILL.md +184 -0
- package/skills/06_fMRI_Neuroimaging/nibabel-skill/scripts/atlas_coordinate_reference.py +61 -0
- package/skills/06_fMRI_Neuroimaging/nibabel-skill/scripts/freesurfer_io_reference.py +34 -0
- package/skills/06_fMRI_Neuroimaging/nibabel-skill/scripts/nifti_inspection_reference.py +35 -0
- package/skills/06_fMRI_Neuroimaging/nifd-skill/SKILL.md +205 -0
- package/skills/06_fMRI_Neuroimaging/nifd-skill/scripts/extract_nifd_phenotype.py +132 -0
- package/skills/06_fMRI_Neuroimaging/nifd-skill/scripts/nifd_qc_summary.py +111 -0
- package/skills/06_fMRI_Neuroimaging/nifd-skill/scripts/validate_nifd.py +111 -0
- package/skills/06_fMRI_Neuroimaging/nii2dcm/SKILL.md +143 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/SKILL.md +266 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/connectome_reference.py +65 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/denoise_timeseries_reference.py +58 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/hierarchical_parcellation_reference.py +53 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/kmeans_parcellation_reference.py +53 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/preprocess_bold_reference.py +76 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/rest_dictlearning_reference.py +56 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/rest_ica_reference.py +59 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/second_level_glm_reference.py +58 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/spacenet_classifier_reference.py +59 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/svm_classifier_reference.py +60 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/task_glm_reference.py +63 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/zalff_summary_reference.py +109 -0
- package/skills/06_fMRI_Neuroimaging/nsd-skill/SKILL.md +210 -0
- package/skills/06_fMRI_Neuroimaging/nsd-skill/scripts/extract_nsd_stimulus.py +171 -0
- package/skills/06_fMRI_Neuroimaging/nsd-skill/scripts/nsd_qc_summary.py +142 -0
- package/skills/06_fMRI_Neuroimaging/nsd-skill/scripts/validate_nsd.py +142 -0
- package/skills/06_fMRI_Neuroimaging/oasis-skill/SKILL.md +205 -0
- package/skills/06_fMRI_Neuroimaging/oasis-skill/scripts/extract_oasis_phenotype.py +126 -0
- package/skills/06_fMRI_Neuroimaging/oasis-skill/scripts/oasis_qc_summary.py +115 -0
- package/skills/06_fMRI_Neuroimaging/oasis-skill/scripts/validate_oasis.py +119 -0
- package/skills/06_fMRI_Neuroimaging/pet-skill/SKILL.md +173 -0
- package/skills/06_fMRI_Neuroimaging/pet-skill/scripts/compute_suvr.py +202 -0
- package/skills/06_fMRI_Neuroimaging/pnc-skill/SKILL.md +206 -0
- package/skills/06_fMRI_Neuroimaging/pnc-skill/scripts/extract_pnc_phenotype.py +136 -0
- package/skills/06_fMRI_Neuroimaging/pnc-skill/scripts/pnc_qc_summary.py +116 -0
- package/skills/06_fMRI_Neuroimaging/pnc-skill/scripts/validate_pnc.py +120 -0
- package/skills/06_fMRI_Neuroimaging/ppmi-skill/SKILL.md +209 -0
- package/skills/06_fMRI_Neuroimaging/ppmi-skill/scripts/extract_ppmi_phenotype.py +138 -0
- package/skills/06_fMRI_Neuroimaging/ppmi-skill/scripts/ppmi_qc_summary.py +111 -0
- package/skills/06_fMRI_Neuroimaging/ppmi-skill/scripts/validate_ppmi.py +117 -0
- package/skills/06_fMRI_Neuroimaging/qsiprep-tool/SKILL.md +320 -0
- package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/SKILL.md +215 -0
- package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/extract_rest_mdd_phenotype.py +132 -0
- package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/harmonize_sites.py +152 -0
- package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/rest_mdd_qc_summary.py +124 -0
- package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/validate_rest_mdd.py +103 -0
- package/skills/06_fMRI_Neuroimaging/smri-skill/SKILL.md +302 -0
- package/skills/06_fMRI_Neuroimaging/tcp-skill/SKILL.md +204 -0
- package/skills/06_fMRI_Neuroimaging/tcp-skill/scripts/extract_tcp_phenotype.py +139 -0
- package/skills/06_fMRI_Neuroimaging/tcp-skill/scripts/tcp_qc_summary.py +111 -0
- package/skills/06_fMRI_Neuroimaging/tcp-skill/scripts/validate_tcp.py +99 -0
- package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/SKILL.md +217 -0
- package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/scripts/extract_ucla_cnp_phenotype.py +145 -0
- package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/scripts/ucla_cnp_qc_summary.py +111 -0
- package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/scripts/validate_ucla_cnp.py +113 -0
- package/skills/06_fMRI_Neuroimaging/ukb-skill/SKILL.md +310 -0
- package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/build_ukb_survival.py +210 -0
- package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/extract_ukb_cases.py +308 -0
- package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/extract_ukb_phenotype.py +232 -0
- package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/ukb_qc_summary.py +158 -0
- package/skills/06_fMRI_Neuroimaging/wmh-segmentation/SKILL.md +133 -0
- package/skills/07_Computational_Modeling/detrending/SKILL.md +118 -0
- package/skills/07_Computational_Modeling/dictlearning/SKILL.md +122 -0
- package/skills/07_Computational_Modeling/filtering/SKILL.md +121 -0
- package/skills/07_Computational_Modeling/glm/SKILL.md +153 -0
- package/skills/07_Computational_Modeling/hierarchical/SKILL.md +121 -0
- package/skills/07_Computational_Modeling/ica/SKILL.md +122 -0
- package/skills/07_Computational_Modeling/kmeans/SKILL.md +119 -0
- package/skills/07_Computational_Modeling/run_models/SKILL.md +427 -0
- package/skills/07_Computational_Modeling/spacenet/SKILL.md +122 -0
- package/skills/07_Computational_Modeling/svm/SKILL.md +120 -0
- package/skills/08_Computational_Neuroscience/brain_gnn/SKILL.md +183 -0
- package/skills/08_Computational_Neuroscience/dipy-tool/SKILL.md +239 -0
- package/skills/08_Computational_Neuroscience/dipy-tool/scripts/dti_metrics_reference.py +70 -0
- package/skills/08_Computational_Neuroscience/dipy-tool/scripts/load_and_mask_reference.py +76 -0
- package/skills/08_Computational_Neuroscience/dipy-tool/scripts/roi_stats_reference.py +59 -0
- package/skills/08_Computational_Neuroscience/fm_app/SKILL.md +195 -0
- package/skills/08_Computational_Neuroscience/neurostorm/SKILL.md +151 -0
- package/skills/13_Visualization/brain-visualization/SKILL.md +191 -0
- package/skills/13_Visualization/brain-visualization/scripts/connectome_reference.py +108 -0
- package/skills/13_Visualization/brain-visualization/scripts/freesurfer_ply_reference.py +54 -0
- package/skills/13_Visualization/brain-visualization/scripts/zalff_summary_reference.py +116 -0
- package/skills/13_Visualization/ethoclaw-paper-figure-layout/SKILL.md +78 -0
- package/skills/13_Visualization/ethoclaw-paper-figure-layout/assets/naturecomm_figures.tex +74 -0
- package/skills/13_Visualization/ethoclaw-paper-figure-layout/scripts/layout_results_foldered.py +579 -0
- package/skills/14_Writing/overleaf-skill/SKILL.md +184 -0
- package/skills/14_Writing/overleaf-skill/scripts/install.sh +30 -0
- package/skills/14_Writing/paper-writing/SKILL.md +146 -0
- package/skills/14_Writing/paper-writing/scripts/data_statement_templates.py +164 -0
- package/skills/14_Writing/paper-writing/scripts/figure_templates.py +315 -0
- package/skills/14_Writing/paper-writing/scripts/nature_figure_style.py +214 -0
- package/skills/14_Writing/paper-writing/scripts/section_phrasebank.py +246 -0
- package/skills/16_Animal_Behavior/deeplabcut/SKILL.md +154 -0
- package/skills/16_Animal_Behavior/deeplabcut/references/3d-pose.md +89 -0
- package/skills/16_Animal_Behavior/deeplabcut/references/maDLC.md +123 -0
- package/skills/16_Animal_Behavior/deeplabcut/references/modelzoo.md +98 -0
- package/skills/16_Animal_Behavior/deeplabcut/references/standard-pipeline.md +165 -0
- package/skills/16_Animal_Behavior/deeplabcut/references/utilities.md +146 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/SKILL.md +274 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/report_template_en.html +112 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/report_template_en.md +21 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/cluster-section.md +5 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/heatmap-section.md +5 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/integrated-interpretation.md +3 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/overview.md +3 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/project-summary.md +3 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/radar-section.md +5 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/raw-trajectory.md +3 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/sample-check.md +3 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/single-subject-section.md +3 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/stats-section.md +5 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/epm.md +52 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/fst.md +37 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/nor.md +39 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/oft.md +43 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/tcst.md +45 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/tst.md +36 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/input-types.md +59 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/interpretation-guardrails.md +45 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/metadata-schema.md +57 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/report-sections.md +86 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/section-selection-rules.md +169 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/scripts/build_report_manifest.py +27 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/scripts/render_report.py +34 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/scripts/report_utils.py +1121 -0
- package/skills/16_Animal_Behavior/ethoclaw-animal-grounding/SKILL.md +390 -0
- package/skills/16_Animal_Behavior/ethoclaw-animal-grounding/reference_code.py +98 -0
- package/skills/16_Animal_Behavior/ethoclaw-animal-pose-estimation/SKILL.md +336 -0
- package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/README.md +21 -0
- package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/SKILL.md +41 -0
- package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/batch_kinematic_generator.py +663 -0
- package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/config.json +19 -0
- package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/generate_kinematic_parameter.py +401 -0
- package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/kinematic_generator.py +265 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/SKILL.md +72 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/references/config.example.toml +56 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/scripts/cluster_all_params.py +232 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/scripts/cluster_all_params_from_config.py +236 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-radar-generate/SKILL.md +68 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-radar-generate/references/notes.md +5 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-radar-generate/scripts/plot_h5_radar.py +513 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/SKILL.md +52 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/config.toml +81 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/references/stats-rule.md +18 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/scripts/h5_inspect.py +79 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/scripts/h5_violin_batch.py +624 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/scripts/h5_violin_stats.py +438 -0
- package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/SKILL.md +280 -0
- package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/core_scripts/heatmap_trajectory.py +790 -0
- package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/core_scripts/heatmap_velocity.py +855 -0
- package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/reference_data/reference_2d.csv +101 -0
- package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/reference_data/reference_2d.h5 +0 -0
- package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/reference_data/reference_data_readme.md +126 -0
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: hcpep-skill
|
|
3
|
+
description: "Use this skill whenever the user wants an end-to-end workflow for the HCP Early Psychosis (HCP-EP) dataset, including dataset download, BIDS organization, and multimodal processing of sMRI, fMRI, and dMRI. Triggers include: 'HCP Early Psychosis', 'HCP-EP', 'process HCP Early Psychosis data', 'HCP EP sMRI fMRI', or any request to run the HCP-EP 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
|
+
- hcppipeline-tool
|
|
15
|
+
---
|
|
16
|
+
# HCP-EP Skill (Dataset-Orchestration Layer)
|
|
17
|
+
|
|
18
|
+
## Overview
|
|
19
|
+
|
|
20
|
+
`hcpep-skill` is the NeuroClaw orchestration skill for the **HCP Early Psychosis (HCP-EP)** dataset.
|
|
21
|
+
|
|
22
|
+
It strictly follows the NeuroClaw hierarchical design principles:
|
|
23
|
+
- This skill **only describes WHAT needs to be done** and **which tool skill to delegate to**.
|
|
24
|
+
- It contains **no implementation code or concrete commands**.
|
|
25
|
+
- All concrete execution is delegated to existing base/tool skills via `claw-shell`.
|
|
26
|
+
- Companion scripts in `scripts/` provide reference implementations for data reorganization, phenotype extraction, and QC.
|
|
27
|
+
|
|
28
|
+
**Core workflow (never bypassed):**
|
|
29
|
+
1. Identify input HCP-EP data and target modalities.
|
|
30
|
+
2. Generate a **numbered execution plan** clearly stating WHAT needs to be done and which tool skill will handle each step.
|
|
31
|
+
3. Present the full plan, estimated runtime, resource requirements, and risks to the user and wait for explicit confirmation ("YES" / "execute" / "proceed").
|
|
32
|
+
4. On confirmation, delegate every step to the appropriate skill via `claw-shell`.
|
|
33
|
+
5. After execution, save all outputs in a clean directory structure (`hcpep_output/`).
|
|
34
|
+
|
|
35
|
+
**Research use only.**
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Quick Reference
|
|
40
|
+
|
|
41
|
+
| Task | What needs to be done | Delegate to | Expected output |
|
|
42
|
+
|---|---|---|---|
|
|
43
|
+
| Data download | Download HCP-EP from ConnectomeDB | `claw-shell` | Raw HCP-EP files |
|
|
44
|
+
| BIDS staging | Reorganize HCP-EP native layout to BIDS | `scripts/reorganize_hcpep.py` | BIDS-compliant dataset |
|
|
45
|
+
| sMRI processing | Brain extraction, tissue segmentation, cortical reconstruction | `smri-skill` | `smri_output/` derivatives |
|
|
46
|
+
| fMRI processing | Preprocessing, denoising, connectivity, task GLM | `fmri-skill` | `fmri_output/` derivatives |
|
|
47
|
+
| dMRI processing | Eddy correction, tensor metrics, tractography | `dwi-skill` | `dwi_output/` metrics |
|
|
48
|
+
| Phenotype extraction | Clinical, diagnostic, cognitive data | `scripts/extract_hcpep_phenotype.py` | Merged phenotype CSV |
|
|
49
|
+
| QC summary | Per-subject quality control | `scripts/hcpep_qc_summary.py` | QC summary + exclusion list |
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## Download Stage (Mandatory First Step)
|
|
54
|
+
|
|
55
|
+
### Source
|
|
56
|
+
HCP-EP data is distributed through **ConnectomeDB**:
|
|
57
|
+
- Website: https://db.humanconnectome.org/
|
|
58
|
+
- Requires ConnectomeDB account and data use agreement
|
|
59
|
+
- Part of the HCP Clinical initiative
|
|
60
|
+
|
|
61
|
+
### Dataset Characteristics
|
|
62
|
+
- **Cohort**: ~250 participants (early psychosis and healthy controls)
|
|
63
|
+
- **Modalities**: T1w, T2w, dMRI, rs-fMRI, task-fMRI
|
|
64
|
+
- **Focus**: Early psychosis (schizophrenia spectrum, bipolar disorder), neural circuit disruptions
|
|
65
|
+
- **Unique feature**: Clinical cohort with matched healthy controls for case-control comparisons
|
|
66
|
+
|
|
67
|
+
### Diagnostic Groups
|
|
68
|
+
- Early psychosis patients (schizophrenia spectrum, bipolar with psychotic features)
|
|
69
|
+
- Healthy controls (age-, sex-, and education-matched)
|
|
70
|
+
- All patients are within 5 years of psychosis onset
|
|
71
|
+
|
|
72
|
+
### Download Inputs to Confirm in Plan
|
|
73
|
+
- ConnectomeDB credentials/token
|
|
74
|
+
- Target modalities (all, structural, functional, diffusion)
|
|
75
|
+
- Subject list scope (full or custom subset)
|
|
76
|
+
- Destination directory with sufficient disk space
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## HCP-EP Task Paradigms
|
|
81
|
+
|
|
82
|
+
| Task | Description | Duration |
|
|
83
|
+
|---|---|---|
|
|
84
|
+
| MOTOR | Finger tapping, toe movement, tongue movement | ~3 min |
|
|
85
|
+
| EMOTION | Faces and shapes matching | ~2 min |
|
|
86
|
+
| GAMBLING | Card guessing with reward/loss | ~3 min |
|
|
87
|
+
| LANGUAGE | Story comprehension and math | ~4 min |
|
|
88
|
+
| RELATIONAL | Relational reasoning matching | ~3 min |
|
|
89
|
+
| SOCIAL | Social cognition (mentalizing) movie clips | ~3 min |
|
|
90
|
+
| WM | Working memory (faces, places, tools, body parts) | ~5 min |
|
|
91
|
+
| REST | Resting-state (eyes open) | ~15 min × 4 runs |
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## BIDS Preparation
|
|
96
|
+
|
|
97
|
+
### Script: `scripts/reorganize_hcpep.py`
|
|
98
|
+
|
|
99
|
+
Converts HCP-EP native directory structure to BIDS-compliant layout.
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
python skills/hcpep-skill/scripts/reorganize_hcpep.py \
|
|
103
|
+
--input /path/to/HCPEP/raw \
|
|
104
|
+
--output /path/to/HCPEP/bids \
|
|
105
|
+
--participants /path/to/subject_list.txt
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Features:
|
|
109
|
+
- Subject ID normalization: HCP format to BIDS `sub-` labels
|
|
110
|
+
- Diagnostic group labeling (patient vs. control)
|
|
111
|
+
- Modality routing: T1w, T2w, dMRI, rs-fMRI, task-fMRI
|
|
112
|
+
- Sidecar JSON generation from HCP metadata
|
|
113
|
+
- `dataset_description.json` and `participants.tsv` generation
|
|
114
|
+
- Dry-run mode: `--dry-run` to preview without copying
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Core Workflow (Never Bypassed)
|
|
119
|
+
|
|
120
|
+
1. Identify user target: full HCP-EP processing, imaging subset, phenotype extraction, or BIDS staging only.
|
|
121
|
+
2. Generate a numbered plan with tools, outputs, runtime, storage, and risks.
|
|
122
|
+
3. Wait for explicit confirmation (`YES` / `execute` / `proceed`).
|
|
123
|
+
4. On confirmation, run download stage first (if needed).
|
|
124
|
+
5. After download success, run BIDS preparation using `scripts/reorganize_hcpep.py`.
|
|
125
|
+
6. Delegate to `smri-skill` for structural MRI processing.
|
|
126
|
+
7. Delegate to `fmri-skill` for functional MRI processing.
|
|
127
|
+
8. Delegate to `dwi-skill` for diffusion MRI processing.
|
|
128
|
+
9. If phenotype extraction is requested, run `scripts/extract_hcpep_phenotype.py`.
|
|
129
|
+
10. If QC summary is requested, run `scripts/hcpep_qc_summary.py`.
|
|
130
|
+
11. Save outputs into `hcpep_output/`.
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Modality Processing Delegation
|
|
135
|
+
|
|
136
|
+
| Modality | Delegated skill | Typical tasks | Main outputs |
|
|
137
|
+
|---|---|---|---|
|
|
138
|
+
| sMRI (T1w/T2w) | `smri-skill` | brain extraction, tissue segmentation, cortical reconstruction, ROI morphometry | `smri_output/` derivatives |
|
|
139
|
+
| fMRI (rs-fMRI/task-fMRI) | `fmri-skill` | preprocessing, denoising, ROI time series, connectivity, task GLM | `fmri_output/` derivatives |
|
|
140
|
+
| dMRI (DWI) | `dwi-skill` | eddy correction, tensor metrics, tractography, connectome | `dwi_output/` metrics |
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## Standard Output Layout
|
|
145
|
+
|
|
146
|
+
```
|
|
147
|
+
hcpep_output/
|
|
148
|
+
├── raw/ # Downloaded original HCP-EP files
|
|
149
|
+
├── bids/ # BIDS-staged data
|
|
150
|
+
├── smri/ # Structural MRI derivatives
|
|
151
|
+
├── fmri/ # Functional MRI derivatives
|
|
152
|
+
├── dwi/ # Diffusion MRI derivatives
|
|
153
|
+
├── phenotype/ # Merged phenotype tables (diagnosis, clinical, cognitive)
|
|
154
|
+
├── qc/ # QC summaries and exclusion lists
|
|
155
|
+
└── logs/ # Download + orchestration logs
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## Benchmark Adapter Guidance
|
|
161
|
+
|
|
162
|
+
For benchmark-style prompts, do not force the full orchestration when the task only asks for local HCP-EP data staging.
|
|
163
|
+
|
|
164
|
+
- If the task starts from raw HCP-EP data already present on disk and only asks for BIDS-style staging:
|
|
165
|
+
- Skip the mandatory download stage
|
|
166
|
+
- Default to the narrow path `local raw HCP-EP discovery -> BIDS-style staging -> minimal metadata -> validation/report`
|
|
167
|
+
- In benchmark mode, do not require explicit confirmation before presenting the direct staging solution.
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## Safety and Execution Policy
|
|
172
|
+
- No execution before explicit plan confirmation.
|
|
173
|
+
- All execution must be routed via `claw-shell`.
|
|
174
|
+
- Missing dependencies must be resolved by `dependency-planner` before running.
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## Important Notes and Limitations
|
|
179
|
+
- HCP-EP is a clinical cohort; patient data requires careful handling and de-identification.
|
|
180
|
+
- Early psychosis patients may have higher motion artifacts; QC thresholds may need adjustment.
|
|
181
|
+
- Case-control matching should be verified before group comparisons.
|
|
182
|
+
- For HCP-native preprocessing, optionally delegate to `hcppipeline-tool`.
|
|
183
|
+
- `hcpep-skill` is orchestration-only; detailed preprocessing logic remains in modality skills.
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## When to Call This Skill
|
|
188
|
+
- User asks for end-to-end HCP Early Psychosis workflow.
|
|
189
|
+
- User asks to download HCP-EP and run sMRI/fMRI/DTI processing.
|
|
190
|
+
- User needs BIDS staging for HCP-EP data.
|
|
191
|
+
- User asks to extract HCP-EP phenotype data (diagnosis, clinical, cognitive).
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## Complementary / Related Skills
|
|
196
|
+
- `smri-skill` → structural MRI preprocessing
|
|
197
|
+
- `fmri-skill` → functional MRI preprocessing and analysis
|
|
198
|
+
- `dwi-skill` → diffusion MRI preprocessing and analysis
|
|
199
|
+
- `hcppipeline-tool` → HCP-native minimal preprocessing pipelines
|
|
200
|
+
- `bids-organizer` → BIDS validation and organization
|
|
201
|
+
- `brain-visualization` → visualization of derivatives
|
|
202
|
+
- `dependency-planner` → dependency resolution
|
|
203
|
+
- `conda-env-manager` → environment management
|
|
204
|
+
- `claw-shell` → command execution
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## Reference
|
|
209
|
+
- HCP Early Psychosis: https://www.humanconnectome.org/study/hcp-early-psychosis
|
|
210
|
+
- ConnectomeDB: https://db.humanconnectome.org/
|
|
211
|
+
- Heckers et al. (2024): The HCP Early Psychosis project
|
|
212
|
+
|
|
213
|
+
Created At: 2026-05-06 13:02 HKT
|
|
214
|
+
Last Updated At: 2026-05-06 13:02 HKT
|
|
215
|
+
Author: chengwang96
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Extract and merge HCP Early Psychosis phenotype data.
|
|
3
|
+
|
|
4
|
+
Focuses on clinical measures: diagnosis, symptom severity, medication,
|
|
5
|
+
cognitive assessment, and functional outcomes for early psychosis research.
|
|
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", "PIN"],
|
|
15
|
+
"age": ["Age_in_Yrs", "Age"],
|
|
16
|
+
"sex": ["Gender", "Sex"],
|
|
17
|
+
"handedness": ["Handedness"],
|
|
18
|
+
"race": ["Race"],
|
|
19
|
+
"ethnicity": ["Ethnicity"],
|
|
20
|
+
# Clinical diagnosis
|
|
21
|
+
"diagnosis": ["Diagnosis", "Group"],
|
|
22
|
+
"diagnosis_detail": ["Diagnosis_Detail"],
|
|
23
|
+
"patient_control": ["Patient_Control"],
|
|
24
|
+
# Symptom measures
|
|
25
|
+
"panss_positive": ["PANSS_Positive"],
|
|
26
|
+
"panss_negative": ["PANSS_Negative"],
|
|
27
|
+
"panss_general": ["PANSS_General"],
|
|
28
|
+
"panss_total": ["PANSS_Total"],
|
|
29
|
+
"bprs_total": ["BPRS_Total"],
|
|
30
|
+
"bprs_positive": ["BPRS_Positive"],
|
|
31
|
+
"bprs_negative": ["BPRS_Negative"],
|
|
32
|
+
"gaf_score": ["GAF_Score"],
|
|
33
|
+
"saps_total": ["SAPS_Total"],
|
|
34
|
+
"sans_total": ["SANS_Total"],
|
|
35
|
+
# Medication
|
|
36
|
+
"medication_status": ["Medication", "Med_Status"],
|
|
37
|
+
"chlorpromazine_eq": ["CPZ_Equivalent", "Chlorpromazine_Eq"],
|
|
38
|
+
# Functional measures
|
|
39
|
+
"functioning_gaf": ["GAF_Functioning"],
|
|
40
|
+
"role_functioning": ["Role_Functioning"],
|
|
41
|
+
"social_functioning": ["Social_Functioning"],
|
|
42
|
+
# Cognitive measures
|
|
43
|
+
"matrics_overall": ["MCCB_Overall", "MATRICS_Overall"],
|
|
44
|
+
"matrics_speed": ["MCCB_Speed", "Processing_Speed"],
|
|
45
|
+
"matrics_attention": ["MCCB_Attention", "Attention_Vigilance"],
|
|
46
|
+
"matrics_working_mem": ["MCCB_Working_Memory"],
|
|
47
|
+
"matrics_verbal": ["MCCB_Verbal_Learning"],
|
|
48
|
+
"matrics_visual": ["MCCB_Visual_Learning"],
|
|
49
|
+
"matrics_reasoning": ["MCCB_Reasoning"],
|
|
50
|
+
"matrics_social_cog": ["MCCB_Social_Cognition"],
|
|
51
|
+
# Duration of illness
|
|
52
|
+
"duration_illness": ["Duration_Illness", "DUI"],
|
|
53
|
+
"duration_untreated": ["Duration_Untreated", "DUP"],
|
|
54
|
+
"age_onset": ["Age_Onset"],
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def load_csv(path: Path) -> List[Dict[str, str]]:
|
|
59
|
+
delimiter = "\t" if path.suffix == ".tsv" else ","
|
|
60
|
+
with open(path, "r", encoding="utf-8") as f:
|
|
61
|
+
reader = csv.DictReader(f, delimiter=delimiter)
|
|
62
|
+
return list(reader)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def find_column(row: Dict[str, str], candidates: List[str]) -> Optional[str]:
|
|
66
|
+
for col in candidates:
|
|
67
|
+
if col in row:
|
|
68
|
+
return col
|
|
69
|
+
return None
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def extract_phenotype(
|
|
73
|
+
phenotype_files: List[Path],
|
|
74
|
+
imaging_ids: Optional[List[str]] = None,
|
|
75
|
+
columns: Optional[List[str]] = None,
|
|
76
|
+
) -> List[Dict[str, str]]:
|
|
77
|
+
all_data = []
|
|
78
|
+
for fpath in phenotype_files:
|
|
79
|
+
all_data.extend(load_csv(fpath))
|
|
80
|
+
|
|
81
|
+
if not all_data:
|
|
82
|
+
return []
|
|
83
|
+
|
|
84
|
+
target_columns = columns if columns else list(COLUMN_MAP.keys())
|
|
85
|
+
merged = {}
|
|
86
|
+
|
|
87
|
+
for row in all_data:
|
|
88
|
+
subj_col = find_column(row, COLUMN_MAP["subject_id"])
|
|
89
|
+
if subj_col is None:
|
|
90
|
+
continue
|
|
91
|
+
subj_id = row[subj_col].strip()
|
|
92
|
+
if not subj_id:
|
|
93
|
+
continue
|
|
94
|
+
|
|
95
|
+
if subj_id not in merged:
|
|
96
|
+
merged[subj_id] = {"subject_id": subj_id}
|
|
97
|
+
|
|
98
|
+
for target_col in target_columns:
|
|
99
|
+
if target_col == "subject_id":
|
|
100
|
+
continue
|
|
101
|
+
if target_col in merged[subj_id] and merged[subj_id][target_col]:
|
|
102
|
+
continue
|
|
103
|
+
candidates = COLUMN_MAP.get(target_col, [target_col])
|
|
104
|
+
src_col = find_column(row, candidates)
|
|
105
|
+
if src_col and row.get(src_col, "").strip():
|
|
106
|
+
merged[subj_id][target_col] = row[src_col].strip()
|
|
107
|
+
|
|
108
|
+
result = list(merged.values())
|
|
109
|
+
if imaging_ids:
|
|
110
|
+
imaging_set = set(imaging_ids)
|
|
111
|
+
result = [r for r in result if r["subject_id"] in imaging_set]
|
|
112
|
+
return result
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def main() -> int:
|
|
116
|
+
parser = argparse.ArgumentParser(description="Extract HCP Early Psychosis phenotype data.")
|
|
117
|
+
parser.add_argument("--phenotype-files", required=True, nargs="+")
|
|
118
|
+
parser.add_argument("--output", required=True)
|
|
119
|
+
parser.add_argument("--imaging-ids")
|
|
120
|
+
parser.add_argument("--columns")
|
|
121
|
+
args = parser.parse_args()
|
|
122
|
+
|
|
123
|
+
phenotype_files = [Path(f).resolve() for f in args.phenotype_files]
|
|
124
|
+
for f in phenotype_files:
|
|
125
|
+
if not f.exists():
|
|
126
|
+
print(f"File not found: {f}", file=sys.stderr)
|
|
127
|
+
return 1
|
|
128
|
+
|
|
129
|
+
imaging_ids = None
|
|
130
|
+
if args.imaging_ids:
|
|
131
|
+
id_file = Path(args.imaging_ids).resolve()
|
|
132
|
+
if id_file.exists():
|
|
133
|
+
imaging_ids = [l.strip() for l in id_file.read_text().splitlines() if l.strip()]
|
|
134
|
+
|
|
135
|
+
columns = None
|
|
136
|
+
if args.columns:
|
|
137
|
+
columns = [c.strip() for c in args.columns.split(",")]
|
|
138
|
+
|
|
139
|
+
merged = extract_phenotype(phenotype_files, imaging_ids, columns)
|
|
140
|
+
if not merged:
|
|
141
|
+
print("[ERROR] No phenotype data extracted.", file=sys.stderr)
|
|
142
|
+
return 1
|
|
143
|
+
|
|
144
|
+
output_path = Path(args.output).resolve()
|
|
145
|
+
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
146
|
+
fieldnames = list(merged[0].keys())
|
|
147
|
+
with open(output_path, "w", newline="", encoding="utf-8") as f:
|
|
148
|
+
writer = csv.DictWriter(f, fieldnames=fieldnames)
|
|
149
|
+
writer.writeheader()
|
|
150
|
+
writer.writerows(merged)
|
|
151
|
+
|
|
152
|
+
print(f"Phenotype: {len(merged)} subjects, {len(fieldnames)} columns -> {output_path}")
|
|
153
|
+
return 0
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
if __name__ == "__main__":
|
|
157
|
+
sys.exit(main())
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Generate per-subject QC summaries for HCP Early Psychosis processing.
|
|
3
|
+
|
|
4
|
+
Clinical-specific: adjusted thresholds for patient data, diagnostic group tracking.
|
|
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 load_freesurfer_qc(fs_dir: Path, subject_id: str) -> Dict[str, float]:
|
|
28
|
+
metrics = {"fs_eTIV": float("nan")}
|
|
29
|
+
stats_file = fs_dir / subject_id / "stats" / "aseg.stats"
|
|
30
|
+
if stats_file.exists():
|
|
31
|
+
try:
|
|
32
|
+
for line in stats_file.read_text().splitlines():
|
|
33
|
+
if "EstimatedTotalIntraCranialVol" in line:
|
|
34
|
+
parts = line.split(",")
|
|
35
|
+
if len(parts) > 4:
|
|
36
|
+
metrics["fs_eTIV"] = float(parts[4].strip())
|
|
37
|
+
except Exception:
|
|
38
|
+
pass
|
|
39
|
+
return metrics
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def check_exclusion(metrics: Dict[str, float], fd_threshold: float = 0.3) -> List[str]:
|
|
43
|
+
"""Check exclusion criteria. Same threshold for patients and controls."""
|
|
44
|
+
reasons = []
|
|
45
|
+
if not (metrics["fd_mean"] != metrics["fd_mean"]):
|
|
46
|
+
if metrics["fd_mean"] > fd_threshold:
|
|
47
|
+
reasons.append(f"FD mean {metrics['fd_mean']:.3f} > {fd_threshold}")
|
|
48
|
+
return reasons
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def main() -> int:
|
|
52
|
+
parser = argparse.ArgumentParser(description="Generate QC summaries for HCP-EP.")
|
|
53
|
+
parser.add_argument("--fmriprep-dir")
|
|
54
|
+
parser.add_argument("--freesurfer-dir")
|
|
55
|
+
parser.add_argument("--output", required=True)
|
|
56
|
+
parser.add_argument("--exclude-output")
|
|
57
|
+
parser.add_argument("--fd-threshold", type=float, default=0.3)
|
|
58
|
+
parser.add_argument("--diagnosis-file", help="CSV with subject diagnosis info")
|
|
59
|
+
args = parser.parse_args()
|
|
60
|
+
|
|
61
|
+
output_path = Path(args.output).resolve()
|
|
62
|
+
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
63
|
+
|
|
64
|
+
# Load diagnosis info if available
|
|
65
|
+
diagnosis_map = {}
|
|
66
|
+
if args.diagnosis_file:
|
|
67
|
+
diag_path = Path(args.diagnosis_file).resolve()
|
|
68
|
+
if diag_path.exists():
|
|
69
|
+
import csv as csv_mod
|
|
70
|
+
with open(diag_path, "r", encoding="utf-8") as f:
|
|
71
|
+
reader = csv_mod.DictReader(f)
|
|
72
|
+
for row in reader:
|
|
73
|
+
subj = row.get("subject_id") or row.get("Subject", "")
|
|
74
|
+
diag = row.get("diagnosis") or row.get("Diagnosis") or row.get("Group", "")
|
|
75
|
+
if subj and diag:
|
|
76
|
+
diagnosis_map[subj] = diag
|
|
77
|
+
|
|
78
|
+
subjects = set()
|
|
79
|
+
if args.fmriprep_dir:
|
|
80
|
+
fmriprep_dir = Path(args.fmriprep_dir).resolve()
|
|
81
|
+
if fmriprep_dir.exists():
|
|
82
|
+
for d in fmriprep_dir.glob("sub-*"):
|
|
83
|
+
if d.is_dir():
|
|
84
|
+
subjects.add(d.name)
|
|
85
|
+
|
|
86
|
+
if args.freesurfer_dir:
|
|
87
|
+
fs_dir = Path(args.freesurfer_dir).resolve()
|
|
88
|
+
if fs_dir.exists():
|
|
89
|
+
for d in fs_dir.iterdir():
|
|
90
|
+
if d.is_dir() and not d.name.startswith("."):
|
|
91
|
+
subjects.add(f"sub-{d.name}" if not d.name.startswith("sub-") else d.name)
|
|
92
|
+
|
|
93
|
+
if not subjects:
|
|
94
|
+
print("[WARN] No subjects found.", file=sys.stderr)
|
|
95
|
+
return 1
|
|
96
|
+
|
|
97
|
+
results = []
|
|
98
|
+
excluded = []
|
|
99
|
+
for subj in sorted(subjects):
|
|
100
|
+
metrics = {"subject_id": subj}
|
|
101
|
+
|
|
102
|
+
# Add diagnosis if available
|
|
103
|
+
if diagnosis_map:
|
|
104
|
+
metrics["diagnosis"] = diagnosis_map.get(subj, "unknown")
|
|
105
|
+
|
|
106
|
+
if args.fmriprep_dir:
|
|
107
|
+
confounds_files = list(Path(args.fmriprep_dir).glob(f"{subj}/func/*_desc-confounds_timeseries.tsv"))
|
|
108
|
+
if confounds_files:
|
|
109
|
+
metrics.update(load_confounds(confounds_files[0]))
|
|
110
|
+
|
|
111
|
+
if args.freesurfer_dir:
|
|
112
|
+
fs_id = subj.replace("sub-", "")
|
|
113
|
+
metrics.update(load_freesurfer_qc(Path(args.freesurfer_dir), fs_id))
|
|
114
|
+
|
|
115
|
+
exclusion_reasons = check_exclusion(metrics, args.fd_threshold)
|
|
116
|
+
metrics["excluded"] = len(exclusion_reasons) > 0
|
|
117
|
+
metrics["exclusion_reasons"] = "; ".join(exclusion_reasons)
|
|
118
|
+
|
|
119
|
+
results.append(metrics)
|
|
120
|
+
if exclusion_reasons:
|
|
121
|
+
excluded.append({"subject_id": subj, "reasons": "; ".join(exclusion_reasons)})
|
|
122
|
+
|
|
123
|
+
if results:
|
|
124
|
+
fieldnames = list(results[0].keys())
|
|
125
|
+
with open(output_path, "w", newline="", encoding="utf-8") as f:
|
|
126
|
+
writer = csv.DictWriter(f, fieldnames=fieldnames)
|
|
127
|
+
writer.writeheader()
|
|
128
|
+
writer.writerows(results)
|
|
129
|
+
print(f"QC: {len(results)} subjects, {len(excluded)} excluded -> {output_path}")
|
|
130
|
+
|
|
131
|
+
if args.exclude_output and excluded:
|
|
132
|
+
exclude_path = Path(args.exclude_output).resolve()
|
|
133
|
+
exclude_path.parent.mkdir(parents=True, exist_ok=True)
|
|
134
|
+
with open(exclude_path, "w", newline="", encoding="utf-8") as f:
|
|
135
|
+
writer = csv.DictWriter(f, fieldnames=["subject_id", "reasons"])
|
|
136
|
+
writer.writeheader()
|
|
137
|
+
writer.writerows(excluded)
|
|
138
|
+
|
|
139
|
+
return 0
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
if __name__ == "__main__":
|
|
143
|
+
sys.exit(main())
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Reorganize HCP Early Psychosis native layout to BIDS structure."""
|
|
3
|
+
import argparse
|
|
4
|
+
import json
|
|
5
|
+
import shutil
|
|
6
|
+
import sys
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
TASK_MAP = {
|
|
10
|
+
"tfMRI_MOTOR": {"label": "motor", "name": "Motor"},
|
|
11
|
+
"tfMRI_EMOTION": {"label": "emotion", "name": "Emotion"},
|
|
12
|
+
"tfMRI_GAMBLING": {"label": "gambling", "name": "Gambling"},
|
|
13
|
+
"tfMRI_LANGUAGE": {"label": "language", "name": "Language"},
|
|
14
|
+
"tfMRI_RELATIONAL": {"label": "relational", "name": "Relational"},
|
|
15
|
+
"tfMRI_SOCIAL": {"label": "social", "name": "Social"},
|
|
16
|
+
"tfMRI_WM": {"label": "wm", "name": "WorkingMemory"},
|
|
17
|
+
"rfMRI_REST": {"label": "rest", "name": "RestingState"},
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def normalize_subject_id(hcp_id: str) -> str:
|
|
22
|
+
return f"sub-{hcp_id.strip()}"
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def find_subjects(input_dir: Path, participant_list: list = None) -> list:
|
|
26
|
+
subjects = []
|
|
27
|
+
for d in sorted(input_dir.iterdir()):
|
|
28
|
+
if d.is_dir() and d.name.isdigit():
|
|
29
|
+
if participant_list is None or d.name in participant_list:
|
|
30
|
+
subjects.append(d)
|
|
31
|
+
return subjects
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def reorganize_subject(subject_dir: Path, output_dir: Path, dry_run: bool = False) -> dict:
|
|
35
|
+
hcp_id = subject_dir.name
|
|
36
|
+
bids_id = normalize_subject_id(hcp_id)
|
|
37
|
+
sub_dir = output_dir / bids_id
|
|
38
|
+
report = {"subject": hcp_id, "files_created": 0, "warnings": []}
|
|
39
|
+
|
|
40
|
+
if not dry_run:
|
|
41
|
+
(sub_dir / "anat").mkdir(parents=True, exist_ok=True)
|
|
42
|
+
(sub_dir / "func").mkdir(parents=True, exist_ok=True)
|
|
43
|
+
(sub_dir / "dwi").mkdir(parents=True, exist_ok=True)
|
|
44
|
+
|
|
45
|
+
mninonlinear = subject_dir / "MNINonLinear"
|
|
46
|
+
|
|
47
|
+
for suffix in ["T1w.nii.gz", "T2w.nii.gz"]:
|
|
48
|
+
src = mninonlinear / suffix
|
|
49
|
+
if src.exists():
|
|
50
|
+
modality = suffix.split(".")[0].lower()
|
|
51
|
+
dst = sub_dir / "anat" / f"{bids_id}_{modality}.nii.gz"
|
|
52
|
+
if not dry_run:
|
|
53
|
+
shutil.copy2(src, dst)
|
|
54
|
+
report["files_created"] += 1
|
|
55
|
+
else:
|
|
56
|
+
report["warnings"].append(f"{suffix} not found")
|
|
57
|
+
|
|
58
|
+
for task_dir_name, task_info in TASK_MAP.items():
|
|
59
|
+
task_dir = subject_dir / task_dir_name
|
|
60
|
+
if not task_dir.exists():
|
|
61
|
+
task_dir = mninonlinear / "Results" / task_dir_name
|
|
62
|
+
if task_dir.exists():
|
|
63
|
+
bold_candidates = list(task_dir.glob("*_bold.nii.gz"))
|
|
64
|
+
if not bold_candidates:
|
|
65
|
+
bold_candidates = list(task_dir.glob("*.nii.gz"))
|
|
66
|
+
for bold_src in bold_candidates:
|
|
67
|
+
dst_name = f"{bids_id}_task-{task_info['label']}_run-01_bold.nii.gz"
|
|
68
|
+
dst = sub_dir / "func" / dst_name
|
|
69
|
+
if not dry_run:
|
|
70
|
+
shutil.copy2(bold_src, dst)
|
|
71
|
+
report["files_created"] += 1
|
|
72
|
+
|
|
73
|
+
dmri_dir = subject_dir / "T1w" / "Diffusion"
|
|
74
|
+
if dmri_dir.exists():
|
|
75
|
+
for suffix in ["data.nii.gz", "bval", "bvec"]:
|
|
76
|
+
src = dmri_dir / suffix
|
|
77
|
+
if src.exists():
|
|
78
|
+
bids_suffix = suffix.replace("data.nii.gz", "dwi.nii.gz")
|
|
79
|
+
dst = sub_dir / "dwi" / f"{bids_id}_{bids_suffix}"
|
|
80
|
+
if not dry_run:
|
|
81
|
+
shutil.copy2(src, dst)
|
|
82
|
+
report["files_created"] += 1
|
|
83
|
+
|
|
84
|
+
return report
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def create_dataset_description(output_dir: Path, n_subjects: int):
|
|
88
|
+
desc = {
|
|
89
|
+
"Name": "HCP Early Psychosis",
|
|
90
|
+
"BIDSVersion": "1.8.0",
|
|
91
|
+
"DatasetType": "raw",
|
|
92
|
+
"License": "HCP Data Use Terms",
|
|
93
|
+
"Authors": ["Human Connectome Project"],
|
|
94
|
+
"HowToAcknowledge": "Please cite the HCP Early Psychosis project.",
|
|
95
|
+
"ReferencesAndLinks": ["https://www.humanconnectome.org/study/hcp-early-psychosis"],
|
|
96
|
+
"Subjects": n_subjects
|
|
97
|
+
}
|
|
98
|
+
with open(output_dir / "dataset_description.json", "w", encoding="utf-8") as f:
|
|
99
|
+
json.dump(desc, f, indent=2)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def main() -> int:
|
|
103
|
+
parser = argparse.ArgumentParser(description="Reorganize HCP-EP native layout to BIDS.")
|
|
104
|
+
parser.add_argument("--input", required=True)
|
|
105
|
+
parser.add_argument("--output", required=True)
|
|
106
|
+
parser.add_argument("--participants")
|
|
107
|
+
parser.add_argument("--dry-run", action="store_true")
|
|
108
|
+
args = parser.parse_args()
|
|
109
|
+
|
|
110
|
+
input_dir = Path(args.input).resolve()
|
|
111
|
+
output_dir = Path(args.output).resolve()
|
|
112
|
+
|
|
113
|
+
if not input_dir.exists():
|
|
114
|
+
print(f"Input not found: {input_dir}", file=sys.stderr)
|
|
115
|
+
return 1
|
|
116
|
+
|
|
117
|
+
participant_list = None
|
|
118
|
+
if args.participants:
|
|
119
|
+
p_file = Path(args.participants).resolve()
|
|
120
|
+
if p_file.exists():
|
|
121
|
+
participant_list = [l.strip() for l in p_file.read_text().splitlines() if l.strip()]
|
|
122
|
+
|
|
123
|
+
subjects = find_subjects(input_dir, participant_list)
|
|
124
|
+
print(f"Found {len(subjects)} subjects")
|
|
125
|
+
|
|
126
|
+
if not args.dry_run:
|
|
127
|
+
output_dir.mkdir(parents=True, exist_ok=True)
|
|
128
|
+
|
|
129
|
+
total_files = 0
|
|
130
|
+
for i, sub_dir in enumerate(subjects):
|
|
131
|
+
report = reorganize_subject(sub_dir, output_dir, dry_run=args.dry_run)
|
|
132
|
+
total_files += report["files_created"]
|
|
133
|
+
if (i + 1) % 50 == 0 or (i + 1) == len(subjects):
|
|
134
|
+
print(f" Processed {i + 1}/{len(subjects)} subjects")
|
|
135
|
+
|
|
136
|
+
if not args.dry_run:
|
|
137
|
+
create_dataset_description(output_dir, len(subjects))
|
|
138
|
+
|
|
139
|
+
print(f"\nBIDS Staging: {len(subjects)} subjects, {total_files} files -> {output_dir}")
|
|
140
|
+
if args.dry_run:
|
|
141
|
+
print(" [DRY RUN]")
|
|
142
|
+
return 0
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
if __name__ == "__main__":
|
|
146
|
+
sys.exit(main())
|