[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6DTC1GKMSG2RKY2J46CWQC0":3,"skill-same:01M6DTC1GKMSG2RKY2J46CWQC0":113},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":45,"commitSha":46,"skillDirectory":47,"forksCount":48,"repositoryHtmlUrl":49,"repositoryHomepageUrl":50,"ownerHtmlUrl":51,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":52,"install":53,"resources":66},"01M6DTC1GKMSG2RKY2J46CWQC0","genomics-cnv-calling",null,"Load when calling CNV segments via CBS-style segmentation on a bin-level log2-ratio CSV from exome \u002F WGS coverage — emits per-segment 5-class CN state (`amplification` \u002F `gain` \u002F `neutral` \u002F `loss` \u002F `deep_deletion`), per-chromosome summary, genome-fraction-altered. Skip when working with single-cell \u002F spatial CNV (use spatial-cnv).","TianGzlab\u002FOmicsClaw","TianGzlab","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F150978281?v=4","01M6DT9WNJJ470ADHPSMFAA02Y","01M6DT9WSN09C5K65GB6RK18R9",161,"Apache-2.0","https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Fskills\u002Fgenomics\u002Fgenomics-cnv-calling\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"genomics cnv calling","calling","genomics","cell","gatk-gcnv","cnvkit","copy-number","cnv","single-cell","style","cbs","wgs","state","deep","summary","Spatial","use","coverage","segmentation","csv","2026-11-10 10:12:30",false,"---\nname: genomics-cnv-calling\ndescription: Load when calling CNV segments via CBS-style segmentation on a bin-level log2-ratio CSV from\n  exome \u002F WGS coverage — emits per-segment 5-class CN state (`amplification` \u002F `gain` \u002F `neutral` \u002F `loss`\n  \u002F `deep_deletion`), per-chromosome summary, genome-fraction-altered. Skip when working with single-cell\n  \u002F spatial CNV (use spatial-cnv).\ntrigger: CNV, copy number, amplification, deletion, CNVkit\ntags:\n- genomics\n- cnv\n- copy-number\n- cbs\n- segmentation\n- cnvkit\n- gatk-gcnv\n---\n\n# genomics-cnv-calling\n\n## When to use\n\nLoad this skill for the file-based analysis named in the description.\nThe function library and CLI share the same calculations; no external\naligner, assembler, caller or annotation service is started.\n\n## Use from a step\n\n```python\nfrom skills._sdk.notebook import load_skill, read_input, write_output\nlibrary = load_skill(\"genomics-cnv-calling\")\ndata = read_input(\"input.csv\", reader=library.read_bins)\nresult = library.analyze(data)\nwrite_output(result, \"tables\u002Fresult.csv\")\nwrite_output(library.copy_ratio_figure(result), \"figures\u002Fdistribution.png\")\n```\n\nRun `examples\u002Fexample_step.py` through the step runner for a small,\nhand-worked synthetic fixture. It asserts known summary values.\nThe reader materializes the input in memory; use bounded FASTQ reads or\npre-filter large genomic files before loading them.\n\n## API\n\n\u003C!-- api:begin generated from _api.py; regenerate with run.py api \u003Cskill dir> --write -->\n\n### `read_bins(path: str | Path) -> pd.DataFrame`\n\nRead a bin CSV through read_input(path, reader=library.read_bins).\n\n:param path: CSV containing chrom, start, end and log2_ratio.\n:returns: Bin table.\n:raises ValueError: The CSV cannot be parsed.\n\n### `analyze(data: pd.DataFrame, *, method: str='cbs', alpha: float=0.01) -> pd.DataFrame`\n\nReturn new CNV segments from bin-level log2 ratios; leave data unchanged.\n\n:param data: Bins with chrom, start, end and finite log2_ratio.\n:param method: CLI default cbs, or none to classify individual bins.\n:param alpha: CLI default 0.01; smaller values require stronger splits.\n:returns: Segments with cn_state, estimated_cn and attrs['run_info'].\n:raises ValueError: Columns, coordinates, method or alpha are invalid.\n\n### `run_info(data: pd.DataFrame, *, keep: bool=True) -> dict`\n\nReturn analysis diagnostics and numeric summary.\n\n:param data: Result returned by analyze.\n:param keep: Keep diagnostics by default; the CLI passes False.\n:returns: Independent copy of run diagnostics.\n:raises ValueError: analyze has not populated diagnostics.\n\n### `copy_ratio_figure(data: pd.DataFrame)`\n\nPlot segment log2 ratios in table order without writing a file.\n\n:param data: Segment table returned by analyze.\n:returns: Matplotlib Figure.\n:raises ValueError: log2_ratio is absent or the table is empty.\n\n\u003C!-- api:end -->\n\n## Methods and parameters\n\n`analyze` returns a new DataFrame and leaves the input unchanged.\n`run_info(result)` returns the summary and method diagnostics.\nThe CLI passes `keep=False` so diagnostics do not enter output tables.\nAll calculations are deterministic; synthetic CLI demos retain seed 42.\n\n## Gotchas\n\n- `analyze(method=\"cbs\")` uses the existing simplified deterministic split heuristic, not CNVkit or a calibrated CBS permutation test.\n- `run_info()[\"summary\"][\"genome_fraction_altered\"]` retains the legacy fraction of altered segments, not a base-pair-weighted genome fraction.\n- `analyze(method=\"none\")` classifies individual bins; gain\u002Floss thresholds are 0.3\u002F-0.3 and amplification\u002Fdeep-deletion thresholds are 1\u002F-1.\n\n## Inputs and outputs\n\nInput files:\n\n- File types: `.csv`\n\nCLI output files:\n\n- `tables\u002Fcnv_per_chromosome.csv`\n- `tables\u002Fcnv_segments.csv`\n- `report.md`\n- `result.json`\n\nThe library writes no files. Steps use `write_output`; the CLI owns the\nlisted artifacts. Public figure functions return matplotlib Figures and\ndo not add new CLI outputs.\n\n## CLI\n\n```bash\npython skills\u002Fgenomics\u002Fgenomics-cnv-calling\u002Fgenomics_cnv_calling.py --input input_file --output results\u002F\npython skills\u002Fgenomics\u002Fgenomics-cnv-calling\u002Fgenomics_cnv_calling.py --demo --output \u002Ftmp\u002Fgenomics_cnv_calling_demo\n```\n\n## See also\n\n- `references\u002Fparameters.md`\n- `references\u002Fmethodology.md`\n- `references\u002Foutput_contract.md`\n\n## Dependencies\n\n`numpy`, `pandas`, `matplotlib`\n","# genomics-cnv-calling\n\n## When to use\n\nLoad this skill for the file-based analysis named in the description.\nThe function library and CLI share the same calculations; no external\naligner, assembler, caller or annotation service is started.\n\n## Use from a step\n\n```python\nfrom skills._sdk.notebook import load_skill, read_input, write_output\nlibrary = load_skill(\"genomics-cnv-calling\")\ndata = read_input(\"input.csv\", reader=library.read_bins)\nresult = library.analyze(data)\nwrite_output(result, \"tables\u002Fresult.csv\")\nwrite_output(library.copy_ratio_figure(result), \"figures\u002Fdistribution.png\")\n```\n\nRun `examples\u002Fexample_step.py` through the step runner for a small,\nhand-worked synthetic fixture. It asserts known summary values.\nThe reader materializes the input in memory; use bounded FASTQ reads or\npre-filter large genomic files before loading them.\n\n## API\n\n\u003C!-- api:begin generated from _api.py; regenerate with run.py api \u003Cskill dir> --write -->\n\n### `read_bins(path: str | Path) -> pd.DataFrame`\n\nRead a bin CSV through read_input(path, reader=library.read_bins).\n\n:param path: CSV containing chrom, start, end and log2_ratio.\n:returns: Bin table.\n:raises ValueError: The CSV cannot be parsed.\n\n### `analyze(data: pd.DataFrame, *, method: str='cbs', alpha: float=0.01) -> pd.DataFrame`\n\nReturn new CNV segments from bin-level log2 ratios; leave data unchanged.\n\n:param data: Bins with chrom, start, end and finite log2_ratio.\n:param method: CLI default cbs, or none to classify individual bins.\n:param alpha: CLI default 0.01; smaller values require stronger splits.\n:returns: Segments with cn_state, estimated_cn and attrs['run_info'].\n:raises ValueError: Columns, coordinates, method or alpha are invalid.\n\n### `run_info(data: pd.DataFrame, *, keep: bool=True) -> dict`\n\nReturn analysis diagnostics and numeric summary.\n\n:param data: Result returned by analyze.\n:param keep: Keep diagnostics by default; the CLI passes False.\n:returns: Independent copy of run diagnostics.\n:raises ValueError: analyze has not populated diagnostics.\n\n### `copy_ratio_figure(data: pd.DataFrame)`\n\nPlot segment log2 ratios in table order without writing a file.\n\n:param data: Segment table returned by analyze.\n:returns: Matplotlib Figure.\n:raises ValueError: log2_ratio is absent or the table is empty.\n\n\u003C!-- api:end -->\n\n## Methods and parameters\n\n`analyze` returns a new DataFrame and leaves the input unchanged.\n`run_info(result)` returns the summary and method diagnostics.\nThe CLI passes `keep=False` so diagnostics do not enter output tables.\nAll calculations are deterministic; synthetic CLI demos retain seed 42.\n\n## Gotchas\n\n- `analyze(method=\"cbs\")` uses the existing simplified deterministic split heuristic, not CNVkit or a calibrated CBS permutation test.\n- `run_info()[\"summary\"][\"genome_fraction_altered\"]` retains the legacy fraction of altered segments, not a base-pair-weighted genome fraction.\n- `analyze(method=\"none\")` classifies individual bins; gain\u002Floss thresholds are 0.3\u002F-0.3 and amplification\u002Fdeep-deletion thresholds are 1\u002F-1.\n\n## Inputs and outputs\n\nInput files:\n\n- File types: `.csv`\n\nCLI output files:\n\n- `tables\u002Fcnv_per_chromosome.csv`\n- `tables\u002Fcnv_segments.csv`\n- `report.md`\n- `result.json`\n\nThe library writes no files. Steps use `write_output`; the CLI owns the\nlisted artifacts. Public figure functions return matplotlib Figures and\ndo not add new CLI outputs.\n\n## CLI\n\n```bash\npython skills\u002Fgenomics\u002Fgenomics-cnv-calling\u002Fgenomics_cnv_calling.py --input input_file --output results\u002F\npython skills\u002Fgenomics\u002Fgenomics-cnv-calling\u002Fgenomics_cnv_calling.py --demo --output \u002Ftmp\u002Fgenomics_cnv_calling_demo\n```\n\n## See also\n\n- `references\u002Fparameters.md`\n- `references\u002Fmethodology.md`\n- `references\u002Foutput_contract.md`\n\n## Dependencies\n\n`numpy`, `pandas`, `matplotlib`\n",{"name":5,"tags":43,"trigger":44,"description":7},[20,25,24,28,36,23,22],"CNV, copy number, amplification, deletion, CNVkit","main","90a3bec3e6549bc33dddbf67e4b23869736c49d1","skills\u002Fgenomics\u002Fgenomics-cnv-calling",27,"https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw","https:\u002F\u002FTianGzlab.github.io\u002FOmicsClaw\u002F","https:\u002F\u002Fgithub.com\u002FTianGzlab","2026-10-08 01:36:11",{"source":8,"skillName":5,"commands":54,"prompt":64,"zipAvailable":65},[55,58,61],{"tool":56,"command":57},"npx","npx skills add TianGzlab\u002FOmicsClaw --skill genomics-cnv-calling",{"tool":59,"command":60},"bunx","bunx skills add TianGzlab\u002FOmicsClaw --skill genomics-cnv-calling",{"tool":62,"command":63},"pnpm","pnpm dlx skills add TianGzlab\u002FOmicsClaw --skill genomics-cnv-calling","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Fskills\u002Fgenomics\u002Fgenomics-cnv-calling\u002FSKILL.md",true,[67,73,79,83,87,93,97,101,105,109],{"path":68,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":71,"sourceHtmlUrl":72},"_api.py","SCRIPT","脚本",2793,"https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Fskills\u002Fgenomics\u002Fgenomics-cnv-calling\u002F_api.py",{"path":74,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":77,"sourceHtmlUrl":78},"data\u002Fexample.csv","ASSET","资产文件",418,"https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Fskills\u002Fgenomics\u002Fgenomics-cnv-calling\u002Fdata\u002Fexample.csv",{"path":80,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":81,"sourceHtmlUrl":82},"examples\u002Fexample_step.py",680,"https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Fskills\u002Fgenomics\u002Fgenomics-cnv-calling\u002Fexamples\u002Fexample_step.py",{"path":84,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":85,"sourceHtmlUrl":86},"genomics_cnv_calling.py",7903,"https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Fskills\u002Fgenomics\u002Fgenomics-cnv-calling\u002Fgenomics_cnv_calling.py",{"path":88,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":91,"sourceHtmlUrl":92},"references\u002Fbranch-creation.md","REFERENCE","参考文档",3707,"https:\u002F\u002Fgithub.com\u002FJGXC100\u002FGaleHarnessCodingCLI\u002Fblob\u002Fmain\u002Fplugins\u002Fgaleharness-cli\u002Fskills\u002Fgit-commit-push-pr\u002Freferences\u002Fbranch-creation.md",{"path":94,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":95,"sourceHtmlUrl":96},"references\u002Fmethodology.md",5414,"https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Fskills\u002Fgenomics\u002Fgenomics-cnv-calling\u002Freferences\u002Fmethodology.md",{"path":98,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":99,"sourceHtmlUrl":100},"references\u002Foutput_contract.md",794,"https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Fskills\u002Fgenomics\u002Fgenomics-cnv-calling\u002Freferences\u002Foutput_contract.md",{"path":102,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":103,"sourceHtmlUrl":104},"references\u002Fparameters.md",231,"https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Fskills\u002Fgenomics\u002Fgenomics-cnv-calling\u002Freferences\u002Fparameters.md",{"path":106,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":107,"sourceHtmlUrl":108},"references\u002Fpr-description-writing.md",19509,"https:\u002F\u002Fgithub.com\u002FJGXC100\u002FGaleHarnessCodingCLI\u002Fblob\u002Fmain\u002Fplugins\u002Fgaleharness-cli\u002Fskills\u002Fgit-commit-push-pr\u002Freferences\u002Fpr-description-writing.md",{"path":110,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":111,"sourceHtmlUrl":112},"tests\u002Ftest_api.py",1131,"https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Fskills\u002Fgenomics\u002Fgenomics-cnv-calling\u002Ftests\u002Ftest_api.py",[114,132,144,161,185,206],{"skillNo":115,"name":116,"nameZh":6,"description":117,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":118,"categories":119,"keywords":125,"publishedAt":38},"01M6DTP4X225Q92RMY8XXHPCTT","demo-skill","A fixture skill for the skill environment tests. Use it for nothing else.","https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Ftests\u002Fskillenv\u002Ffixtures\u002Fskills\u002Fdemo\u002Fdemo-skill\u002FSKILL.md",[120],{"categoryNo":121,"categoryName":122,"taxonomyType":123,"taxonomyTypeDesc":124},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[126,127,128,129,130,34,131],"demo skill","demo","tests","fixture","fixture skill","environment",{"skillNo":133,"name":134,"nameZh":6,"description":135,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":136,"categories":137,"keywords":138,"publishedAt":38},"01M6DTP28JTWQK3HHXDNQV8BBV","fake-domains","Test fixture for the golden deployment in tests\u002Fentry. Load never; it has no script.","https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Ftests\u002Fentry\u002Ffake_skills\u002Fspatial\u002Ffake-domains\u002FSKILL.md",[],[139,140,141,128,129,142,143],"domains","fake domains","deployment","never","test",{"skillNo":145,"name":146,"nameZh":6,"description":147,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":148,"categories":149,"keywords":151,"publishedAt":38},"01M6DTNZ4AMWKTME1T18K5C643","replace-me-skill","Load when copying this directory to bootstrap a new OmicsClaw skill. Skip when an existing skill already covers the request.","https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Ftemplates\u002Fskill\u002FSKILL.md",[150],{"categoryNo":121,"categoryName":122,"taxonomyType":123,"taxonomyTypeDesc":124},[152,153,154,155,156,157,158,159,160],"me","replace me skill","template","directory","skill template","existing skill","new skill","bootstrap","scaffold",{"skillNo":162,"name":163,"nameZh":6,"description":164,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":165,"categories":166,"keywords":167,"publishedAt":38},"01M6DTNV63MTD0Q6YRC52F0B1Y","spatial-velocity","Load when estimating RNA velocity on a spatial AnnData with `layers[\"spliced\"]` + `layers[\"unspliced\"]` via scVelo (stochastic \u002F deterministic \u002F dynamical) or veloVI (deep generative). Skip when input lacks the spliced\u002Funspliced layers (must be quantified upstream by velocyto \u002F kb-python \u002F STARsolo); non-spatial scRNA velocity (use sc-velocity).","https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Fskills\u002Fspatial\u002Fspatial-velocity\u002FSKILL.md",[],[168,169,33,170,171,172,173,31,174,175,176,177,178,179,180,181,182,34,183,184],"velocity","spatial velocity","scvelo","input","starsolo","time","RNA","kb-python","via","velocyto","rna-velocity","velovi","dynamics","upstream","kb","python","deterministic",{"skillNo":186,"name":187,"nameZh":6,"description":188,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":189,"categories":190,"keywords":191,"publishedAt":38},"01M6DTNPMR227NAT8QFY620YDW","spatial-trajectory","Load when inferring pseudotime \u002F lineage trajectories on a preprocessed spatial AnnData via DPT (default — diffusion pseudotime), CellRank (terminal-state + fate-probability), or Palantir (waypoint branch probabilities). Skip when the data has spliced\u002Funspliced layers and you want velocity-driven dynamics (use spatial-velocity); non-spatial scRNA pseudotime (use sc-pseudotime).","https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Fskills\u002Fspatial\u002Fspatial-trajectory\u002FSKILL.md",[],[33,192,193,30,194,195,196,197,176,198,199,200,201,21,168,202,34,203,204,205],"trajectory","spatial trajectory","terminal","lineage","diffusion","cellrank","palantir","dpt","pseudotime","probability","default","branch","anndata","data",{"skillNo":207,"name":208,"nameZh":6,"description":209,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":210,"categories":211,"keywords":212,"publishedAt":38},"01M6DTNJEYFT33P84DGHDNXW95","spatial-statistics","Load when running spatial autocorrelation \u002F hotspot \u002F co-occurrence \u002F neighbourhood-enrichment \u002F Ripley K stats on a clustered spatial AnnData via squidpy. Skip when ranking spatially variable genes (use spatial-genes); tissue domain detection (use spatial-domains).","https:\u002F\u002Fgithub.com\u002FTianGzlab\u002FOmicsClaw\u002Fblob\u002Fmain\u002Fskills\u002Fspatial\u002Fspatial-statistics\u002FSKILL.md",[],[213,214,33,176,215,216,217,218,219,220,139,221,222,223,224,34,204,225,226,227],"spatial statistics","statistics","nhood-enrichment","co-occurrence","ripley","geary","moran","neighbourhood","ranking","autocorrelation","local","domain","detection","enrichment","stats"]