@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,394 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Reorganize AIBL raw data into BIDS-compliant directory structure.
|
|
3
|
+
|
|
4
|
+
Handles AIBL-style subject IDs, visit names, and multimodal routing
|
|
5
|
+
for T1w MRI and PET (PiB, FDG, tau).
|
|
6
|
+
"""
|
|
7
|
+
import argparse
|
|
8
|
+
import json
|
|
9
|
+
import os
|
|
10
|
+
import re
|
|
11
|
+
import shutil
|
|
12
|
+
import sys
|
|
13
|
+
from collections import defaultdict
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
from typing import Dict, List, Optional, Tuple
|
|
16
|
+
|
|
17
|
+
# AIBL visit name -> BIDS session label mapping
|
|
18
|
+
AIBL_SESSION_MAP = {
|
|
19
|
+
"screening": "screening",
|
|
20
|
+
"baseline": "baseline",
|
|
21
|
+
"18month": "18month",
|
|
22
|
+
"18_month": "18month",
|
|
23
|
+
"18-month": "18month",
|
|
24
|
+
"36month": "36month",
|
|
25
|
+
"36_month": "36month",
|
|
26
|
+
"36-month": "36month",
|
|
27
|
+
"54month": "54month",
|
|
28
|
+
"54_month": "54month",
|
|
29
|
+
"54-month": "54month",
|
|
30
|
+
"72month": "72month",
|
|
31
|
+
"72_month": "72month",
|
|
32
|
+
"72-month": "72month",
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
# Modality keywords -> BIDS modality mapping
|
|
36
|
+
MODALITY_PATTERNS = [
|
|
37
|
+
(re.compile(r"T1w|T1|mprage|MPRAGE|SPGR", re.IGNORECASE), "T1w", "anat"),
|
|
38
|
+
(re.compile(r"PET.*PiB|PiB.*PET|pib", re.IGNORECASE), "pet", "pet"),
|
|
39
|
+
(re.compile(r"PET.*FDG|FDG.*PET|fdg", re.IGNORECASE), "pet", "pet"),
|
|
40
|
+
(re.compile(r"PET.*tau|tau.*PET|18F.*AV.*1451|flortaucipir", re.IGNORECASE), "pet", "pet"),
|
|
41
|
+
(re.compile(r"PET|pet", re.IGNORECASE), "pet", "pet"),
|
|
42
|
+
]
|
|
43
|
+
|
|
44
|
+
SIDECAR_EXTENSIONS = [".json", ".bval", ".bvec", ".tsv"]
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def normalize_subject_id(raw_id: str) -> str:
|
|
48
|
+
"""Convert AIBL subject ID to BIDS-compatible label.
|
|
49
|
+
|
|
50
|
+
002_S_0295 -> sub-002S0295
|
|
51
|
+
"""
|
|
52
|
+
clean = raw_id.strip()
|
|
53
|
+
if clean.startswith("sub-"):
|
|
54
|
+
clean = clean[4:]
|
|
55
|
+
# Remove underscores and non-alphanumeric characters
|
|
56
|
+
clean = re.sub(r"[^a-zA-Z0-9]", "", clean)
|
|
57
|
+
return f"sub-{clean}"
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def normalize_session(visit_name: str) -> str:
|
|
61
|
+
"""Convert AIBL visit name to BIDS session label."""
|
|
62
|
+
visit_name = visit_name.strip().lower()
|
|
63
|
+
if visit_name.startswith("ses-"):
|
|
64
|
+
visit_name = visit_name[4:]
|
|
65
|
+
|
|
66
|
+
# Direct match
|
|
67
|
+
if visit_name in AIBL_SESSION_MAP:
|
|
68
|
+
return f"ses-{AIBL_SESSION_MAP[visit_name]}"
|
|
69
|
+
|
|
70
|
+
# Fuzzy match
|
|
71
|
+
for key, val in AIBL_SESSION_MAP.items():
|
|
72
|
+
if key in visit_name or visit_name in key:
|
|
73
|
+
return f"ses-{val}"
|
|
74
|
+
|
|
75
|
+
# Fallback: sanitize
|
|
76
|
+
clean = re.sub(r"[^a-zA-Z0-9]", "", visit_name)
|
|
77
|
+
return f"ses-{clean}"
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def detect_pet_tracer(filename: str) -> str:
|
|
81
|
+
"""Detect PET tracer from filename."""
|
|
82
|
+
fname = filename.lower()
|
|
83
|
+
if "pib" in fname:
|
|
84
|
+
return "PiB"
|
|
85
|
+
if "fdg" in fname:
|
|
86
|
+
return "FDG"
|
|
87
|
+
if "tau" in fname or "av1451" in fname or "flortaucipir" in fname:
|
|
88
|
+
return "tau"
|
|
89
|
+
return "unknown"
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def detect_modality(filename: str) -> Optional[Tuple[str, str, str]]:
|
|
93
|
+
"""Detect BIDS modality suffix and folder from filename.
|
|
94
|
+
|
|
95
|
+
Returns (bids_suffix, bids_folder, tracer) or None.
|
|
96
|
+
"""
|
|
97
|
+
for pattern, suffix, folder in MODALITY_PATTERNS:
|
|
98
|
+
if pattern.search(filename):
|
|
99
|
+
if folder == "pet":
|
|
100
|
+
tracer = detect_pet_tracer(filename)
|
|
101
|
+
return (suffix, folder, tracer)
|
|
102
|
+
return (suffix, folder, "")
|
|
103
|
+
return None
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def find_nifti_files(directory: Path) -> List[Path]:
|
|
107
|
+
"""Find all NIfTI files in a directory."""
|
|
108
|
+
results = []
|
|
109
|
+
for f in directory.rglob("*"):
|
|
110
|
+
if f.is_file() and (f.name.endswith(".nii") or f.name.endswith(".nii.gz")):
|
|
111
|
+
results.append(f)
|
|
112
|
+
return results
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def copy_with_sidecars(src_nifti: Path, dst_dir: Path, dst_stem: str) -> List[Path]:
|
|
116
|
+
"""Copy NIfTI file and its sidecar files to destination."""
|
|
117
|
+
dst_dir.mkdir(parents=True, exist_ok=True)
|
|
118
|
+
copied = []
|
|
119
|
+
|
|
120
|
+
ext = ".nii.gz" if src_nifti.name.endswith(".nii.gz") else ".nii"
|
|
121
|
+
dst_nifti = dst_dir / f"{dst_stem}{ext}"
|
|
122
|
+
if not dst_nifti.exists():
|
|
123
|
+
shutil.copy2(str(src_nifti), str(dst_nifti))
|
|
124
|
+
copied.append(dst_nifti)
|
|
125
|
+
|
|
126
|
+
src_stem = src_nifti.name
|
|
127
|
+
if src_stem.endswith(".nii.gz"):
|
|
128
|
+
src_stem = src_stem[:-7]
|
|
129
|
+
elif src_stem.endswith(".nii"):
|
|
130
|
+
src_stem = src_stem[:-4]
|
|
131
|
+
|
|
132
|
+
for sidecar_ext in SIDECAR_EXTENSIONS:
|
|
133
|
+
src_sidecar = src_nifti.parent / f"{src_stem}{sidecar_ext}"
|
|
134
|
+
if src_sidecar.exists():
|
|
135
|
+
dst_sidecar = dst_dir / f"{dst_stem}{sidecar_ext}"
|
|
136
|
+
if not dst_sidecar.exists():
|
|
137
|
+
shutil.copy2(str(src_sidecar), str(dst_sidecar))
|
|
138
|
+
copied.append(dst_sidecar)
|
|
139
|
+
|
|
140
|
+
return copied
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def write_dataset_description(bids_root: Path) -> None:
|
|
144
|
+
"""Write BIDS dataset_description.json."""
|
|
145
|
+
desc = {
|
|
146
|
+
"Name": "AIBL (Australian Imaging, Biomarkers and Lifestyle)",
|
|
147
|
+
"BIDSVersion": "1.8.0",
|
|
148
|
+
"DatasetType": "raw",
|
|
149
|
+
"GeneratedBy": [
|
|
150
|
+
{
|
|
151
|
+
"Name": "NeuroClaw aibl-skill",
|
|
152
|
+
"Description": "AIBL raw data reorganized to BIDS structure",
|
|
153
|
+
"Version": "1.0.0",
|
|
154
|
+
}
|
|
155
|
+
],
|
|
156
|
+
}
|
|
157
|
+
desc_path = bids_root / "dataset_description.json"
|
|
158
|
+
with open(desc_path, "w", encoding="utf-8") as f:
|
|
159
|
+
json.dump(desc, f, indent=2, ensure_ascii=False)
|
|
160
|
+
print(f"[OK] Wrote {desc_path}")
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def write_participants_tsv(bids_root: Path, subject_ids: List[str]) -> None:
|
|
164
|
+
"""Write BIDS participants.tsv header."""
|
|
165
|
+
tsv_path = bids_root / "participants.tsv"
|
|
166
|
+
with open(tsv_path, "w", encoding="utf-8") as f:
|
|
167
|
+
f.write("participant_id\n")
|
|
168
|
+
for sid in sorted(set(subject_ids)):
|
|
169
|
+
f.write(f"{sid}\n")
|
|
170
|
+
print(f"[OK] Wrote {tsv_path} ({len(set(subject_ids))} participants)")
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def detect_subject_layout(input_dir: Path) -> str:
|
|
174
|
+
"""Detect whether input follows flat or nested AIBL layout.
|
|
175
|
+
|
|
176
|
+
Returns 'flat' if subject dirs are direct children,
|
|
177
|
+
'nested' if organized as subject/visit/modality.
|
|
178
|
+
"""
|
|
179
|
+
children = list(input_dir.iterdir())
|
|
180
|
+
if not children:
|
|
181
|
+
return "flat"
|
|
182
|
+
|
|
183
|
+
first_child = children[0]
|
|
184
|
+
if first_child.is_dir():
|
|
185
|
+
sub_children = list(first_child.iterdir())
|
|
186
|
+
if sub_children:
|
|
187
|
+
# Check if children look like visit names
|
|
188
|
+
for sc in sub_children:
|
|
189
|
+
if sc.is_dir() and any(
|
|
190
|
+
k in sc.name.lower() for k in ["screening", "baseline", "month", "visit"]
|
|
191
|
+
):
|
|
192
|
+
return "nested"
|
|
193
|
+
# Check if children look like modality folders
|
|
194
|
+
for sc in sub_children:
|
|
195
|
+
if sc.is_dir() and detect_modality(sc.name):
|
|
196
|
+
return "flat"
|
|
197
|
+
|
|
198
|
+
return "flat"
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def process_flat_layout(
|
|
202
|
+
input_dir: Path,
|
|
203
|
+
bids_root: Path,
|
|
204
|
+
participants: List[str],
|
|
205
|
+
dry_run: bool = False,
|
|
206
|
+
) -> Tuple[int, int, int]:
|
|
207
|
+
"""Process flat AIBL layout: subject/modality/files."""
|
|
208
|
+
converted = 0
|
|
209
|
+
skipped = 0
|
|
210
|
+
failed = 0
|
|
211
|
+
|
|
212
|
+
subject_dirs = sorted(
|
|
213
|
+
[p for p in input_dir.iterdir() if p.is_dir() and not p.name.startswith(".")]
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
for subject_dir in subject_dirs:
|
|
217
|
+
sub_label = normalize_subject_id(subject_dir.name)
|
|
218
|
+
participants.append(sub_label)
|
|
219
|
+
|
|
220
|
+
for modality_dir in sorted(subject_dir.iterdir()):
|
|
221
|
+
if not modality_dir.is_dir():
|
|
222
|
+
continue
|
|
223
|
+
|
|
224
|
+
nifti_files = find_nifti_files(modality_dir)
|
|
225
|
+
for nifti in nifti_files:
|
|
226
|
+
result = detect_modality(nifti.name)
|
|
227
|
+
if result is None:
|
|
228
|
+
result = detect_modality(modality_dir.name)
|
|
229
|
+
if result is None:
|
|
230
|
+
print(f"[WARN] {sub_label} | cannot detect modality: {nifti.name}")
|
|
231
|
+
failed += 1
|
|
232
|
+
continue
|
|
233
|
+
|
|
234
|
+
bids_suffix, bids_folder, tracer = result
|
|
235
|
+
|
|
236
|
+
ses_label = "ses-baseline"
|
|
237
|
+
|
|
238
|
+
if bids_folder == "pet":
|
|
239
|
+
dst_stem = f"{sub_label}_{ses_label}_trc-{tracer}_{bids_suffix}"
|
|
240
|
+
else:
|
|
241
|
+
dst_stem = f"{sub_label}_{ses_label}_{bids_suffix}"
|
|
242
|
+
|
|
243
|
+
bids_sub_dir = bids_root / sub_label / ses_label / bids_folder
|
|
244
|
+
|
|
245
|
+
ext = ".nii.gz" if nifti.name.endswith(".nii.gz") else ".nii"
|
|
246
|
+
if (bids_sub_dir / f"{dst_stem}{ext}").exists():
|
|
247
|
+
skipped += 1
|
|
248
|
+
continue
|
|
249
|
+
|
|
250
|
+
if dry_run:
|
|
251
|
+
print(f"[DRY] {sub_label}/{ses_label}/{bids_folder}/{dst_stem}")
|
|
252
|
+
converted += 1
|
|
253
|
+
else:
|
|
254
|
+
copy_with_sidecars(nifti, bids_sub_dir, dst_stem)
|
|
255
|
+
print(f"[OK] {sub_label}/{ses_label}/{bids_folder}/{dst_stem}")
|
|
256
|
+
converted += 1
|
|
257
|
+
|
|
258
|
+
return converted, skipped, failed
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
def process_nested_layout(
|
|
262
|
+
input_dir: Path,
|
|
263
|
+
bids_root: Path,
|
|
264
|
+
participants: List[str],
|
|
265
|
+
dry_run: bool = False,
|
|
266
|
+
) -> Tuple[int, int, int]:
|
|
267
|
+
"""Process nested AIBL layout: subject/visit/modality/files."""
|
|
268
|
+
converted = 0
|
|
269
|
+
skipped = 0
|
|
270
|
+
failed = 0
|
|
271
|
+
|
|
272
|
+
subject_dirs = sorted(
|
|
273
|
+
[p for p in input_dir.iterdir() if p.is_dir() and not p.name.startswith(".")]
|
|
274
|
+
)
|
|
275
|
+
|
|
276
|
+
for subject_dir in subject_dirs:
|
|
277
|
+
sub_label = normalize_subject_id(subject_dir.name)
|
|
278
|
+
participants.append(sub_label)
|
|
279
|
+
|
|
280
|
+
for visit_dir in sorted(subject_dir.iterdir()):
|
|
281
|
+
if not visit_dir.is_dir():
|
|
282
|
+
continue
|
|
283
|
+
|
|
284
|
+
ses_label = normalize_session(visit_dir.name)
|
|
285
|
+
|
|
286
|
+
for modality_dir in sorted(visit_dir.iterdir()):
|
|
287
|
+
if not modality_dir.is_dir():
|
|
288
|
+
continue
|
|
289
|
+
|
|
290
|
+
nifti_files = find_nifti_files(modality_dir)
|
|
291
|
+
if not nifti_files:
|
|
292
|
+
nifti_files = find_nifti_files(visit_dir)
|
|
293
|
+
nifti_files = [f for f in nifti_files if f.parent == modality_dir]
|
|
294
|
+
|
|
295
|
+
for nifti in nifti_files:
|
|
296
|
+
result = detect_modality(nifti.name)
|
|
297
|
+
if result is None:
|
|
298
|
+
result = detect_modality(modality_dir.name)
|
|
299
|
+
if result is None:
|
|
300
|
+
print(
|
|
301
|
+
f"[WARN] {sub_label}/{ses_label} | cannot detect modality: {nifti.name}"
|
|
302
|
+
)
|
|
303
|
+
failed += 1
|
|
304
|
+
continue
|
|
305
|
+
|
|
306
|
+
bids_suffix, bids_folder, tracer = result
|
|
307
|
+
|
|
308
|
+
if bids_folder == "pet":
|
|
309
|
+
dst_stem = f"{sub_label}_{ses_label}_trc-{tracer}_{bids_suffix}"
|
|
310
|
+
else:
|
|
311
|
+
dst_stem = f"{sub_label}_{ses_label}_{bids_suffix}"
|
|
312
|
+
|
|
313
|
+
bids_sub_dir = bids_root / sub_label / ses_label / bids_folder
|
|
314
|
+
|
|
315
|
+
ext = ".nii.gz" if nifti.name.endswith(".nii.gz") else ".nii"
|
|
316
|
+
if (bids_sub_dir / f"{dst_stem}{ext}").exists():
|
|
317
|
+
skipped += 1
|
|
318
|
+
continue
|
|
319
|
+
|
|
320
|
+
if dry_run:
|
|
321
|
+
print(
|
|
322
|
+
f"[DRY] {sub_label}/{ses_label}/{bids_folder}/{dst_stem}"
|
|
323
|
+
)
|
|
324
|
+
converted += 1
|
|
325
|
+
else:
|
|
326
|
+
copy_with_sidecars(nifti, bids_sub_dir, dst_stem)
|
|
327
|
+
print(
|
|
328
|
+
f"[OK] {sub_label}/{ses_label}/{bids_folder}/{dst_stem}"
|
|
329
|
+
)
|
|
330
|
+
converted += 1
|
|
331
|
+
|
|
332
|
+
return converted, skipped, failed
|
|
333
|
+
|
|
334
|
+
|
|
335
|
+
def main() -> int:
|
|
336
|
+
parser = argparse.ArgumentParser(
|
|
337
|
+
description="Reorganize AIBL raw data into BIDS-compliant structure."
|
|
338
|
+
)
|
|
339
|
+
parser.add_argument(
|
|
340
|
+
"--input",
|
|
341
|
+
required=True,
|
|
342
|
+
help="Path to AIBL raw data directory",
|
|
343
|
+
)
|
|
344
|
+
parser.add_argument(
|
|
345
|
+
"--output",
|
|
346
|
+
required=True,
|
|
347
|
+
help="Path to output BIDS directory",
|
|
348
|
+
)
|
|
349
|
+
parser.add_argument(
|
|
350
|
+
"--participants-file",
|
|
351
|
+
help="Optional: path to AIBL phenotype file for participant metadata",
|
|
352
|
+
)
|
|
353
|
+
parser.add_argument(
|
|
354
|
+
"--dry-run",
|
|
355
|
+
action="store_true",
|
|
356
|
+
help="Preview without copying files",
|
|
357
|
+
)
|
|
358
|
+
args = parser.parse_args()
|
|
359
|
+
|
|
360
|
+
input_dir = Path(args.input).resolve()
|
|
361
|
+
output_dir = Path(args.output).resolve()
|
|
362
|
+
|
|
363
|
+
if not input_dir.exists() or not input_dir.is_dir():
|
|
364
|
+
print(f"Input directory does not exist: {input_dir}", file=sys.stderr)
|
|
365
|
+
return 1
|
|
366
|
+
|
|
367
|
+
output_dir.mkdir(parents=True, exist_ok=True)
|
|
368
|
+
participants: List[str] = []
|
|
369
|
+
|
|
370
|
+
layout = detect_subject_layout(input_dir)
|
|
371
|
+
print(f"Detected layout: {layout}")
|
|
372
|
+
print(f"Input: {input_dir}")
|
|
373
|
+
print(f"Output: {output_dir}")
|
|
374
|
+
print(f"{'[DRY RUN] ' if args.dry_run else ''}Starting reorganization...\n")
|
|
375
|
+
|
|
376
|
+
if layout == "nested":
|
|
377
|
+
converted, skipped, failed = process_nested_layout(
|
|
378
|
+
input_dir, output_dir, participants, args.dry_run
|
|
379
|
+
)
|
|
380
|
+
else:
|
|
381
|
+
converted, skipped, failed = process_flat_layout(
|
|
382
|
+
input_dir, output_dir, participants, args.dry_run
|
|
383
|
+
)
|
|
384
|
+
|
|
385
|
+
if not args.dry_run and converted > 0:
|
|
386
|
+
write_dataset_description(output_dir)
|
|
387
|
+
write_participants_tsv(output_dir, participants)
|
|
388
|
+
|
|
389
|
+
print(f"\nDone. Converted={converted}, Skipped={skipped}, Failed={failed}")
|
|
390
|
+
return 0 if failed == 0 else 2
|
|
391
|
+
|
|
392
|
+
|
|
393
|
+
if __name__ == "__main__":
|
|
394
|
+
sys.exit(main())
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: aomic-skill
|
|
3
|
+
description: "Use this skill whenever the user wants an end-to-end workflow for the AOMIC (Amsterdam Open MRI Collection) dataset, including data access, BIDS organization, and multimodal processing of sMRI, rs-fMRI, and task-fMRI. Triggers include: 'AOMIC', 'AOMIC data', 'process AOMIC', 'AOMIC fMRI', 'AOMIC resting state', or any request to run the AOMIC multimodal pipeline. This is the NeuroClaw dataset-orchestration layer for AOMIC."
|
|
4
|
+
license: MIT License (NeuroClaw custom skill - freely modifiable within the project)
|
|
5
|
+
layer: subagent
|
|
6
|
+
skill_type: dataset
|
|
7
|
+
dependencies:
|
|
8
|
+
- smri-skill
|
|
9
|
+
- fmri-skill
|
|
10
|
+
- bids-organizer
|
|
11
|
+
- claw-shell
|
|
12
|
+
---
|
|
13
|
+
# AOMIC Skill (Dataset-Orchestration Layer)
|
|
14
|
+
|
|
15
|
+
## Overview
|
|
16
|
+
`aomic-skill` is the NeuroClaw orchestration skill for the **AOMIC (Amsterdam Open MRI Collection)** dataset.
|
|
17
|
+
|
|
18
|
+
It coordinates a fixed three-phase workflow:
|
|
19
|
+
1. Guide AOMIC data access and download from OpenNeuro / the AOMIC repository.
|
|
20
|
+
2. Prepare and validate BIDS-style data organization for downstream processing.
|
|
21
|
+
3. Delegate modality pipelines to `smri-skill` and `fmri-skill`.
|
|
22
|
+
|
|
23
|
+
It also provides **phenotype extraction** and **QC integration** paths:
|
|
24
|
+
- Extract and merge AOMIC phenotype tables (Big Five personality traits, fluid intelligence, demographics).
|
|
25
|
+
- Generate per-subject QC summaries with exclusion lists.
|
|
26
|
+
|
|
27
|
+
This skill follows NeuroClaw hierarchy:
|
|
28
|
+
- Defines **WHAT to do**, not low-level implementation details.
|
|
29
|
+
- Does **not** execute direct shell commands itself.
|
|
30
|
+
- Delegates all execution via `claw-shell` to base/tool skills.
|
|
31
|
+
|
|
32
|
+
**Research use only.**
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Download Stage (Mandatory First Step)
|
|
37
|
+
|
|
38
|
+
### Source
|
|
39
|
+
AOMIC data is publicly available:
|
|
40
|
+
- Website: https://nilab-uva.github.io/AOMIC.github.io/
|
|
41
|
+
- OpenNeuro derivatives: https://openneuro.org/
|
|
42
|
+
- Data access: direct download, no authentication required for most components
|
|
43
|
+
|
|
44
|
+
### Supported AOMIC Sub-datasets
|
|
45
|
+
- **AOMIC-ID1000**: ~1,000 participants with T1w, rs-fMRI, task-fMRI (emotion, gambling, motor, language tasks), Big Five personality, Raven's progressive matrices
|
|
46
|
+
- **AOMIC-PIOP1**: T1w, rs-fMRI, task-fMRI (emotion, working memory), personality and cognitive data
|
|
47
|
+
- **AOMIC-PIOP2**: T1w, rs-fMRI, task-fMRI (emotion, working memory), personality and cognitive data
|
|
48
|
+
|
|
49
|
+
### Delegation Rules for Download
|
|
50
|
+
- Environment/setup checks: `dependency-planner` + `conda-env-manager`
|
|
51
|
+
- Download tool installation and execution: `claw-shell`
|
|
52
|
+
- Optional raw-data organization to BIDS-style staging: `bids-organizer`
|
|
53
|
+
|
|
54
|
+
### Download Inputs to Confirm in Plan
|
|
55
|
+
- Target sub-dataset (ID1000, PIOP1, PIOP2, or all)
|
|
56
|
+
- Subject list scope (full cohort or custom subset)
|
|
57
|
+
- Destination directory with sufficient disk space
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Narrow Path: AOMIC Raw Data -> BIDS Staging
|
|
62
|
+
|
|
63
|
+
Use this path when the task only asks to reorganize raw AOMIC files into a BIDS-style dataset and does not require preprocessing, ROI extraction, phenotype merging, or downstream analysis.
|
|
64
|
+
|
|
65
|
+
### When this narrow path should dominate
|
|
66
|
+
- The task objective is limited to AOMIC data staging, BIDS renaming, sidecar handling, and dataset-level metadata.
|
|
67
|
+
- Inputs are already local AOMIC files or AOMIC-style subject folders.
|
|
68
|
+
- The required deliverable is a direct staging script or command sequence, not a plan for preprocessing or downstream analysis.
|
|
69
|
+
|
|
70
|
+
### Narrow-path contract
|
|
71
|
+
- Do not widen the solution to preprocessing, ROI extraction, phenotype merging, or downstream analysis unless the task explicitly requires them.
|
|
72
|
+
- Treat this as a direct file-organization problem: scan AOMIC subject layout, normalize subject labels, map modalities to BIDS names, copy or symlink files plus matching sidecars, and write dataset-level metadata plus staging logs.
|
|
73
|
+
- If the task is benchmark-style, prefer a single direct end-to-end staging script over a confirmation-first orchestration plan.
|
|
74
|
+
|
|
75
|
+
### Expected narrow-path behavior
|
|
76
|
+
1. Detect AOMIC subject IDs (e.g., `sub-0001`) and validate BIDS compliance.
|
|
77
|
+
2. Detect session/task information from directory structure and filenames.
|
|
78
|
+
3. Route modalities:
|
|
79
|
+
- T1w -> `anat/*_T1w`
|
|
80
|
+
- rs-fMRI -> `func/*_task-rest_bold`
|
|
81
|
+
- task-fMRI -> `func/*_task-<taskname>_bold` (emotion, gambling, motor, language, workingmemory)
|
|
82
|
+
4. Preserve or rename matching JSON sidecars and physiological recordings when available.
|
|
83
|
+
5. Emit dataset-level outputs such as `dataset_description.json`, `participants.tsv`, `README`, and a manifest or skipped-file report.
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Core Workflow (Never Bypassed)
|
|
88
|
+
1. Identify user target: full AOMIC processing, specific sub-dataset, phenotype extraction, or BIDS staging only.
|
|
89
|
+
2. Generate a numbered plan with tools, outputs, runtime, storage, and risks.
|
|
90
|
+
3. Wait for explicit confirmation (`YES` / `execute` / `proceed`).
|
|
91
|
+
4. On confirmation, run download stage first (if needed).
|
|
92
|
+
5. After download success, run BIDS preparation using `scripts/reorganize_aomic.py`.
|
|
93
|
+
6. Delegate sequentially or in parallel to:
|
|
94
|
+
- `smri-skill` for structural MRI (T1w)
|
|
95
|
+
- `fmri-skill` for functional MRI (rs-fMRI, task-fMRI)
|
|
96
|
+
7. If phenotype extraction is requested, run `scripts/extract_aomic_phenotype.py`.
|
|
97
|
+
8. If QC summary is requested, run `scripts/aomic_qc_summary.py`.
|
|
98
|
+
9. Save outputs into an AOMIC-centered structure under `aomic_output/`.
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## Input Layout (Example)
|
|
103
|
+
|
|
104
|
+
Subject `sub-0001` (T1w + rs-fMRI + task-fMRI):
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
aomic_raw/
|
|
108
|
+
sub-0001/
|
|
109
|
+
anat/
|
|
110
|
+
sub-0001_T1w.nii.gz
|
|
111
|
+
sub-0001_T1w.json
|
|
112
|
+
func/
|
|
113
|
+
sub-0001_task-rest_bold.nii.gz
|
|
114
|
+
sub-0001_task-rest_bold.json
|
|
115
|
+
sub-0001_task-emotion_bold.nii.gz
|
|
116
|
+
sub-0001_task-emotion_bold.json
|
|
117
|
+
sub-0001_task-gambling_bold.nii.gz
|
|
118
|
+
sub-0001_task-gambling_bold.json
|
|
119
|
+
sub-0001_task-motor_bold.nii.gz
|
|
120
|
+
sub-0001_task-motor_bold.json
|
|
121
|
+
sub-0001_task-language_bold.nii.gz
|
|
122
|
+
sub-0001_task-language_bold.json
|
|
123
|
+
phenotype/
|
|
124
|
+
big_five.csv
|
|
125
|
+
ravens.csv
|
|
126
|
+
demographics.csv
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## BIDS Preparation
|
|
132
|
+
|
|
133
|
+
### Script: `scripts/reorganize_aomic.py`
|
|
134
|
+
|
|
135
|
+
Validates and reorganizes AOMIC data into BIDS-compliant layout.
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
python skills/aomic-skill/scripts/reorganize_aomic.py \
|
|
139
|
+
--input /path/to/aomic_raw \
|
|
140
|
+
--output /path/to/aomic_bids \
|
|
141
|
+
--participants-file /path/to/aomic_raw/phenotype/demographics.csv
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Features:
|
|
145
|
+
- Subject ID validation (BIDS-compliant `sub-XXXX` format)
|
|
146
|
+
- Session/task detection from directory structure and filenames
|
|
147
|
+
- Modality routing: T1w, rs-fMRI, task-fMRI (emotion, gambling, motor, language, workingmemory)
|
|
148
|
+
- Sidecar JSON preservation and validation
|
|
149
|
+
- Physiological recording file handling
|
|
150
|
+
- `dataset_description.json` and `participants.tsv` generation
|
|
151
|
+
- Dry-run mode: `--dry-run` to preview without copying
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## Modality Processing Delegation
|
|
156
|
+
|
|
157
|
+
After BIDS staging completes, `aomic-skill` delegates by modality:
|
|
158
|
+
|
|
159
|
+
| Modality | Delegated skill | Typical tasks | Main outputs |
|
|
160
|
+
|---|---|---|---|
|
|
161
|
+
| sMRI (T1w) | `smri-skill` | brain extraction, tissue segmentation, cortical reconstruction, ROI morphometry | `smri_output/` derivatives and stats |
|
|
162
|
+
| fMRI (rs-fMRI/task-fMRI) | `fmri-skill` | preprocessing, denoising, ROI time series, connectivity, task GLM | `fmri_output/` derivatives, timeseries, connectivity |
|
|
163
|
+
|
|
164
|
+
### Delegation Strategy
|
|
165
|
+
- If user asks for full multimodal AOMIC analysis: run sMRI -> fMRI in ordered phases.
|
|
166
|
+
- If user asks for one modality only: call only the corresponding modality skill.
|
|
167
|
+
- Task-fMRI analysis should use task-specific event files (emotion, gambling, motor, language, workingmemory).
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## Phenotype Extraction
|
|
172
|
+
|
|
173
|
+
### Script: `scripts/extract_aomic_phenotype.py`
|
|
174
|
+
|
|
175
|
+
Extracts and merges AOMIC phenotype tables for downstream analysis.
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
python skills/aomic-skill/scripts/extract_aomic_phenotype.py \
|
|
179
|
+
--phenotype-dir /path/to/aomic_raw/phenotype \
|
|
180
|
+
--output /path/to/aomic_output/phenotype/merged_phenotype.csv \
|
|
181
|
+
--columns subject_id,age,sex,openness,conscientiousness,extraversion,agreeableness,neuroticism,ravens_score \
|
|
182
|
+
--imaging-ids /path/to/aomic_output/bids/participants.tsv
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
Features:
|
|
186
|
+
- Reads AOMIC phenotype CSV/TSV files (Big Five, Raven's, demographics)
|
|
187
|
+
- Column selection and renaming
|
|
188
|
+
- Missing value handling (filter or impute)
|
|
189
|
+
- Cross-reference with imaging subject list to keep only subjects with both imaging and phenotype data
|
|
190
|
+
- Outputs merged CSV ready for statistical analysis or model training
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## QC Integration
|
|
195
|
+
|
|
196
|
+
### Script: `scripts/aomic_qc_summary.py`
|
|
197
|
+
|
|
198
|
+
Generates per-subject QC summaries and exclusion lists.
|
|
199
|
+
|
|
200
|
+
```bash
|
|
201
|
+
python skills/aomic-skill/scripts/aomic_qc_summary.py \
|
|
202
|
+
--fmriprep-dir /path/to/aomic_output/fmriprep \
|
|
203
|
+
--freesurfer-dir /path/to/aomic_output/smri/freesurfer \
|
|
204
|
+
--output /path/to/aomic_output/qc/qc_summary.csv \
|
|
205
|
+
--exclude-output /path/to/aomic_output/qc/exclude_list.csv \
|
|
206
|
+
--fd-threshold 0.3
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
Features:
|
|
210
|
+
- Reads fMRIPrep confounds (framewise displacement, DVARS)
|
|
211
|
+
- Reads FreeSurfer recon-all QC metrics
|
|
212
|
+
- Structural quality assessment
|
|
213
|
+
- Applies exclusion criteria: motion threshold (FD), structural quality
|
|
214
|
+
- Outputs per-subject QC summary CSV and exclusion list CSV
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## Recommended Output Layout
|
|
219
|
+
All assets should be organized under `./aomic_output/`:
|
|
220
|
+
- `aomic_output/raw/` (downloaded original AOMIC files)
|
|
221
|
+
- `aomic_output/bids/` (staged BIDS data)
|
|
222
|
+
- `aomic_output/smri/` (links or copies from `smri_output/`)
|
|
223
|
+
- `aomic_output/fmri/` (links or copies from `fmri_output/`)
|
|
224
|
+
- `aomic_output/phenotype/` (merged phenotype tables)
|
|
225
|
+
- `aomic_output/qc/` (QC summaries and exclusion lists)
|
|
226
|
+
- `aomic_output/logs/` (download + orchestration logs)
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## Benchmark Adapter Guidance
|
|
231
|
+
|
|
232
|
+
For benchmark-style prompts, do not force the full `download -> staging -> multimodal processing` orchestration when the task is only asking for local AOMIC data staging or organization.
|
|
233
|
+
|
|
234
|
+
- If the task starts from raw AOMIC data already present on disk and only asks for BIDS-style staging / organization:
|
|
235
|
+
- skip the mandatory download stage
|
|
236
|
+
- do not automatically delegate to `smri-skill` or `fmri-skill`
|
|
237
|
+
- default to the narrow path `local raw AOMIC discovery -> BIDS-style staging -> minimal metadata -> validation/report`
|
|
238
|
+
- In benchmark mode, do not require explicit confirmation before presenting the direct staging solution.
|
|
239
|
+
- Preserve the AOMIC-centered output contract under `aomic_output/bids/` when the task is specifically a staging benchmark.
|
|
240
|
+
- Only use the full multimodal orchestration and confirmation-heavy workflow when the prompt explicitly asks for download, end-to-end multimodal AOMIC processing, or post-staging structural / functional analysis.
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## Safety and Execution Policy
|
|
245
|
+
- No execution before explicit plan confirmation.
|
|
246
|
+
- All execution must be routed via `claw-shell`.
|
|
247
|
+
- Missing dependencies must be resolved by `dependency-planner` before running.
|
|
248
|
+
- If download fails for partial subjects, continue batch with clear failure report and retry list.
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
## Important Notes and Limitations
|
|
253
|
+
- AOMIC data is already in BIDS format for many components; the reorganize script primarily validates and handles edge cases.
|
|
254
|
+
- AOMIC has multiple sub-datasets (ID1000, PIOP1, PIOP2) with slightly different task paradigms and phenotype measures.
|
|
255
|
+
- Task-fMRI event files (.tsv) must be preserved alongside BOLD data for proper task analysis.
|
|
256
|
+
- Some AOMIC components include physiological recordings (cardiac, respiration) that can be used for advanced denoising.
|
|
257
|
+
- `aomic-skill` is orchestration-only; detailed preprocessing logic remains in `smri-skill` and `fmri-skill`.
|
|
258
|
+
|
|
259
|
+
---
|
|
260
|
+
|
|
261
|
+
## When to Call This Skill
|
|
262
|
+
- User asks for end-to-end AOMIC workflow.
|
|
263
|
+
- User asks to process AOMIC MRI data (sMRI, rs-fMRI, task-fMRI).
|
|
264
|
+
- User needs BIDS staging for raw AOMIC files.
|
|
265
|
+
- User asks to extract and merge AOMIC phenotype tables (personality, cognition, demographics).
|
|
266
|
+
- User asks for AOMIC-specific QC summaries and exclusion lists.
|
|
267
|
+
- User needs a single entry point for AOMIC multimodal orchestration.
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
## Complementary / Related Skills
|
|
272
|
+
- `smri-skill`
|
|
273
|
+
- `fmri-skill`
|
|
274
|
+
- `bids-organizer`
|
|
275
|
+
- `fmriprep-tool`
|
|
276
|
+
- `freesurfer-tool`
|
|
277
|
+
- `nilearn-tool`
|
|
278
|
+
- `brain-visualization`
|
|
279
|
+
- `dependency-planner`
|
|
280
|
+
- `conda-env-manager`
|
|
281
|
+
- `claw-shell`
|
|
282
|
+
|
|
283
|
+
---
|
|
284
|
+
|
|
285
|
+
## Reference
|
|
286
|
+
- AOMIC: https://nilab-uva.github.io/AOMIC.github.io/
|
|
287
|
+
- OpenNeuro: https://openneuro.org/
|
|
288
|
+
- BIDS spec: https://bids.neuroimaging.io/
|
|
289
|
+
|
|
290
|
+
Created At: 2026-05-06 11:24 HKT
|
|
291
|
+
Last Updated At: 2026-05-06 11:24 HKT
|
|
292
|
+
Author: chengwang96
|