@bgicli/bgicli 2.1.1 → 2.2.0
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/data/skills/aav-vector-design-agent/SKILL.md +198 -0
- package/data/skills/adaptyv/SKILL.md +112 -0
- package/data/skills/adhd-daily-planner/SKILL.md +271 -0
- package/data/skills/aeon/SKILL.md +372 -0
- package/data/skills/agent-browser/SKILL.md +159 -0
- package/data/skills/agentd-drug-discovery/SKILL.md +52 -0
- package/data/skills/ai-analyzer/SKILL.md +218 -0
- package/data/skills/alphafold/SKILL.md +183 -0
- package/data/skills/alphafold-database/SKILL.md +500 -0
- package/data/skills/anndata/SKILL.md +394 -0
- package/data/skills/antibody-design-agent/SKILL.md +64 -0
- package/data/skills/arboreto/SKILL.md +237 -0
- package/data/skills/armored-cart-design-agent/SKILL.md +225 -0
- package/data/skills/arxiv-search/SKILL.md +224 -0
- package/data/skills/autonomous-oncology-agent/SKILL.md +77 -0
- package/data/skills/bayesian-optimizer/SKILL.md +60 -0
- package/data/skills/benchling-integration/SKILL.md +473 -0
- package/data/skills/bgpt-paper-search/SKILL.md +81 -0
- package/data/skills/bindcraft/SKILL.md +198 -0
- package/data/skills/binder-design/SKILL.md +182 -0
- package/data/skills/binding-characterization/SKILL.md +234 -0
- package/data/skills/bindingdb-database/SKILL.md +332 -0
- package/data/skills/bio-admet-prediction/SKILL.md +224 -0
- package/data/skills/bio-alignment-files-bam-statistics/SKILL.md +340 -0
- package/data/skills/bio-alignment-filtering/SKILL.md +322 -0
- package/data/skills/bio-alignment-indexing/SKILL.md +249 -0
- package/data/skills/bio-alignment-io/SKILL.md +301 -0
- package/data/skills/bio-alignment-msa-parsing/SKILL.md +366 -0
- package/data/skills/bio-alignment-msa-statistics/SKILL.md +375 -0
- package/data/skills/bio-alignment-pairwise/SKILL.md +277 -0
- package/data/skills/bio-alignment-sorting/SKILL.md +296 -0
- package/data/skills/bio-alignment-validation/SKILL.md +374 -0
- package/data/skills/bio-atac-seq-atac-peak-calling/SKILL.md +221 -0
- package/data/skills/bio-atac-seq-atac-qc/SKILL.md +292 -0
- package/data/skills/bio-atac-seq-differential-accessibility/SKILL.md +268 -0
- package/data/skills/bio-atac-seq-footprinting/SKILL.md +256 -0
- package/data/skills/bio-atac-seq-motif-deviation/SKILL.md +319 -0
- package/data/skills/bio-atac-seq-nucleosome-positioning/SKILL.md +321 -0
- package/data/skills/bio-basecalling/SKILL.md +368 -0
- package/data/skills/bio-batch-downloads/SKILL.md +384 -0
- package/data/skills/bio-batch-processing/SKILL.md +303 -0
- package/data/skills/bio-bedgraph-handling/SKILL.md +336 -0
- package/data/skills/bio-blast-searches/SKILL.md +354 -0
- package/data/skills/bio-causal-genomics-colocalization-analysis/SKILL.md +264 -0
- package/data/skills/bio-causal-genomics-fine-mapping/SKILL.md +267 -0
- package/data/skills/bio-causal-genomics-mediation-analysis/SKILL.md +264 -0
- package/data/skills/bio-causal-genomics-mendelian-randomization/SKILL.md +221 -0
- package/data/skills/bio-causal-genomics-pleiotropy-detection/SKILL.md +292 -0
- package/data/skills/bio-cfdna-preprocessing/SKILL.md +200 -0
- package/data/skills/bio-chipseq-differential-binding/SKILL.md +262 -0
- package/data/skills/bio-chipseq-motif-analysis/SKILL.md +387 -0
- package/data/skills/bio-chipseq-peak-annotation/SKILL.md +239 -0
- package/data/skills/bio-chipseq-peak-calling/SKILL.md +277 -0
- package/data/skills/bio-chipseq-qc/SKILL.md +391 -0
- package/data/skills/bio-chipseq-super-enhancers/SKILL.md +288 -0
- package/data/skills/bio-chipseq-visualization/SKILL.md +289 -0
- package/data/skills/bio-clinical-databases-clinvar-lookup/SKILL.md +188 -0
- package/data/skills/bio-clinical-databases-dbsnp-queries/SKILL.md +171 -0
- package/data/skills/bio-clinical-databases-gnomad-frequencies/SKILL.md +205 -0
- package/data/skills/bio-clinical-databases-hla-typing/SKILL.md +248 -0
- package/data/skills/bio-clinical-databases-myvariant-queries/SKILL.md +174 -0
- package/data/skills/bio-clinical-databases-pharmacogenomics/SKILL.md +232 -0
- package/data/skills/bio-clinical-databases-polygenic-risk/SKILL.md +276 -0
- package/data/skills/bio-clinical-databases-somatic-signatures/SKILL.md +261 -0
- package/data/skills/bio-clinical-databases-tumor-mutational-burden/SKILL.md +301 -0
- package/data/skills/bio-clinical-databases-variant-prioritization/SKILL.md +225 -0
- package/data/skills/bio-clip-seq-binding-site-annotation/SKILL.md +66 -0
- package/data/skills/bio-clip-seq-clip-alignment/SKILL.md +70 -0
- package/data/skills/bio-clip-seq-clip-motif-analysis/SKILL.md +62 -0
- package/data/skills/bio-clip-seq-clip-peak-calling/SKILL.md +282 -0
- package/data/skills/bio-clip-seq-clip-preprocessing/SKILL.md +142 -0
- package/data/skills/bio-codon-usage/SKILL.md +353 -0
- package/data/skills/bio-comparative-genomics-ancestral-reconstruction/SKILL.md +312 -0
- package/data/skills/bio-comparative-genomics-hgt-detection/SKILL.md +341 -0
- package/data/skills/bio-comparative-genomics-ortholog-inference/SKILL.md +308 -0
- package/data/skills/bio-comparative-genomics-positive-selection/SKILL.md +354 -0
- package/data/skills/bio-comparative-genomics-synteny-analysis/SKILL.md +315 -0
- package/data/skills/bio-compressed-files/SKILL.md +263 -0
- package/data/skills/bio-consensus-sequences/SKILL.md +340 -0
- package/data/skills/bio-copy-number-cnv-annotation/SKILL.md +307 -0
- package/data/skills/bio-copy-number-cnv-visualization/SKILL.md +294 -0
- package/data/skills/bio-copy-number-cnvkit-analysis/SKILL.md +290 -0
- package/data/skills/bio-copy-number-gatk-cnv/SKILL.md +270 -0
- package/data/skills/bio-crispr-screens-base-editing-analysis/SKILL.md +110 -0
- package/data/skills/bio-crispr-screens-batch-correction/SKILL.md +316 -0
- package/data/skills/bio-crispr-screens-crispresso-editing/SKILL.md +205 -0
- package/data/skills/bio-crispr-screens-hit-calling/SKILL.md +264 -0
- package/data/skills/bio-crispr-screens-jacks-analysis/SKILL.md +313 -0
- package/data/skills/bio-crispr-screens-library-design/SKILL.md +417 -0
- package/data/skills/bio-crispr-screens-mageck-analysis/SKILL.md +222 -0
- package/data/skills/bio-crispr-screens-screen-qc/SKILL.md +243 -0
- package/data/skills/bio-ctdna-mutation-detection/SKILL.md +234 -0
- package/data/skills/bio-data-visualization-circos-plots/SKILL.md +405 -0
- package/data/skills/bio-data-visualization-color-palettes/SKILL.md +244 -0
- package/data/skills/bio-data-visualization-genome-browser-tracks/SKILL.md +328 -0
- package/data/skills/bio-data-visualization-genome-tracks/SKILL.md +249 -0
- package/data/skills/bio-data-visualization-ggplot2-fundamentals/SKILL.md +313 -0
- package/data/skills/bio-data-visualization-heatmaps-clustering/SKILL.md +227 -0
- package/data/skills/bio-data-visualization-interactive-visualization/SKILL.md +210 -0
- package/data/skills/bio-data-visualization-multipanel-figures/SKILL.md +274 -0
- package/data/skills/bio-data-visualization-specialized-omics-plots/SKILL.md +251 -0
- package/data/skills/bio-data-visualization-upset-plots/SKILL.md +228 -0
- package/data/skills/bio-data-visualization-volcano-customization/SKILL.md +233 -0
- package/data/skills/bio-de-deseq2-basics/SKILL.md +376 -0
- package/data/skills/bio-de-edger-basics/SKILL.md +418 -0
- package/data/skills/bio-de-results/SKILL.md +378 -0
- package/data/skills/bio-de-visualization/SKILL.md +408 -0
- package/data/skills/bio-differential-expression-batch-correction/SKILL.md +253 -0
- package/data/skills/bio-differential-expression-timeseries-de/SKILL.md +370 -0
- package/data/skills/bio-differential-splicing/SKILL.md +177 -0
- package/data/skills/bio-duplicate-handling/SKILL.md +292 -0
- package/data/skills/bio-entrez-fetch/SKILL.md +334 -0
- package/data/skills/bio-entrez-link/SKILL.md +325 -0
- package/data/skills/bio-entrez-search/SKILL.md +311 -0
- package/data/skills/bio-epidemiological-genomics-amr-surveillance/SKILL.md +233 -0
- package/data/skills/bio-epidemiological-genomics-pathogen-typing/SKILL.md +202 -0
- package/data/skills/bio-epidemiological-genomics-phylodynamics/SKILL.md +207 -0
- package/data/skills/bio-epidemiological-genomics-transmission-inference/SKILL.md +237 -0
- package/data/skills/bio-epidemiological-genomics-variant-surveillance/SKILL.md +237 -0
- package/data/skills/bio-epitranscriptomics-m6a-differential/SKILL.md +88 -0
- package/data/skills/bio-epitranscriptomics-m6a-peak-calling/SKILL.md +89 -0
- package/data/skills/bio-epitranscriptomics-m6anet-analysis/SKILL.md +101 -0
- package/data/skills/bio-epitranscriptomics-merip-preprocessing/SKILL.md +81 -0
- package/data/skills/bio-epitranscriptomics-modification-visualization/SKILL.md +98 -0
- package/data/skills/bio-experimental-design-batch-design/SKILL.md +110 -0
- package/data/skills/bio-experimental-design-multiple-testing/SKILL.md +98 -0
- package/data/skills/bio-experimental-design-power-analysis/SKILL.md +84 -0
- package/data/skills/bio-experimental-design-sample-size/SKILL.md +93 -0
- package/data/skills/bio-expression-matrix-counts-ingest/SKILL.md +220 -0
- package/data/skills/bio-expression-matrix-gene-id-mapping/SKILL.md +256 -0
- package/data/skills/bio-expression-matrix-metadata-joins/SKILL.md +271 -0
- package/data/skills/bio-expression-matrix-sparse-handling/SKILL.md +247 -0
- package/data/skills/bio-fastq-quality/SKILL.md +279 -0
- package/data/skills/bio-filter-sequences/SKILL.md +265 -0
- package/data/skills/bio-flow-cytometry-bead-normalization/SKILL.md +315 -0
- package/data/skills/bio-flow-cytometry-clustering-phenotyping/SKILL.md +237 -0
- package/data/skills/bio-flow-cytometry-compensation-transformation/SKILL.md +196 -0
- package/data/skills/bio-flow-cytometry-cytometry-qc/SKILL.md +382 -0
- package/data/skills/bio-flow-cytometry-differential-analysis/SKILL.md +217 -0
- package/data/skills/bio-flow-cytometry-doublet-detection/SKILL.md +288 -0
- package/data/skills/bio-flow-cytometry-fcs-handling/SKILL.md +221 -0
- package/data/skills/bio-flow-cytometry-gating-analysis/SKILL.md +193 -0
- package/data/skills/bio-format-conversion/SKILL.md +193 -0
- package/data/skills/bio-fragment-analysis/SKILL.md +214 -0
- package/data/skills/bio-gatk-variant-calling/SKILL.md +422 -0
- package/data/skills/bio-genome-assembly-assembly-polishing/SKILL.md +333 -0
- package/data/skills/bio-genome-assembly-assembly-qc/SKILL.md +344 -0
- package/data/skills/bio-genome-assembly-contamination-detection/SKILL.md +235 -0
- package/data/skills/bio-genome-assembly-hifi-assembly/SKILL.md +178 -0
- package/data/skills/bio-genome-assembly-long-read-assembly/SKILL.md +307 -0
- package/data/skills/bio-genome-assembly-metagenome-assembly/SKILL.md +227 -0
- package/data/skills/bio-genome-assembly-scaffolding/SKILL.md +204 -0
- package/data/skills/bio-genome-assembly-short-read-assembly/SKILL.md +319 -0
- package/data/skills/bio-genome-engineering-base-editing-design/SKILL.md +277 -0
- package/data/skills/bio-genome-engineering-grna-design/SKILL.md +221 -0
- package/data/skills/bio-genome-engineering-hdr-template-design/SKILL.md +264 -0
- package/data/skills/bio-genome-engineering-off-target-prediction/SKILL.md +232 -0
- package/data/skills/bio-genome-engineering-prime-editing-design/SKILL.md +275 -0
- package/data/skills/bio-genome-intervals-bed-file-basics/SKILL.md +357 -0
- package/data/skills/bio-genome-intervals-bigwig-tracks/SKILL.md +351 -0
- package/data/skills/bio-genome-intervals-coverage-analysis/SKILL.md +300 -0
- package/data/skills/bio-genome-intervals-gtf-gff-handling/SKILL.md +345 -0
- package/data/skills/bio-genome-intervals-interval-arithmetic/SKILL.md +485 -0
- package/data/skills/bio-genome-intervals-proximity-operations/SKILL.md +337 -0
- package/data/skills/bio-geo-data/SKILL.md +380 -0
- package/data/skills/bio-hi-c-analysis-compartment-analysis/SKILL.md +261 -0
- package/data/skills/bio-hi-c-analysis-contact-pairs/SKILL.md +278 -0
- package/data/skills/bio-hi-c-analysis-hic-data-io/SKILL.md +260 -0
- package/data/skills/bio-hi-c-analysis-hic-differential/SKILL.md +328 -0
- package/data/skills/bio-hi-c-analysis-hic-visualization/SKILL.md +297 -0
- package/data/skills/bio-hi-c-analysis-loop-calling/SKILL.md +284 -0
- package/data/skills/bio-hi-c-analysis-matrix-operations/SKILL.md +274 -0
- package/data/skills/bio-hi-c-analysis-tad-detection/SKILL.md +239 -0
- package/data/skills/bio-imaging-mass-cytometry-cell-segmentation/SKILL.md +241 -0
- package/data/skills/bio-imaging-mass-cytometry-data-preprocessing/SKILL.md +279 -0
- package/data/skills/bio-imaging-mass-cytometry-interactive-annotation/SKILL.md +304 -0
- package/data/skills/bio-imaging-mass-cytometry-phenotyping/SKILL.md +231 -0
- package/data/skills/bio-imaging-mass-cytometry-quality-metrics/SKILL.md +316 -0
- package/data/skills/bio-imaging-mass-cytometry-spatial-analysis/SKILL.md +246 -0
- package/data/skills/bio-immunoinformatics-epitope-prediction/SKILL.md +259 -0
- package/data/skills/bio-immunoinformatics-immunogenicity-scoring/SKILL.md +275 -0
- package/data/skills/bio-immunoinformatics-mhc-binding-prediction/SKILL.md +260 -0
- package/data/skills/bio-immunoinformatics-neoantigen-prediction/SKILL.md +277 -0
- package/data/skills/bio-immunoinformatics-tcr-epitope-binding/SKILL.md +257 -0
- package/data/skills/bio-isoform-switching/SKILL.md +192 -0
- package/data/skills/bio-liquid-biopsy-pipeline/SKILL.md +311 -0
- package/data/skills/bio-local-blast/SKILL.md +350 -0
- package/data/skills/bio-long-read-sequencing-clair3-variants/SKILL.md +252 -0
- package/data/skills/bio-long-read-sequencing-isoseq-analysis/SKILL.md +334 -0
- package/data/skills/bio-long-read-sequencing-nanopore-methylation/SKILL.md +110 -0
- package/data/skills/bio-longitudinal-monitoring/SKILL.md +271 -0
- package/data/skills/bio-longread-alignment/SKILL.md +193 -0
- package/data/skills/bio-longread-medaka/SKILL.md +176 -0
- package/data/skills/bio-longread-qc/SKILL.md +224 -0
- package/data/skills/bio-longread-structural-variants/SKILL.md +201 -0
- package/data/skills/bio-machine-learning-atlas-mapping/SKILL.md +139 -0
- package/data/skills/bio-machine-learning-biomarker-discovery/SKILL.md +157 -0
- package/data/skills/bio-machine-learning-model-validation/SKILL.md +148 -0
- package/data/skills/bio-machine-learning-omics-classifiers/SKILL.md +146 -0
- package/data/skills/bio-machine-learning-prediction-explanation/SKILL.md +162 -0
- package/data/skills/bio-machine-learning-survival-analysis/SKILL.md +176 -0
- package/data/skills/bio-metabolomics-lipidomics/SKILL.md +265 -0
- package/data/skills/bio-metabolomics-metabolite-annotation/SKILL.md +241 -0
- package/data/skills/bio-metabolomics-msdial-preprocessing/SKILL.md +308 -0
- package/data/skills/bio-metabolomics-normalization-qc/SKILL.md +283 -0
- package/data/skills/bio-metabolomics-pathway-mapping/SKILL.md +237 -0
- package/data/skills/bio-metabolomics-statistical-analysis/SKILL.md +276 -0
- package/data/skills/bio-metabolomics-targeted-analysis/SKILL.md +314 -0
- package/data/skills/bio-metabolomics-xcms-preprocessing/SKILL.md +268 -0
- package/data/skills/bio-metagenomics-abundance/SKILL.md +203 -0
- package/data/skills/bio-metagenomics-amr-detection/SKILL.md +293 -0
- package/data/skills/bio-metagenomics-functional-profiling/SKILL.md +252 -0
- package/data/skills/bio-metagenomics-kraken/SKILL.md +204 -0
- package/data/skills/bio-metagenomics-metaphlan/SKILL.md +214 -0
- package/data/skills/bio-metagenomics-strain-tracking/SKILL.md +292 -0
- package/data/skills/bio-metagenomics-visualization/SKILL.md +240 -0
- package/data/skills/bio-methylation-based-detection/SKILL.md +223 -0
- package/data/skills/bio-methylation-bismark-alignment/SKILL.md +195 -0
- package/data/skills/bio-methylation-calling/SKILL.md +200 -0
- package/data/skills/bio-methylation-dmr-detection/SKILL.md +211 -0
- package/data/skills/bio-methylation-methylkit/SKILL.md +219 -0
- package/data/skills/bio-microbiome-amplicon-processing/SKILL.md +137 -0
- package/data/skills/bio-microbiome-differential-abundance/SKILL.md +147 -0
- package/data/skills/bio-microbiome-diversity-analysis/SKILL.md +188 -0
- package/data/skills/bio-microbiome-functional-prediction/SKILL.md +153 -0
- package/data/skills/bio-microbiome-qiime2-workflow/SKILL.md +219 -0
- package/data/skills/bio-microbiome-taxonomy-assignment/SKILL.md +168 -0
- package/data/skills/bio-molecular-descriptors/SKILL.md +200 -0
- package/data/skills/bio-molecular-io/SKILL.md +188 -0
- package/data/skills/bio-motif-search/SKILL.md +354 -0
- package/data/skills/bio-multi-omics-data-harmonization/SKILL.md +228 -0
- package/data/skills/bio-multi-omics-mixomics-analysis/SKILL.md +221 -0
- package/data/skills/bio-multi-omics-mofa-integration/SKILL.md +225 -0
- package/data/skills/bio-multi-omics-similarity-network/SKILL.md +235 -0
- package/data/skills/bio-orchestrator/SKILL.md +133 -0
- package/data/skills/bio-paired-end-fastq/SKILL.md +334 -0
- package/data/skills/bio-pathway-enrichment-visualization/SKILL.md +278 -0
- package/data/skills/bio-pathway-go-enrichment/SKILL.md +218 -0
- package/data/skills/bio-pathway-gsea/SKILL.md +227 -0
- package/data/skills/bio-pathway-kegg-pathways/SKILL.md +234 -0
- package/data/skills/bio-pathway-reactome/SKILL.md +215 -0
- package/data/skills/bio-pathway-wikipathways/SKILL.md +255 -0
- package/data/skills/bio-pdb-geometric-analysis/SKILL.md +475 -0
- package/data/skills/bio-pdb-structure-io/SKILL.md +296 -0
- package/data/skills/bio-pdb-structure-modification/SKILL.md +448 -0
- package/data/skills/bio-pdb-structure-navigation/SKILL.md +335 -0
- package/data/skills/bio-phasing-imputation-genotype-imputation/SKILL.md +201 -0
- package/data/skills/bio-phasing-imputation-haplotype-phasing/SKILL.md +190 -0
- package/data/skills/bio-phasing-imputation-imputation-qc/SKILL.md +265 -0
- package/data/skills/bio-phasing-imputation-reference-panels/SKILL.md +203 -0
- package/data/skills/bio-phylo-distance-calculations/SKILL.md +307 -0
- package/data/skills/bio-phylo-modern-tree-inference/SKILL.md +274 -0
- package/data/skills/bio-phylo-tree-io/SKILL.md +252 -0
- package/data/skills/bio-phylo-tree-manipulation/SKILL.md +375 -0
- package/data/skills/bio-phylo-tree-visualization/SKILL.md +275 -0
- package/data/skills/bio-pileup-generation/SKILL.md +314 -0
- package/data/skills/bio-population-genetics-association-testing/SKILL.md +293 -0
- package/data/skills/bio-population-genetics-linkage-disequilibrium/SKILL.md +260 -0
- package/data/skills/bio-population-genetics-plink-basics/SKILL.md +338 -0
- package/data/skills/bio-population-genetics-population-structure/SKILL.md +352 -0
- package/data/skills/bio-population-genetics-scikit-allel-analysis/SKILL.md +306 -0
- package/data/skills/bio-population-genetics-selection-statistics/SKILL.md +251 -0
- package/data/skills/bio-primer-design-primer-basics/SKILL.md +289 -0
- package/data/skills/bio-primer-design-primer-validation/SKILL.md +344 -0
- package/data/skills/bio-primer-design-qpcr-primers/SKILL.md +273 -0
- package/data/skills/bio-proteomics-data-import/SKILL.md +122 -0
- package/data/skills/bio-proteomics-dia-analysis/SKILL.md +246 -0
- package/data/skills/bio-proteomics-differential-abundance/SKILL.md +129 -0
- package/data/skills/bio-proteomics-peptide-identification/SKILL.md +122 -0
- package/data/skills/bio-proteomics-protein-inference/SKILL.md +174 -0
- package/data/skills/bio-proteomics-proteomics-qc/SKILL.md +208 -0
- package/data/skills/bio-proteomics-ptm-analysis/SKILL.md +139 -0
- package/data/skills/bio-proteomics-quantification/SKILL.md +141 -0
- package/data/skills/bio-proteomics-spectral-libraries/SKILL.md +270 -0
- package/data/skills/bio-reaction-enumeration/SKILL.md +251 -0
- package/data/skills/bio-read-alignment-bowtie2-alignment/SKILL.md +189 -0
- package/data/skills/bio-read-alignment-bwa-alignment/SKILL.md +166 -0
- package/data/skills/bio-read-alignment-hisat2-alignment/SKILL.md +205 -0
- package/data/skills/bio-read-alignment-star-alignment/SKILL.md +204 -0
- package/data/skills/bio-read-qc-adapter-trimming/SKILL.md +222 -0
- package/data/skills/bio-read-qc-contamination-screening/SKILL.md +252 -0
- package/data/skills/bio-read-qc-fastp-workflow/SKILL.md +278 -0
- package/data/skills/bio-read-qc-quality-filtering/SKILL.md +231 -0
- package/data/skills/bio-read-qc-quality-reports/SKILL.md +204 -0
- package/data/skills/bio-read-qc-umi-processing/SKILL.md +391 -0
- package/data/skills/bio-read-sequences/SKILL.md +319 -0
- package/data/skills/bio-reference-operations/SKILL.md +302 -0
- package/data/skills/bio-reporting-automated-qc-reports/SKILL.md +103 -0
- package/data/skills/bio-reporting-figure-export/SKILL.md +112 -0
- package/data/skills/bio-reporting-jupyter-reports/SKILL.md +98 -0
- package/data/skills/bio-reporting-quarto-reports/SKILL.md +295 -0
- package/data/skills/bio-reporting-rmarkdown-reports/SKILL.md +276 -0
- package/data/skills/bio-research-tools-biomarker-signature-studio/SKILL.md +99 -0
- package/data/skills/bio-restriction-enzyme-selection/SKILL.md +342 -0
- package/data/skills/bio-restriction-fragment-analysis/SKILL.md +259 -0
- package/data/skills/bio-restriction-mapping/SKILL.md +239 -0
- package/data/skills/bio-restriction-sites/SKILL.md +222 -0
- package/data/skills/bio-reverse-complement/SKILL.md +250 -0
- package/data/skills/bio-ribo-seq-orf-detection/SKILL.md +303 -0
- package/data/skills/bio-ribo-seq-riboseq-preprocessing/SKILL.md +176 -0
- package/data/skills/bio-ribo-seq-ribosome-periodicity/SKILL.md +182 -0
- package/data/skills/bio-ribo-seq-ribosome-stalling/SKILL.md +217 -0
- package/data/skills/bio-ribo-seq-translation-efficiency/SKILL.md +183 -0
- package/data/skills/bio-rna-quantification-alignment-free-quant/SKILL.md +226 -0
- package/data/skills/bio-rna-quantification-count-matrix-qc/SKILL.md +310 -0
- package/data/skills/bio-rna-quantification-featurecounts-counting/SKILL.md +190 -0
- package/data/skills/bio-rna-quantification-tximport-workflow/SKILL.md +240 -0
- package/data/skills/bio-rnaseq-qc/SKILL.md +320 -0
- package/data/skills/bio-sam-bam-basics/SKILL.md +248 -0
- package/data/skills/bio-sashimi-plots/SKILL.md +175 -0
- package/data/skills/bio-seq-objects/SKILL.md +240 -0
- package/data/skills/bio-sequence-properties/SKILL.md +397 -0
- package/data/skills/bio-sequence-similarity/SKILL.md +335 -0
- package/data/skills/bio-sequence-slicing/SKILL.md +232 -0
- package/data/skills/bio-sequence-statistics/SKILL.md +318 -0
- package/data/skills/bio-similarity-searching/SKILL.md +200 -0
- package/data/skills/bio-single-cell-batch-integration/SKILL.md +317 -0
- package/data/skills/bio-single-cell-cell-annotation/SKILL.md +259 -0
- package/data/skills/bio-single-cell-cell-communication/SKILL.md +257 -0
- package/data/skills/bio-single-cell-clustering/SKILL.md +330 -0
- package/data/skills/bio-single-cell-data-io/SKILL.md +315 -0
- package/data/skills/bio-single-cell-doublet-detection/SKILL.md +362 -0
- package/data/skills/bio-single-cell-lineage-tracing/SKILL.md +319 -0
- package/data/skills/bio-single-cell-markers-annotation/SKILL.md +317 -0
- package/data/skills/bio-single-cell-metabolite-communication/SKILL.md +258 -0
- package/data/skills/bio-single-cell-multimodal-integration/SKILL.md +242 -0
- package/data/skills/bio-single-cell-perturb-seq/SKILL.md +258 -0
- package/data/skills/bio-single-cell-preprocessing/SKILL.md +338 -0
- package/data/skills/bio-single-cell-scatac-analysis/SKILL.md +326 -0
- package/data/skills/bio-single-cell-splicing/SKILL.md +199 -0
- package/data/skills/bio-single-cell-trajectory-inference/SKILL.md +225 -0
- package/data/skills/bio-small-rna-seq-differential-mirna/SKILL.md +194 -0
- package/data/skills/bio-small-rna-seq-mirdeep2-analysis/SKILL.md +180 -0
- package/data/skills/bio-small-rna-seq-mirge3-analysis/SKILL.md +178 -0
- package/data/skills/bio-small-rna-seq-smrna-preprocessing/SKILL.md +174 -0
- package/data/skills/bio-small-rna-seq-target-prediction/SKILL.md +202 -0
- package/data/skills/bio-spatial-transcriptomics-image-analysis/SKILL.md +283 -0
- package/data/skills/bio-spatial-transcriptomics-spatial-communication/SKILL.md +299 -0
- package/data/skills/bio-spatial-transcriptomics-spatial-data-io/SKILL.md +272 -0
- package/data/skills/bio-spatial-transcriptomics-spatial-deconvolution/SKILL.md +314 -0
- package/data/skills/bio-spatial-transcriptomics-spatial-domains/SKILL.md +254 -0
- package/data/skills/bio-spatial-transcriptomics-spatial-multiomics/SKILL.md +181 -0
- package/data/skills/bio-spatial-transcriptomics-spatial-neighbors/SKILL.md +198 -0
- package/data/skills/bio-spatial-transcriptomics-spatial-preprocessing/SKILL.md +269 -0
- package/data/skills/bio-spatial-transcriptomics-spatial-proteomics/SKILL.md +124 -0
- package/data/skills/bio-spatial-transcriptomics-spatial-statistics/SKILL.md +237 -0
- package/data/skills/bio-spatial-transcriptomics-spatial-visualization/SKILL.md +287 -0
- package/data/skills/bio-splicing-pipeline/SKILL.md +253 -0
- package/data/skills/bio-splicing-qc/SKILL.md +190 -0
- package/data/skills/bio-splicing-quantification/SKILL.md +145 -0
- package/data/skills/bio-sra-data/SKILL.md +363 -0
- package/data/skills/bio-structural-biology-alphafold-predictions/SKILL.md +258 -0
- package/data/skills/bio-structural-biology-modern-structure-prediction/SKILL.md +346 -0
- package/data/skills/bio-substructure-search/SKILL.md +206 -0
- package/data/skills/bio-systems-biology-context-specific-models/SKILL.md +241 -0
- package/data/skills/bio-systems-biology-flux-balance-analysis/SKILL.md +206 -0
- package/data/skills/bio-systems-biology-gene-essentiality/SKILL.md +235 -0
- package/data/skills/bio-systems-biology-metabolic-reconstruction/SKILL.md +215 -0
- package/data/skills/bio-systems-biology-model-curation/SKILL.md +243 -0
- package/data/skills/bio-tcr-bcr-analysis-immcantation-analysis/SKILL.md +195 -0
- package/data/skills/bio-tcr-bcr-analysis-mixcr-analysis/SKILL.md +167 -0
- package/data/skills/bio-tcr-bcr-analysis-repertoire-visualization/SKILL.md +224 -0
- package/data/skills/bio-tcr-bcr-analysis-scirpy-analysis/SKILL.md +168 -0
- package/data/skills/bio-tcr-bcr-analysis-vdjtools-analysis/SKILL.md +188 -0
- package/data/skills/bio-transcription-translation/SKILL.md +237 -0
- package/data/skills/bio-tumor-fraction-estimation/SKILL.md +211 -0
- package/data/skills/bio-uniprot-access/SKILL.md +239 -0
- package/data/skills/bio-variant-annotation/SKILL.md +410 -0
- package/data/skills/bio-variant-calling/SKILL.md +266 -0
- package/data/skills/bio-variant-calling-clinical-interpretation/SKILL.md +355 -0
- package/data/skills/bio-variant-calling-deepvariant/SKILL.md +315 -0
- package/data/skills/bio-variant-calling-filtering-best-practices/SKILL.md +403 -0
- package/data/skills/bio-variant-calling-joint-calling/SKILL.md +338 -0
- package/data/skills/bio-variant-calling-structural-variant-calling/SKILL.md +253 -0
- package/data/skills/bio-variant-normalization/SKILL.md +325 -0
- package/data/skills/bio-vcf-basics/SKILL.md +342 -0
- package/data/skills/bio-vcf-manipulation/SKILL.md +429 -0
- package/data/skills/bio-vcf-statistics/SKILL.md +445 -0
- package/data/skills/bio-virtual-screening/SKILL.md +263 -0
- package/data/skills/bio-workflow-management-cwl-workflows/SKILL.md +433 -0
- package/data/skills/bio-workflow-management-nextflow-pipelines/SKILL.md +386 -0
- package/data/skills/bio-workflow-management-snakemake-workflows/SKILL.md +383 -0
- package/data/skills/bio-workflow-management-wdl-workflows/SKILL.md +500 -0
- package/data/skills/bio-workflows-atacseq-pipeline/SKILL.md +362 -0
- package/data/skills/bio-workflows-biomarker-pipeline/SKILL.md +272 -0
- package/data/skills/bio-workflows-chipseq-pipeline/SKILL.md +282 -0
- package/data/skills/bio-workflows-clip-pipeline/SKILL.md +268 -0
- package/data/skills/bio-workflows-cnv-pipeline/SKILL.md +324 -0
- package/data/skills/bio-workflows-crispr-editing-pipeline/SKILL.md +455 -0
- package/data/skills/bio-workflows-crispr-screen-pipeline/SKILL.md +278 -0
- package/data/skills/bio-workflows-cytometry-pipeline/SKILL.md +328 -0
- package/data/skills/bio-workflows-expression-to-pathways/SKILL.md +329 -0
- package/data/skills/bio-workflows-fastq-to-variants/SKILL.md +374 -0
- package/data/skills/bio-workflows-genome-assembly-pipeline/SKILL.md +290 -0
- package/data/skills/bio-workflows-gwas-pipeline/SKILL.md +323 -0
- package/data/skills/bio-workflows-hic-pipeline/SKILL.md +304 -0
- package/data/skills/bio-workflows-imc-pipeline/SKILL.md +304 -0
- package/data/skills/bio-workflows-longread-sv-pipeline/SKILL.md +281 -0
- package/data/skills/bio-workflows-merip-pipeline/SKILL.md +222 -0
- package/data/skills/bio-workflows-metabolic-modeling-pipeline/SKILL.md +408 -0
- package/data/skills/bio-workflows-metabolomics-pipeline/SKILL.md +297 -0
- package/data/skills/bio-workflows-metagenomics-pipeline/SKILL.md +283 -0
- package/data/skills/bio-workflows-methylation-pipeline/SKILL.md +274 -0
- package/data/skills/bio-workflows-microbiome-pipeline/SKILL.md +221 -0
- package/data/skills/bio-workflows-multi-omics-pipeline/SKILL.md +362 -0
- package/data/skills/bio-workflows-multiome-pipeline/SKILL.md +298 -0
- package/data/skills/bio-workflows-neoantigen-pipeline/SKILL.md +325 -0
- package/data/skills/bio-workflows-outbreak-pipeline/SKILL.md +341 -0
- package/data/skills/bio-workflows-proteomics-pipeline/SKILL.md +226 -0
- package/data/skills/bio-workflows-riboseq-pipeline/SKILL.md +94 -0
- package/data/skills/bio-workflows-rnaseq-to-de/SKILL.md +345 -0
- package/data/skills/bio-workflows-scrnaseq-pipeline/SKILL.md +354 -0
- package/data/skills/bio-workflows-smrna-pipeline/SKILL.md +86 -0
- package/data/skills/bio-workflows-somatic-variant-pipeline/SKILL.md +313 -0
- package/data/skills/bio-workflows-spatial-pipeline/SKILL.md +267 -0
- package/data/skills/bio-workflows-tcr-pipeline/SKILL.md +84 -0
- package/data/skills/bio-write-sequences/SKILL.md +205 -0
- package/data/skills/bioinformatics-singlecell/SKILL.md +143 -0
- package/data/skills/biokernel/SKILL.md +61 -0
- package/data/skills/biologist-analyst/SKILL.md +799 -0
- package/data/skills/biomaster-workflows/SKILL.md +55 -0
- package/data/skills/biomcp-server/SKILL.md +65 -0
- package/data/skills/biomedical-data-analysis/SKILL.md +56 -0
- package/data/skills/biomedical-search/SKILL.md +214 -0
- package/data/skills/biomni/SKILL.md +309 -0
- package/data/skills/biomni-general-agent/SKILL.md +43 -0
- package/data/skills/biomni-research-agent/SKILL.md +76 -0
- package/data/skills/biopython/SKILL.md +437 -0
- package/data/skills/biorxiv-database/SKILL.md +477 -0
- package/data/skills/bioservices/SKILL.md +355 -0
- package/data/skills/boltz/SKILL.md +188 -0
- package/data/skills/boltzgen/SKILL.md +287 -0
- package/data/skills/bone-marrow-ai-agent/SKILL.md +163 -0
- package/data/skills/brainstorming/SKILL.md +96 -0
- package/data/skills/brenda-database/SKILL.md +714 -0
- package/data/skills/bulk-combat-correction/SKILL.md +54 -0
- package/data/skills/bulk-deg-analysis/SKILL.md +61 -0
- package/data/skills/bulk-deseq2-analysis/SKILL.md +50 -0
- package/data/skills/bulk-stringdb-ppi/SKILL.md +49 -0
- package/data/skills/bulk-to-single-deconvolution/SKILL.md +50 -0
- package/data/skills/bulk-trajblend-interpolation/SKILL.md +52 -0
- package/data/skills/bulk-wgcna-analysis/SKILL.md +56 -0
- package/data/skills/cancer-metabolism-agent/SKILL.md +180 -0
- package/data/skills/care-coordination/SKILL.md +35 -0
- package/data/skills/cart-design-optimizer-agent/SKILL.md +162 -0
- package/data/skills/cbioportal-database/SKILL.md +367 -0
- package/data/skills/cell-free-expression/SKILL.md +291 -0
- package/data/skills/cellagent-annotation/SKILL.md +69 -0
- package/data/skills/cellfree-rna-agent/SKILL.md +182 -0
- package/data/skills/cellular-senescence-agent/SKILL.md +183 -0
- package/data/skills/cellxgene-census/SKILL.md +505 -0
- package/data/skills/chai/SKILL.md +272 -0
- package/data/skills/chatehr-clinician-assistant/SKILL.md +67 -0
- package/data/skills/chematagent-drug-discovery/SKILL.md +68 -0
- package/data/skills/chembl-database/SKILL.md +383 -0
- package/data/skills/chembl-search/SKILL.md +211 -0
- package/data/skills/chemcrow-drug-discovery/SKILL.md +61 -0
- package/data/skills/chemical-property-lookup/SKILL.md +42 -0
- package/data/skills/chemist-analyst/SKILL.md +1603 -0
- package/data/skills/chemistry-agent/SKILL.md +62 -0
- package/data/skills/chip-clonal-hematopoiesis-agent/SKILL.md +224 -0
- package/data/skills/chromosomal-instability-agent/SKILL.md +187 -0
- package/data/skills/citation-management/SKILL.md +1081 -0
- package/data/skills/claims-appeals/SKILL.md +35 -0
- package/data/skills/claw-ancestry-pca/SKILL.md +145 -0
- package/data/skills/claw-metagenomics/SKILL.md +238 -0
- package/data/skills/claw-semantic-sim/SKILL.md +151 -0
- package/data/skills/clinical-decision-support/SKILL.md +504 -0
- package/data/skills/clinical-diagnostic-reasoning/SKILL.md +222 -0
- package/data/skills/clinical-nlp-extractor/SKILL.md +59 -0
- package/data/skills/clinical-note-summarization/SKILL.md +52 -0
- package/data/skills/clinical-reports/SKILL.md +1127 -0
- package/data/skills/clinical-trial-protocol-skill/SKILL.md +508 -0
- package/data/skills/clinical-trials-search/SKILL.md +211 -0
- package/data/skills/clinicaltrials-database/SKILL.md +501 -0
- package/data/skills/clinpgx/SKILL.md +96 -0
- package/data/skills/clinpgx-database/SKILL.md +632 -0
- package/data/skills/clinvar-database/SKILL.md +356 -0
- package/data/skills/cnv-caller-agent/SKILL.md +171 -0
- package/data/skills/coagulation-thrombosis-agent/SKILL.md +141 -0
- package/data/skills/cobrapy/SKILL.md +457 -0
- package/data/skills/compbioagent-explorer/SKILL.md +67 -0
- package/data/skills/computational-pathology-agent/SKILL.md +72 -0
- package/data/skills/convergence-study/SKILL.md +98 -0
- package/data/skills/cosmic-database/SKILL.md +330 -0
- package/data/skills/crisis-detection-intervention-ai/SKILL.md +569 -0
- package/data/skills/crisis-response-protocol/SKILL.md +456 -0
- package/data/skills/crispr-guide-design/SKILL.md +72 -0
- package/data/skills/crispr-offtarget-predictor/SKILL.md +56 -0
- package/data/skills/cryoem-ai-drug-design-agent/SKILL.md +216 -0
- package/data/skills/ctdna-dynamics-mrd-agent/SKILL.md +206 -0
- package/data/skills/cytokine-storm-analysis-agent/SKILL.md +180 -0
- package/data/skills/dask/SKILL.md +454 -0
- package/data/skills/data-stats-analysis/SKILL.md +477 -0
- package/data/skills/data-transform/SKILL.md +576 -0
- package/data/skills/data-visualization-biomedical/SKILL.md +252 -0
- package/data/skills/data-visualization-expert/SKILL.md +72 -0
- package/data/skills/data-viz-plots/SKILL.md +461 -0
- package/data/skills/datacommons-client/SKILL.md +253 -0
- package/data/skills/datamol/SKILL.md +700 -0
- package/data/skills/deep-research/SKILL.md +111 -0
- package/data/skills/deep-research-swarm/SKILL.md +62 -0
- package/data/skills/deep-visual-proteomics-agent/SKILL.md +149 -0
- package/data/skills/deepchem/SKILL.md +591 -0
- package/data/skills/deeptools/SKILL.md +525 -0
- package/data/skills/depmap/SKILL.md +300 -0
- package/data/skills/diffdock/SKILL.md +477 -0
- package/data/skills/differentiation-schemes/SKILL.md +159 -0
- package/data/skills/digital-twin-clinical-agent/SKILL.md +228 -0
- package/data/skills/dispatching-parallel-agents/SKILL.md +180 -0
- package/data/skills/dnanexus-integration/SKILL.md +376 -0
- package/data/skills/doc-coauthoring/SKILL.md +375 -0
- package/data/skills/docx/SKILL.md +590 -0
- package/data/skills/docx-official/SKILL.md +197 -0
- package/data/skills/drug-discovery-search/SKILL.md +214 -0
- package/data/skills/drug-interaction-checker/SKILL.md +56 -0
- package/data/skills/drug-labels-search/SKILL.md +211 -0
- package/data/skills/drug-photo/SKILL.md +149 -0
- package/data/skills/drugbank-database/SKILL.md +184 -0
- package/data/skills/drugbank-search/SKILL.md +211 -0
- package/data/skills/ehr-fhir-integration/SKILL.md +60 -0
- package/data/skills/emergency-card/SKILL.md +426 -0
- package/data/skills/ena-database/SKILL.md +198 -0
- package/data/skills/ensembl-database/SKILL.md +305 -0
- package/data/skills/epidemiologist-analyst/SKILL.md +1844 -0
- package/data/skills/epigenomics-methylgpt-agent/SKILL.md +111 -0
- package/data/skills/equity-scorer/SKILL.md +182 -0
- package/data/skills/esm/SKILL.md +300 -0
- package/data/skills/etetoolkit/SKILL.md +617 -0
- package/data/skills/executing-plans/SKILL.md +84 -0
- package/data/skills/exosome-ev-analysis-agent/SKILL.md +171 -0
- package/data/skills/exploratory-data-analysis/SKILL.md +440 -0
- package/data/skills/family-health-analyzer/SKILL.md +137 -0
- package/data/skills/fastq-analysis/SKILL.md +191 -0
- package/data/skills/fda-database/SKILL.md +512 -0
- package/data/skills/fhir-developer-skill/SKILL.md +294 -0
- package/data/skills/fhir-development/SKILL.md +35 -0
- package/data/skills/find-skills/SKILL.md +133 -0
- package/data/skills/finishing-a-development-branch/SKILL.md +200 -0
- package/data/skills/fitness-analyzer/SKILL.md +431 -0
- package/data/skills/flowio/SKILL.md +602 -0
- package/data/skills/foldseek/SKILL.md +179 -0
- package/data/skills/galaxy-bridge/SKILL.md +215 -0
- package/data/skills/gene-database/SKILL.md +173 -0
- package/data/skills/gene-panel-design-agent/SKILL.md +192 -0
- package/data/skills/geniml/SKILL.md +312 -0
- package/data/skills/genome-compare/SKILL.md +127 -0
- package/data/skills/geo-database/SKILL.md +809 -0
- package/data/skills/geopandas/SKILL.md +245 -0
- package/data/skills/gget/SKILL.md +865 -0
- package/data/skills/ginkgo-cloud-lab/SKILL.md +56 -0
- package/data/skills/glycoengineering/SKILL.md +338 -0
- package/data/skills/gnomad-database/SKILL.md +395 -0
- package/data/skills/goal-analyzer/SKILL.md +605 -0
- package/data/skills/grief-companion/SKILL.md +250 -0
- package/data/skills/gsea-enrichment/SKILL.md +151 -0
- package/data/skills/gtars/SKILL.md +279 -0
- package/data/skills/gtex-database/SKILL.md +315 -0
- package/data/skills/gwas-database/SKILL.md +602 -0
- package/data/skills/gwas-lookup/SKILL.md +122 -0
- package/data/skills/gwas-prs/SKILL.md +178 -0
- package/data/skills/health-trend-analyzer/SKILL.md +451 -0
- package/data/skills/hemoglobinopathy-analysis-agent/SKILL.md +167 -0
- package/data/skills/hipaa-compliance/SKILL.md +230 -0
- package/data/skills/histolab/SKILL.md +672 -0
- package/data/skills/hmdb-database/SKILL.md +190 -0
- package/data/skills/hrd-analysis-agent/SKILL.md +184 -0
- package/data/skills/hrv-alexithymia-expert/SKILL.md +151 -0
- package/data/skills/hypogenic/SKILL.md +649 -0
- package/data/skills/hypothesis-generation/SKILL.md +286 -0
- package/data/skills/imaging-data-commons/SKILL.md +843 -0
- package/data/skills/immune-checkpoint-combination-agent/SKILL.md +170 -0
- package/data/skills/infographics/SKILL.md +563 -0
- package/data/skills/instrument-data-to-allotrope/SKILL.md +280 -0
- package/data/skills/interpro-database/SKILL.md +305 -0
- package/data/skills/ipsae/SKILL.md +190 -0
- package/data/skills/iso-13485-certification/SKILL.md +678 -0
- package/data/skills/jaspar-database/SKILL.md +351 -0
- package/data/skills/jungian-psychologist/SKILL.md +191 -0
- package/data/skills/kegg-database/SKILL.md +371 -0
- package/data/skills/knowledge-synthesis/SKILL.md +283 -0
- package/data/skills/kragen-knowledge-graph/SKILL.md +68 -0
- package/data/skills/lab-results/SKILL.md +35 -0
- package/data/skills/labarchive-integration/SKILL.md +262 -0
- package/data/skills/labstep/SKILL.md +208 -0
- package/data/skills/lamindb/SKILL.md +384 -0
- package/data/skills/latchbio-integration/SKILL.md +347 -0
- package/data/skills/latex-posters/SKILL.md +1602 -0
- package/data/skills/leads-literature-mining/SKILL.md +68 -0
- package/data/skills/ligandmpnn/SKILL.md +170 -0
- package/data/skills/linear-solvers/SKILL.md +165 -0
- package/data/skills/liquid-biopsy-analytics-agent/SKILL.md +171 -0
- package/data/skills/lit-synthesizer/SKILL.md +53 -0
- package/data/skills/literature-review/SKILL.md +584 -0
- package/data/skills/literature-search/SKILL.md +214 -0
- package/data/skills/lobster-bioinformatics/SKILL.md +305 -0
- package/data/skills/long-read-sequencing-agent/SKILL.md +181 -0
- package/data/skills/mage-antibody-generator/SKILL.md +54 -0
- package/data/skills/markdown-mermaid-writing/SKILL.md +327 -0
- package/data/skills/markitdown/SKILL.md +486 -0
- package/data/skills/matchms/SKILL.md +197 -0
- package/data/skills/matplotlib/SKILL.md +359 -0
- package/data/skills/mcpmed-bioinformatics-server/SKILL.md +42 -0
- package/data/skills/medchem/SKILL.md +400 -0
- package/data/skills/medea-therapeutic-discovery/SKILL.md +45 -0
- package/data/skills/medical-entity-extractor/SKILL.md +144 -0
- package/data/skills/medical-imaging-review/SKILL.md +170 -0
- package/data/skills/medical-research-toolkit/SKILL.md +273 -0
- package/data/skills/medrxiv-search/SKILL.md +211 -0
- package/data/skills/mental-health-analyzer/SKILL.md +981 -0
- package/data/skills/mesh-generation/SKILL.md +149 -0
- package/data/skills/metabolomics-workbench-database/SKILL.md +253 -0
- package/data/skills/microbiome-cancer-agent/SKILL.md +180 -0
- package/data/skills/modern-drug-rehab-computer/SKILL.md +392 -0
- package/data/skills/molecular-dynamics/SKILL.md +457 -0
- package/data/skills/molecular-glue-discovery-agent/SKILL.md +224 -0
- package/data/skills/molecule-evolution-agent/SKILL.md +62 -0
- package/data/skills/molfeat/SKILL.md +505 -0
- package/data/skills/monarch-database/SKILL.md +372 -0
- package/data/skills/mpn-progression-monitor-agent/SKILL.md +228 -0
- package/data/skills/mpn-research-assistant/SKILL.md +197 -0
- package/data/skills/mrd-edge-detection-agent/SKILL.md +213 -0
- package/data/skills/multi-ancestry-prs-agent/SKILL.md +224 -0
- package/data/skills/multi-search-engine/SKILL.md +110 -0
- package/data/skills/multimodal-medical-imaging/SKILL.md +59 -0
- package/data/skills/multimodal-radpath-fusion-agent/SKILL.md +213 -0
- package/data/skills/myeloma-mrd-agent/SKILL.md +184 -0
- package/data/skills/networkx/SKILL.md +435 -0
- package/data/skills/neurokit2/SKILL.md +350 -0
- package/data/skills/neuropixels-analysis/SKILL.md +344 -0
- package/data/skills/nextflow-development/SKILL.md +290 -0
- package/data/skills/ngs-analysis/SKILL.md +183 -0
- package/data/skills/nicheformer-spatial-agent/SKILL.md +197 -0
- package/data/skills/nk-cell-therapy-agent/SKILL.md +186 -0
- package/data/skills/nonlinear-solvers/SKILL.md +180 -0
- package/data/skills/numerical-integration/SKILL.md +166 -0
- package/data/skills/numerical-stability/SKILL.md +149 -0
- package/data/skills/nutrition-analyzer/SKILL.md +775 -0
- package/data/skills/occupational-health-analyzer/SKILL.md +386 -0
- package/data/skills/omero-integration/SKILL.md +245 -0
- package/data/skills/ontology-explorer/SKILL.md +168 -0
- package/data/skills/ontology-mapper/SKILL.md +171 -0
- package/data/skills/ontology-validator/SKILL.md +136 -0
- package/data/skills/open-notebook/SKILL.md +289 -0
- package/data/skills/open-targets-search/SKILL.md +211 -0
- package/data/skills/openalex-database/SKILL.md +488 -0
- package/data/skills/opentargets-database/SKILL.md +367 -0
- package/data/skills/opentrons-integration/SKILL.md +567 -0
- package/data/skills/opentrons-protocol-agent/SKILL.md +58 -0
- package/data/skills/organoid-drug-response-agent/SKILL.md +189 -0
- package/data/skills/pan-cancer-multiomics-agent/SKILL.md +159 -0
- package/data/skills/paper-2-web/SKILL.md +495 -0
- package/data/skills/parameter-optimization/SKILL.md +141 -0
- package/data/skills/patents-search/SKILL.md +211 -0
- package/data/skills/pathml/SKILL.md +160 -0
- package/data/skills/patiently-ai/SKILL.md +103 -0
- package/data/skills/pdb/SKILL.md +217 -0
- package/data/skills/pdb-database/SKILL.md +303 -0
- package/data/skills/pdf/SKILL.md +314 -0
- package/data/skills/pdf-anthropic/SKILL.md +294 -0
- package/data/skills/pdf-processing/SKILL.md +149 -0
- package/data/skills/pdf-processing-pro/SKILL.md +296 -0
- package/data/skills/pdx-model-analysis-agent/SKILL.md +169 -0
- package/data/skills/peer-review/SKILL.md +565 -0
- package/data/skills/performance-profiling/SKILL.md +255 -0
- package/data/skills/perplexity-search/SKILL.md +441 -0
- package/data/skills/pharmacogenomics-agent/SKILL.md +143 -0
- package/data/skills/pharmgx-reporter/SKILL.md +134 -0
- package/data/skills/phylogenetics/SKILL.md +404 -0
- package/data/skills/plotly/SKILL.md +265 -0
- package/data/skills/polars/SKILL.md +385 -0
- package/data/skills/popeve-variant-predictor-agent/SKILL.md +213 -0
- package/data/skills/post-processing/SKILL.md +338 -0
- package/data/skills/pptx/SKILL.md +232 -0
- package/data/skills/pptx-official/SKILL.md +484 -0
- package/data/skills/pptx-posters/SKILL.md +414 -0
- package/data/skills/precision-oncology-agent/SKILL.md +53 -0
- package/data/skills/prior-auth-coworker/SKILL.md +60 -0
- package/data/skills/prior-auth-review-skill/SKILL.md +360 -0
- package/data/skills/profile-report/SKILL.md +120 -0
- package/data/skills/protac-design-agent/SKILL.md +220 -0
- package/data/skills/protein-design-workflow/SKILL.md +199 -0
- package/data/skills/protein-qc/SKILL.md +300 -0
- package/data/skills/protein-structure-prediction/SKILL.md +59 -0
- package/data/skills/proteinmpnn/SKILL.md +279 -0
- package/data/skills/protocolsio-integration/SKILL.md +415 -0
- package/data/skills/prs-net-deep-learning-agent/SKILL.md +232 -0
- package/data/skills/psychologist-analyst/SKILL.md +1888 -0
- package/data/skills/pubchem-database/SKILL.md +568 -0
- package/data/skills/pubmed-database/SKILL.md +454 -0
- package/data/skills/pubmed-search/SKILL.md +103 -0
- package/data/skills/pydeseq2/SKILL.md +553 -0
- package/data/skills/pydicom/SKILL.md +428 -0
- package/data/skills/pyhealth/SKILL.md +485 -0
- package/data/skills/pylabrobot/SKILL.md +179 -0
- package/data/skills/pymc/SKILL.md +566 -0
- package/data/skills/pymoo/SKILL.md +565 -0
- package/data/skills/pyopenms/SKILL.md +211 -0
- package/data/skills/pysam/SKILL.md +259 -0
- package/data/skills/pytdc/SKILL.md +454 -0
- package/data/skills/pytorch-lightning/SKILL.md +172 -0
- package/data/skills/pyzotero/SKILL.md +111 -0
- package/data/skills/radgpt-radiology-reporter/SKILL.md +67 -0
- package/data/skills/radiomics-pathomics-fusion-agent/SKILL.md +221 -0
- package/data/skills/rdkit/SKILL.md +763 -0
- package/data/skills/reactome-database/SKILL.md +272 -0
- package/data/skills/receiving-code-review/SKILL.md +213 -0
- package/data/skills/recovery-community-moderator/SKILL.md +175 -0
- package/data/skills/regulatory-drafter/SKILL.md +56 -0
- package/data/skills/regulatory-drafting/SKILL.md +35 -0
- package/data/skills/rehabilitation-analyzer/SKILL.md +636 -0
- package/data/skills/repro-enforcer/SKILL.md +50 -0
- package/data/skills/requesting-code-review/SKILL.md +105 -0
- package/data/skills/research-grants/SKILL.md +935 -0
- package/data/skills/research-literature/SKILL.md +35 -0
- package/data/skills/research-lookup/SKILL.md +502 -0
- package/data/skills/rfdiffusion/SKILL.md +306 -0
- package/data/skills/rna-velocity-agent/SKILL.md +174 -0
- package/data/skills/scanpy/SKILL.md +380 -0
- package/data/skills/scfoundation-model-agent/SKILL.md +210 -0
- package/data/skills/scientific-brainstorming/SKILL.md +185 -0
- package/data/skills/scientific-critical-thinking/SKILL.md +566 -0
- package/data/skills/scientific-manuscript/SKILL.md +181 -0
- package/data/skills/scientific-problem-selection/SKILL.md +269 -0
- package/data/skills/scientific-schematics/SKILL.md +619 -0
- package/data/skills/scientific-slides/SKILL.md +1154 -0
- package/data/skills/scientific-visualization/SKILL.md +773 -0
- package/data/skills/scientific-writing/SKILL.md +483 -0
- package/data/skills/scikit-bio/SKILL.md +431 -0
- package/data/skills/scikit-learn/SKILL.md +515 -0
- package/data/skills/scikit-survival/SKILL.md +393 -0
- package/data/skills/scrna-orchestrator/SKILL.md +204 -0
- package/data/skills/scrna-qc/SKILL.md +43 -0
- package/data/skills/scvelo/SKILL.md +321 -0
- package/data/skills/scvi-tools/SKILL.md +184 -0
- package/data/skills/seaborn/SKILL.md +671 -0
- package/data/skills/search-strategy/SKILL.md +247 -0
- package/data/skills/seq-wrangler/SKILL.md +58 -0
- package/data/skills/shap/SKILL.md +560 -0
- package/data/skills/simo-multiomics-integration-agent/SKILL.md +178 -0
- package/data/skills/simpy/SKILL.md +423 -0
- package/data/skills/simulation-orchestrator/SKILL.md +230 -0
- package/data/skills/simulation-validator/SKILL.md +195 -0
- package/data/skills/single-annotation/SKILL.md +129 -0
- package/data/skills/single-cell-rna-qc/SKILL.md +175 -0
- package/data/skills/single-cellphone-db/SKILL.md +68 -0
- package/data/skills/single-clustering/SKILL.md +75 -0
- package/data/skills/single-downstream-analysis/SKILL.md +150 -0
- package/data/skills/single-multiomics/SKILL.md +44 -0
- package/data/skills/single-preprocessing/SKILL.md +184 -0
- package/data/skills/single-to-spatial-mapping/SKILL.md +48 -0
- package/data/skills/single-trajectory/SKILL.md +62 -0
- package/data/skills/sleep-analyzer/SKILL.md +773 -0
- package/data/skills/slurm-job-script-generator/SKILL.md +135 -0
- package/data/skills/solublempnn/SKILL.md +165 -0
- package/data/skills/spatial-agent/SKILL.md +56 -0
- package/data/skills/spatial-epigenomics-agent/SKILL.md +163 -0
- package/data/skills/spatial-transcriptomics-agent/SKILL.md +75 -0
- package/data/skills/spatial-transcriptomics-analysis/SKILL.md +72 -0
- package/data/skills/spatial-transcriptomics-analysis/STAgent/SKILL.md +75 -0
- package/data/skills/spatial-transcriptomics-analysis/SpatialAgent/SKILL.md +56 -0
- package/data/skills/spatial-transcriptomics-analysis/bioSkills/image-analysis/SKILL.md +266 -0
- package/data/skills/spatial-transcriptomics-analysis/bioSkills/spatial-communication/SKILL.md +287 -0
- package/data/skills/spatial-transcriptomics-analysis/bioSkills/spatial-data-io/SKILL.md +243 -0
- package/data/skills/spatial-transcriptomics-analysis/bioSkills/spatial-deconvolution/SKILL.md +298 -0
- package/data/skills/spatial-transcriptomics-analysis/bioSkills/spatial-domains/SKILL.md +229 -0
- package/data/skills/spatial-transcriptomics-analysis/bioSkills/spatial-multiomics/SKILL.md +172 -0
- package/data/skills/spatial-transcriptomics-analysis/bioSkills/spatial-neighbors/SKILL.md +189 -0
- package/data/skills/spatial-transcriptomics-analysis/bioSkills/spatial-preprocessing/SKILL.md +232 -0
- package/data/skills/spatial-transcriptomics-analysis/bioSkills/spatial-proteomics/SKILL.md +127 -0
- package/data/skills/spatial-transcriptomics-analysis/bioSkills/spatial-statistics/SKILL.md +225 -0
- package/data/skills/spatial-transcriptomics-analysis/bioSkills/spatial-visualization/SKILL.md +270 -0
- package/data/skills/spatial-tutorials/SKILL.md +87 -0
- package/data/skills/speech-pathology-ai/SKILL.md +184 -0
- package/data/skills/statistical-analysis/SKILL.md +626 -0
- package/data/skills/statsmodels/SKILL.md +608 -0
- package/data/skills/string-database/SKILL.md +528 -0
- package/data/skills/struct-predictor/SKILL.md +52 -0
- package/data/skills/subagent-driven-development/SKILL.md +242 -0
- package/data/skills/systematic-debugging/SKILL.md +296 -0
- package/data/skills/tcell-exhaustion-analysis-agent/SKILL.md +139 -0
- package/data/skills/tcga-preprocessing/SKILL.md +49 -0
- package/data/skills/tcm-constitution-analyzer/SKILL.md +664 -0
- package/data/skills/tcr-pmhc-prediction-agent/SKILL.md +226 -0
- package/data/skills/tcr-repertoire-analysis-agent/SKILL.md +218 -0
- package/data/skills/test-driven-development/SKILL.md +371 -0
- package/data/skills/tiledbvcf/SKILL.md +459 -0
- package/data/skills/time-resolved-cryoem-agent/SKILL.md +223 -0
- package/data/skills/time-stepping/SKILL.md +140 -0
- package/data/skills/timesfm-forecasting/SKILL.md +785 -0
- package/data/skills/tme-immune-profiling-agent/SKILL.md +220 -0
- package/data/skills/tooluniverse-adverse-event-detection/SKILL.md +1115 -0
- package/data/skills/tooluniverse-antibody-engineering/SKILL.md +1581 -0
- package/data/skills/tooluniverse-binder-discovery/SKILL.md +1459 -0
- package/data/skills/tooluniverse-cancer-variant-interpretation/SKILL.md +971 -0
- package/data/skills/tooluniverse-chemical-compound-retrieval/SKILL.md +322 -0
- package/data/skills/tooluniverse-chemical-safety/SKILL.md +733 -0
- package/data/skills/tooluniverse-clinical-guidelines/SKILL.md +399 -0
- package/data/skills/tooluniverse-clinical-trial-design/SKILL.md +1195 -0
- package/data/skills/tooluniverse-clinical-trial-matching/SKILL.md +1333 -0
- package/data/skills/tooluniverse-crispr-screen-analysis/SKILL.md +900 -0
- package/data/skills/tooluniverse-disease-research/SKILL.md +630 -0
- package/data/skills/tooluniverse-drug-drug-interaction/SKILL.md +73 -0
- package/data/skills/tooluniverse-drug-repurposing/SKILL.md +595 -0
- package/data/skills/tooluniverse-drug-research/SKILL.md +1642 -0
- package/data/skills/tooluniverse-drug-target-validation/SKILL.md +1206 -0
- package/data/skills/tooluniverse-epigenomics/SKILL.md +1489 -0
- package/data/skills/tooluniverse-expression-data-retrieval/SKILL.md +389 -0
- package/data/skills/tooluniverse-gene-enrichment/SKILL.md +402 -0
- package/data/skills/tooluniverse-gwas-drug-discovery/SKILL.md +576 -0
- package/data/skills/tooluniverse-gwas-finemapping/SKILL.md +309 -0
- package/data/skills/tooluniverse-gwas-snp-interpretation/SKILL.md +223 -0
- package/data/skills/tooluniverse-gwas-study-explorer/SKILL.md +342 -0
- package/data/skills/tooluniverse-gwas-trait-to-gene/SKILL.md +236 -0
- package/data/skills/tooluniverse-image-analysis/SKILL.md +439 -0
- package/data/skills/tooluniverse-immune-repertoire-analysis/SKILL.md +949 -0
- package/data/skills/tooluniverse-immunotherapy-response-prediction/SKILL.md +865 -0
- package/data/skills/tooluniverse-infectious-disease/SKILL.md +749 -0
- package/data/skills/tooluniverse-literature-deep-research/SKILL.md +1050 -0
- package/data/skills/tooluniverse-metabolomics/SKILL.md +298 -0
- package/data/skills/tooluniverse-metabolomics-analysis/SKILL.md +764 -0
- package/data/skills/tooluniverse-multi-omics-integration/SKILL.md +703 -0
- package/data/skills/tooluniverse-multiomic-disease-characterization/SKILL.md +1138 -0
- package/data/skills/tooluniverse-network-pharmacology/SKILL.md +1312 -0
- package/data/skills/tooluniverse-pharmacovigilance/SKILL.md +807 -0
- package/data/skills/tooluniverse-phylogenetics/SKILL.md +461 -0
- package/data/skills/tooluniverse-polygenic-risk-score/SKILL.md +397 -0
- package/data/skills/tooluniverse-precision-medicine-stratification/SKILL.md +1143 -0
- package/data/skills/tooluniverse-precision-oncology/SKILL.md +1091 -0
- package/data/skills/tooluniverse-protein-interactions/SKILL.md +446 -0
- package/data/skills/tooluniverse-protein-structure-retrieval/SKILL.md +416 -0
- package/data/skills/tooluniverse-protein-therapeutic-design/SKILL.md +637 -0
- package/data/skills/tooluniverse-proteomics-analysis/SKILL.md +843 -0
- package/data/skills/tooluniverse-rare-disease-diagnosis/SKILL.md +1257 -0
- package/data/skills/tooluniverse-rnaseq-deseq2/SKILL.md +536 -0
- package/data/skills/tooluniverse-sequence-retrieval/SKILL.md +419 -0
- package/data/skills/tooluniverse-single-cell/SKILL.md +719 -0
- package/data/skills/tooluniverse-spatial-omics-analysis/SKILL.md +1102 -0
- package/data/skills/tooluniverse-spatial-transcriptomics/SKILL.md +788 -0
- package/data/skills/tooluniverse-statistical-modeling/SKILL.md +557 -0
- package/data/skills/tooluniverse-structural-variant-analysis/SKILL.md +1356 -0
- package/data/skills/tooluniverse-systems-biology/SKILL.md +374 -0
- package/data/skills/tooluniverse-target-research/SKILL.md +1510 -0
- package/data/skills/tooluniverse-variant-analysis/SKILL.md +448 -0
- package/data/skills/tooluniverse-variant-interpretation/SKILL.md +1118 -0
- package/data/skills/torch-geometric/SKILL.md +674 -0
- package/data/skills/torch_geometric/SKILL.md +670 -0
- package/data/skills/torchdrug/SKILL.md +444 -0
- package/data/skills/tpd-ternary-complex-agent/SKILL.md +226 -0
- package/data/skills/transformers/SKILL.md +157 -0
- package/data/skills/travel-health-analyzer/SKILL.md +421 -0
- package/data/skills/treatment-plans/SKILL.md +1576 -0
- package/data/skills/trial-eligibility-agent/SKILL.md +54 -0
- package/data/skills/trialgpt-matching/SKILL.md +66 -0
- package/data/skills/tumor-clonal-evolution-agent/SKILL.md +134 -0
- package/data/skills/tumor-heterogeneity-agent/SKILL.md +216 -0
- package/data/skills/tumor-mutational-burden-agent/SKILL.md +188 -0
- package/data/skills/ukb-navigator/SKILL.md +113 -0
- package/data/skills/umap-learn/SKILL.md +473 -0
- package/data/skills/uniprot-database/SKILL.md +189 -0
- package/data/skills/universal-single-cell-annotator/SKILL.md +72 -0
- package/data/skills/using-git-worktrees/SKILL.md +218 -0
- package/data/skills/using-superpowers/SKILL.md +95 -0
- package/data/skills/usmle/SKILL.md +62 -0
- package/data/skills/uspto-database/SKILL.md +597 -0
- package/data/skills/vaex/SKILL.md +180 -0
- package/data/skills/varcadd-pathogenicity/SKILL.md +68 -0
- package/data/skills/variant-interpretation-acmg/SKILL.md +58 -0
- package/data/skills/variant-interpretation-acmg/bioSkills/clinical-interpretation/SKILL.md +334 -0
- package/data/skills/variant-interpretation-acmg/bioSkills/consensus-sequences/SKILL.md +343 -0
- package/data/skills/variant-interpretation-acmg/bioSkills/deepvariant/SKILL.md +279 -0
- package/data/skills/variant-interpretation-acmg/bioSkills/filtering-best-practices/SKILL.md +362 -0
- package/data/skills/variant-interpretation-acmg/bioSkills/gatk-variant-calling/SKILL.md +398 -0
- package/data/skills/variant-interpretation-acmg/bioSkills/joint-calling/SKILL.md +343 -0
- package/data/skills/variant-interpretation-acmg/bioSkills/structural-variant-calling/SKILL.md +256 -0
- package/data/skills/variant-interpretation-acmg/bioSkills/variant-annotation/SKILL.md +387 -0
- package/data/skills/variant-interpretation-acmg/bioSkills/variant-calling/SKILL.md +258 -0
- package/data/skills/variant-interpretation-acmg/bioSkills/variant-normalization/SKILL.md +304 -0
- package/data/skills/variant-interpretation-acmg/bioSkills/vcf-basics/SKILL.md +329 -0
- package/data/skills/variant-interpretation-acmg/bioSkills/vcf-manipulation/SKILL.md +398 -0
- package/data/skills/variant-interpretation-acmg/bioSkills/vcf-statistics/SKILL.md +424 -0
- package/data/skills/variant-interpretation-acmg/varCADD/SKILL.md +68 -0
- package/data/skills/vcf-annotator/SKILL.md +55 -0
- package/data/skills/verification-before-completion/SKILL.md +139 -0
- package/data/skills/virtual-lab-agent/SKILL.md +240 -0
- package/data/skills/wearable-analysis-agent/SKILL.md +70 -0
- package/data/skills/weightloss-analyzer/SKILL.md +320 -0
- package/data/skills/wellally-tech/SKILL.md +685 -0
- package/data/skills/wikipedia-search/SKILL.md +481 -0
- package/data/skills/writing-plans/SKILL.md +116 -0
- package/data/skills/writing-skills/SKILL.md +655 -0
- package/data/skills/xlsx/SKILL.md +292 -0
- package/data/skills/xlsx-official/SKILL.md +289 -0
- package/data/skills/zarr-python/SKILL.md +777 -0
- package/data/skills/zinc-database/SKILL.md +398 -0
- package/data/tools/__init__.py +8 -0
- package/data/tools/hpc.py +71 -0
- package/data/tools/hpc_client/__init__.py +8 -0
- package/data/tools/hpc_client/builders/__init__.py +12 -0
- package/data/tools/hpc_client/builders/alphafold.py +36 -0
- package/data/tools/hpc_client/builders/boltz.py +33 -0
- package/data/tools/hpc_client/builders/chai.py +30 -0
- package/data/tools/hpc_client/builders/immunebuilder.py +31 -0
- package/data/tools/hpc_client/builders/rfantibody.py +58 -0
- package/data/tools/hpc_client/builders/thermompnn.py +16 -0
- package/data/tools/hpc_client/hpc_api.py +41 -0
- package/data/tools/hpc_client/hpc_tools.py +218 -0
- package/data/tools/hpc_dynamic.py +71 -0
- package/data/tools/integrations/__init__.py +14 -0
- package/data/tools/integrations/adaptyv.py +107 -0
- package/data/tools/integrations/addgene.py +52 -0
- package/data/tools/integrations/api_internal.py +33 -0
- package/data/tools/molecular_biology.py +688 -0
- package/data/tools/pharmacology.py +67 -0
- package/data/workflows/bulk-omics-clustering/SKILL.md +501 -0
- package/data/workflows/bulk-omics-clustering/references/best_practices.md +395 -0
- package/data/workflows/bulk-omics-clustering/references/clustering_methods_comparison.md +288 -0
- package/data/workflows/bulk-omics-clustering/references/common-patterns.md +1136 -0
- package/data/workflows/bulk-omics-clustering/references/decision-guide.md +819 -0
- package/data/workflows/bulk-omics-clustering/references/distance_metrics_guide.md +388 -0
- package/data/workflows/bulk-omics-clustering/references/parameter_guide.md +396 -0
- package/data/workflows/bulk-omics-clustering/references/r-quick-start.md +105 -0
- package/data/workflows/bulk-omics-clustering/references/validation_metrics_guide.md +315 -0
- package/data/workflows/bulk-omics-clustering/scripts/characterize_clusters.py +255 -0
- package/data/workflows/bulk-omics-clustering/scripts/cluster_validation.py +449 -0
- package/data/workflows/bulk-omics-clustering/scripts/density_clustering.py +321 -0
- package/data/workflows/bulk-omics-clustering/scripts/dimensionality_reduction.py +328 -0
- package/data/workflows/bulk-omics-clustering/scripts/distance_metrics.py +251 -0
- package/data/workflows/bulk-omics-clustering/scripts/export_results.py +456 -0
- package/data/workflows/bulk-omics-clustering/scripts/hierarchical_clustering.R +229 -0
- package/data/workflows/bulk-omics-clustering/scripts/hierarchical_clustering.py +269 -0
- package/data/workflows/bulk-omics-clustering/scripts/kmeans_clustering.py +346 -0
- package/data/workflows/bulk-omics-clustering/scripts/load_example_data.R +171 -0
- package/data/workflows/bulk-omics-clustering/scripts/load_example_data.py +171 -0
- package/data/workflows/bulk-omics-clustering/scripts/model_based_clustering.py +370 -0
- package/data/workflows/bulk-omics-clustering/scripts/optimal_clusters.py +381 -0
- package/data/workflows/bulk-omics-clustering/scripts/plot_cluster_heatmap.R +141 -0
- package/data/workflows/bulk-omics-clustering/scripts/plot_clustering_results.py +452 -0
- package/data/workflows/bulk-omics-clustering/scripts/prepare_data.py +250 -0
- package/data/workflows/bulk-omics-clustering/scripts/stability_analysis.py +434 -0
- package/data/workflows/bulk-rnaseq-counts-to-de-deseq2/SKILL.md +505 -0
- package/data/workflows/bulk-rnaseq-counts-to-de-deseq2/references/comprehensive-reference.md +440 -0
- package/data/workflows/bulk-rnaseq-counts-to-de-deseq2/references/decision-guide.md +327 -0
- package/data/workflows/bulk-rnaseq-counts-to-de-deseq2/references/troubleshooting.md +456 -0
- package/data/workflows/bulk-rnaseq-counts-to-de-deseq2/references/usage-guide.md +75 -0
- package/data/workflows/bulk-rnaseq-counts-to-de-deseq2/scripts/basic_workflow.R +149 -0
- package/data/workflows/bulk-rnaseq-counts-to-de-deseq2/scripts/batch_correction.R +44 -0
- package/data/workflows/bulk-rnaseq-counts-to-de-deseq2/scripts/export_results.R +190 -0
- package/data/workflows/bulk-rnaseq-counts-to-de-deseq2/scripts/extract_results.R +242 -0
- package/data/workflows/bulk-rnaseq-counts-to-de-deseq2/scripts/load_example_data.R +250 -0
- package/data/workflows/bulk-rnaseq-counts-to-de-deseq2/scripts/multi_condition.R +50 -0
- package/data/workflows/bulk-rnaseq-counts-to-de-deseq2/scripts/qc_plots.R +410 -0
- package/data/workflows/bulk-rnaseq-counts-to-de-deseq2/scripts/transformations.R +218 -0
- package/data/workflows/chip-atlas-diff-analysis/SKILL.md +222 -0
- package/data/workflows/chip-atlas-diff-analysis/references/chipatlas_diff_api_format.md +106 -0
- package/data/workflows/chip-atlas-diff-analysis/references/diff_analysis_methods.md +89 -0
- package/data/workflows/chip-atlas-diff-analysis/references/output_format.md +78 -0
- package/data/workflows/chip-atlas-diff-analysis/scripts/__init__.py +1 -0
- package/data/workflows/chip-atlas-diff-analysis/scripts/annotate_genes.py +144 -0
- package/data/workflows/chip-atlas-diff-analysis/scripts/export_all.py +498 -0
- package/data/workflows/chip-atlas-diff-analysis/scripts/filter_regions.py +176 -0
- package/data/workflows/chip-atlas-diff-analysis/scripts/generate_all_plots.py +321 -0
- package/data/workflows/chip-atlas-diff-analysis/scripts/load_example_data.py +149 -0
- package/data/workflows/chip-atlas-diff-analysis/scripts/load_user_data.py +211 -0
- package/data/workflows/chip-atlas-diff-analysis/scripts/parse_bed_results.py +240 -0
- package/data/workflows/chip-atlas-diff-analysis/scripts/qc_checks.py +621 -0
- package/data/workflows/chip-atlas-diff-analysis/scripts/query_chipatlas_api.py +329 -0
- package/data/workflows/chip-atlas-diff-analysis/scripts/run_diff_workflow.py +256 -0
- package/data/workflows/chip-atlas-peak-enrichment/SKILL.md +212 -0
- package/data/workflows/chip-atlas-peak-enrichment/references/chipatlas_metadata_format.md +115 -0
- package/data/workflows/chip-atlas-peak-enrichment/references/enrichment_statistics.md +145 -0
- package/data/workflows/chip-atlas-peak-enrichment/references/peak_thresholds.md +63 -0
- package/data/workflows/chip-atlas-peak-enrichment/references/promoter_definitions.md +69 -0
- package/data/workflows/chip-atlas-peak-enrichment/scripts/__init__.py +1 -0
- package/data/workflows/chip-atlas-peak-enrichment/scripts/convert_genes_to_regions.py +271 -0
- package/data/workflows/chip-atlas-peak-enrichment/scripts/export_all.py +456 -0
- package/data/workflows/chip-atlas-peak-enrichment/scripts/filter_experiments.py +116 -0
- package/data/workflows/chip-atlas-peak-enrichment/scripts/generate_all_plots.py +280 -0
- package/data/workflows/chip-atlas-peak-enrichment/scripts/load_example_data.py +96 -0
- package/data/workflows/chip-atlas-peak-enrichment/scripts/load_user_data.py +183 -0
- package/data/workflows/chip-atlas-peak-enrichment/scripts/query_chipatlas_api.py +349 -0
- package/data/workflows/chip-atlas-peak-enrichment/scripts/run_enrichment_workflow.py +271 -0
- package/data/workflows/chip-atlas-target-genes/SKILL.md +230 -0
- package/data/workflows/chip-atlas-target-genes/references/macs2_binding_scores.md +89 -0
- package/data/workflows/chip-atlas-target-genes/references/string_scores.md +58 -0
- package/data/workflows/chip-atlas-target-genes/references/target_genes_data_format.md +73 -0
- package/data/workflows/chip-atlas-target-genes/scripts/__init__.py +0 -0
- package/data/workflows/chip-atlas-target-genes/scripts/download_target_genes.py +200 -0
- package/data/workflows/chip-atlas-target-genes/scripts/export_all.py +340 -0
- package/data/workflows/chip-atlas-target-genes/scripts/filter_targets.py +205 -0
- package/data/workflows/chip-atlas-target-genes/scripts/generate_all_plots.py +330 -0
- package/data/workflows/chip-atlas-target-genes/scripts/load_example_query.py +61 -0
- package/data/workflows/chip-atlas-target-genes/scripts/load_user_query.py +47 -0
- package/data/workflows/chip-atlas-target-genes/scripts/run_target_genes_workflow.py +141 -0
- package/data/workflows/clinicaltrials-landscape/SKILL.md +257 -0
- package/data/workflows/clinicaltrials-landscape/references/api-parameters.md +181 -0
- package/data/workflows/clinicaltrials-landscape/references/mechanisms.md +141 -0
- package/data/workflows/clinicaltrials-landscape/references/output-schema.md +184 -0
- package/data/workflows/clinicaltrials-landscape/scripts/__init__.py +1 -0
- package/data/workflows/clinicaltrials-landscape/scripts/classify_mechanisms.py +359 -0
- package/data/workflows/clinicaltrials-landscape/scripts/compile_trials.py +579 -0
- package/data/workflows/clinicaltrials-landscape/scripts/disease_config.py +161 -0
- package/data/workflows/clinicaltrials-landscape/scripts/export_all.py +242 -0
- package/data/workflows/clinicaltrials-landscape/scripts/generate_landscape_plots.py +761 -0
- package/data/workflows/clinicaltrials-landscape/scripts/generate_pdf_report.py +1465 -0
- package/data/workflows/clinicaltrials-landscape/scripts/generate_report.py +1813 -0
- package/data/workflows/clinicaltrials-landscape/scripts/query_clinicaltrials.py +307 -0
- package/data/workflows/coexpression-network/SKILL.md +344 -0
- package/data/workflows/coexpression-network/references/parameter-tuning-guide.md +591 -0
- package/data/workflows/coexpression-network/references/troubleshooting.md +483 -0
- package/data/workflows/coexpression-network/references/wgcna-best-practices.md +563 -0
- package/data/workflows/coexpression-network/references/wgcna-reference.md +538 -0
- package/data/workflows/coexpression-network/scripts/build_network.R +43 -0
- package/data/workflows/coexpression-network/scripts/correlate_modules_traits.R +92 -0
- package/data/workflows/coexpression-network/scripts/export_wgcna_results.R +117 -0
- package/data/workflows/coexpression-network/scripts/identify_hub_genes.R +63 -0
- package/data/workflows/coexpression-network/scripts/load_example_data.R +214 -0
- package/data/workflows/coexpression-network/scripts/module_enrichment.R +159 -0
- package/data/workflows/coexpression-network/scripts/pick_soft_power.R +70 -0
- package/data/workflows/coexpression-network/scripts/plot_all_wgcna.R +104 -0
- package/data/workflows/coexpression-network/scripts/plot_eigengene_heatmap.R +65 -0
- package/data/workflows/coexpression-network/scripts/plot_hub_genes.R +70 -0
- package/data/workflows/coexpression-network/scripts/plot_module_dendrogram.R +50 -0
- package/data/workflows/coexpression-network/scripts/plotting_helpers.R +87 -0
- package/data/workflows/coexpression-network/scripts/prepare_wgcna_data.R +73 -0
- package/data/workflows/coexpression-network/scripts/wgcna_workflow.R +93 -0
- package/data/workflows/experimental-design-statistics/SKILL.md +408 -0
- package/data/workflows/experimental-design-statistics/references/batch_effect_mitigation.md +756 -0
- package/data/workflows/experimental-design-statistics/references/cv_tissue_database.csv +30 -0
- package/data/workflows/experimental-design-statistics/references/experimental_design_best_practices.md +515 -0
- package/data/workflows/experimental-design-statistics/references/multiple_testing_guide.md +730 -0
- package/data/workflows/experimental-design-statistics/references/power_analysis_guidelines.md +635 -0
- package/data/workflows/experimental-design-statistics/references/qc_guidelines.md +310 -0
- package/data/workflows/experimental-design-statistics/references/software_requirements.md +328 -0
- package/data/workflows/experimental-design-statistics/references/troubleshooting_guide.md +510 -0
- package/data/workflows/experimental-design-statistics/scripts/batch_assignment.R +302 -0
- package/data/workflows/experimental-design-statistics/scripts/batch_validation.R +342 -0
- package/data/workflows/experimental-design-statistics/scripts/export_design.R +352 -0
- package/data/workflows/experimental-design-statistics/scripts/load_example_data.R +204 -0
- package/data/workflows/experimental-design-statistics/scripts/multiple_testing.R +417 -0
- package/data/workflows/experimental-design-statistics/scripts/plot_power_curves.R +317 -0
- package/data/workflows/experimental-design-statistics/scripts/power_atacseq.R +229 -0
- package/data/workflows/experimental-design-statistics/scripts/power_pilot_based.R +289 -0
- package/data/workflows/experimental-design-statistics/scripts/power_rnaseq.R +247 -0
- package/data/workflows/experimental-design-statistics/scripts/sample_size_de.R +327 -0
- package/data/workflows/experimental-design-statistics/scripts/sample_size_scrna.R +304 -0
- package/data/workflows/functional-enrichment-from-degs/SKILL.md +387 -0
- package/data/workflows/functional-enrichment-from-degs/references/database_guide.md +354 -0
- package/data/workflows/functional-enrichment-from-degs/references/decision-guide.md +546 -0
- package/data/workflows/functional-enrichment-from-degs/references/gsea_ora_comparison.md +213 -0
- package/data/workflows/functional-enrichment-from-degs/references/gsea_ora_validation_framework.md +483 -0
- package/data/workflows/functional-enrichment-from-degs/references/interpretation_guidelines.md +374 -0
- package/data/workflows/functional-enrichment-from-degs/references/method-reference.md +742 -0
- package/data/workflows/functional-enrichment-from-degs/scripts/export_results.R +190 -0
- package/data/workflows/functional-enrichment-from-degs/scripts/generate_plots.R +240 -0
- package/data/workflows/functional-enrichment-from-degs/scripts/get_msigdb_genesets.R +75 -0
- package/data/workflows/functional-enrichment-from-degs/scripts/load_de_results.R +60 -0
- package/data/workflows/functional-enrichment-from-degs/scripts/load_example_data.R +212 -0
- package/data/workflows/functional-enrichment-from-degs/scripts/prepare_gene_lists.R +92 -0
- package/data/workflows/functional-enrichment-from-degs/scripts/run_gsea.R +44 -0
- package/data/workflows/functional-enrichment-from-degs/scripts/run_ora.R +53 -0
- package/data/workflows/genetic-variant-annotation/SKILL.md +440 -0
- package/data/workflows/genetic-variant-annotation/references/auto_installation_implementation.md +274 -0
- package/data/workflows/genetic-variant-annotation/references/consequence_terms.md +392 -0
- package/data/workflows/genetic-variant-annotation/references/filtering_strategies.md +808 -0
- package/data/workflows/genetic-variant-annotation/references/installation_guide.md +557 -0
- package/data/workflows/genetic-variant-annotation/references/pathogenicity_interpretation.md +473 -0
- package/data/workflows/genetic-variant-annotation/references/qc_guidelines.md +524 -0
- package/data/workflows/genetic-variant-annotation/references/snpeff_best_practices.md +481 -0
- package/data/workflows/genetic-variant-annotation/references/tool_selection_guide.md +433 -0
- package/data/workflows/genetic-variant-annotation/references/troubleshooting_guide.md +678 -0
- package/data/workflows/genetic-variant-annotation/references/vep_best_practices.md +450 -0
- package/data/workflows/genetic-variant-annotation/scripts/annotate_genes.py +243 -0
- package/data/workflows/genetic-variant-annotation/scripts/export_results.py +450 -0
- package/data/workflows/genetic-variant-annotation/scripts/filter_variants.py +365 -0
- package/data/workflows/genetic-variant-annotation/scripts/install_tools.py +246 -0
- package/data/workflows/genetic-variant-annotation/scripts/load_example_data.py +166 -0
- package/data/workflows/genetic-variant-annotation/scripts/parse_snpeff_output.py +283 -0
- package/data/workflows/genetic-variant-annotation/scripts/parse_vep_output.py +257 -0
- package/data/workflows/genetic-variant-annotation/scripts/plot_variant_distribution.py +372 -0
- package/data/workflows/genetic-variant-annotation/scripts/prioritize_variants.py +287 -0
- package/data/workflows/genetic-variant-annotation/scripts/run_snpeff.py +418 -0
- package/data/workflows/genetic-variant-annotation/scripts/run_vep.py +358 -0
- package/data/workflows/genetic-variant-annotation/scripts/select_tool.py +203 -0
- package/data/workflows/genetic-variant-annotation/scripts/test_complete_workflow.py +312 -0
- package/data/workflows/genetic-variant-annotation/scripts/test_pickle_load.py +118 -0
- package/data/workflows/genetic-variant-annotation/scripts/validate_vcf.py +351 -0
- package/data/workflows/genetic-variant-annotation/scripts/verify_changes.py +212 -0
- package/data/workflows/grn-pyscenic/SKILL.md +331 -0
- package/data/workflows/grn-pyscenic/references/cli_interface.md +222 -0
- package/data/workflows/grn-pyscenic/references/database_downloads.md +245 -0
- package/data/workflows/grn-pyscenic/scripts/export_all.py +192 -0
- package/data/workflows/grn-pyscenic/scripts/generate_report.py +512 -0
- package/data/workflows/grn-pyscenic/scripts/integrate_with_adata.py +54 -0
- package/data/workflows/grn-pyscenic/scripts/load_example_data.py +200 -0
- package/data/workflows/grn-pyscenic/scripts/load_expression_data.py +61 -0
- package/data/workflows/grn-pyscenic/scripts/plot_regulon_visualizations.py +263 -0
- package/data/workflows/grn-pyscenic/scripts/run_grn_workflow.py +184 -0
- package/data/workflows/gwas-to-function-twas/SKILL.md +394 -0
- package/data/workflows/gwas-to-function-twas/references/fusion_best_practices.md +120 -0
- package/data/workflows/gwas-to-function-twas/references/installation-guide.md +414 -0
- package/data/workflows/gwas-to-function-twas/references/ldsc_qc_guidelines.md +287 -0
- package/data/workflows/gwas-to-function-twas/references/spredixxcan_best_practices.md +166 -0
- package/data/workflows/gwas-to-function-twas/references/therapeutic_interpretation_guide.md +717 -0
- package/data/workflows/gwas-to-function-twas/references/tissue_reference_guide.md +182 -0
- package/data/workflows/gwas-to-function-twas/references/troubleshooting_guide.md +317 -0
- package/data/workflows/gwas-to-function-twas/references/twas_hub_validation_guide.md +88 -0
- package/data/workflows/gwas-to-function-twas/scripts/colocalization_analysis.py +187 -0
- package/data/workflows/gwas-to-function-twas/scripts/druggability_scoring.py +199 -0
- package/data/workflows/gwas-to-function-twas/scripts/export_results.py +220 -0
- package/data/workflows/gwas-to-function-twas/scripts/integrate_variant_annotation.py +194 -0
- package/data/workflows/gwas-to-function-twas/scripts/interpret_therapeutic_direction.py +418 -0
- package/data/workflows/gwas-to-function-twas/scripts/mendelian_randomization.py +749 -0
- package/data/workflows/gwas-to-function-twas/scripts/multilayer_direction_analysis.py +471 -0
- package/data/workflows/gwas-to-function-twas/scripts/plot_twas_results.py +252 -0
- package/data/workflows/gwas-to-function-twas/scripts/run_fusion.py +155 -0
- package/data/workflows/gwas-to-function-twas/scripts/run_smultixcan.py +102 -0
- package/data/workflows/gwas-to-function-twas/scripts/run_spredixxcan.py +138 -0
- package/data/workflows/gwas-to-function-twas/scripts/select_reference_panel.py +253 -0
- package/data/workflows/gwas-to-function-twas/scripts/validate_gwas_sumstats.py +214 -0
- package/data/workflows/gwas-to-function-twas/scripts/validate_with_twas_hub.py +439 -0
- package/data/workflows/lasso-biomarker-panel/SKILL.md +322 -0
- package/data/workflows/lasso-biomarker-panel/references/decision-guide.md +64 -0
- package/data/workflows/lasso-biomarker-panel/references/lasso-reference.md +110 -0
- package/data/workflows/lasso-biomarker-panel/references/validation-guide.md +105 -0
- package/data/workflows/lasso-biomarker-panel/scripts/biological_interpretation.R +1560 -0
- package/data/workflows/lasso-biomarker-panel/scripts/biomarker_plots.R +350 -0
- package/data/workflows/lasso-biomarker-panel/scripts/export_results.R +1492 -0
- package/data/workflows/lasso-biomarker-panel/scripts/lasso_workflow.R +328 -0
- package/data/workflows/lasso-biomarker-panel/scripts/load_example_data.R +1903 -0
- package/data/workflows/lasso-biomarker-panel/scripts/plotting_helpers.R +78 -0
- package/data/workflows/lasso-biomarker-panel/scripts/prepare_features.R +225 -0
- package/data/workflows/lasso-biomarker-panel/scripts/query_cellxgene.py +107 -0
- package/data/workflows/lasso-biomarker-panel/scripts/validate_external.R +174 -0
- package/data/workflows/literature-preclinical/SKILL.md +276 -0
- package/data/workflows/literature-preclinical/assets/eval/simple_test.py +386 -0
- package/data/workflows/literature-preclinical/references/experiment-extraction-guide.md +147 -0
- package/data/workflows/literature-preclinical/references/full-text-enrichment-guide.md +121 -0
- package/data/workflows/literature-preclinical/references/preclinical-search-guide.md +117 -0
- package/data/workflows/literature-preclinical/scripts/extract_experiments.py +401 -0
- package/data/workflows/literature-preclinical/scripts/generate_plots.R +303 -0
- package/data/workflows/literature-preclinical/scripts/narrative_synthesis.py +653 -0
- package/data/workflows/literature-preclinical/scripts/preclinical_search.py +332 -0
- package/data/workflows/literature-preclinical/scripts/preclinical_synthesis.py +237 -0
- package/data/workflows/literature-preclinical/scripts/report_generation.py +326 -0
- package/data/workflows/mendelian-randomization-twosamplemr/SKILL.md +210 -0
- package/data/workflows/mendelian-randomization-twosamplemr/references/interpretation-guide.md +239 -0
- package/data/workflows/mendelian-randomization-twosamplemr/references/method-reference.md +190 -0
- package/data/workflows/mendelian-randomization-twosamplemr/scripts/export_results.R +123 -0
- package/data/workflows/mendelian-randomization-twosamplemr/scripts/generate_report.R +411 -0
- package/data/workflows/mendelian-randomization-twosamplemr/scripts/load_data.R +281 -0
- package/data/workflows/mendelian-randomization-twosamplemr/scripts/mr_plots.R +163 -0
- package/data/workflows/mendelian-randomization-twosamplemr/scripts/run_mr_analysis.R +322 -0
- package/data/workflows/pcr-primer-design/SKILL.md +397 -0
- package/data/workflows/pcr-primer-design/references/code_examples.md +594 -0
- package/data/workflows/pcr-primer-design/references/miqe_guidelines.md +453 -0
- package/data/workflows/pcr-primer-design/references/parameter_ranges.md +356 -0
- package/data/workflows/pcr-primer-design/references/primer_design_best_practices.md +451 -0
- package/data/workflows/pcr-primer-design/references/troubleshooting_guide.md +477 -0
- package/data/workflows/pcr-primer-design/scripts/__init__.py +2 -0
- package/data/workflows/pcr-primer-design/scripts/calculate_tm.py +306 -0
- package/data/workflows/pcr-primer-design/scripts/check_dimers.py +298 -0
- package/data/workflows/pcr-primer-design/scripts/check_secondary_structures.py +343 -0
- package/data/workflows/pcr-primer-design/scripts/design_qpcr_primers.py +233 -0
- package/data/workflows/pcr-primer-design/scripts/design_standard_primers.py +197 -0
- package/data/workflows/pcr-primer-design/scripts/design_taqman_probes.py +226 -0
- package/data/workflows/pcr-primer-design/scripts/export_results.py +382 -0
- package/data/workflows/pcr-primer-design/scripts/generate_reports.py +379 -0
- package/data/workflows/pcr-primer-design/scripts/validate_specificity.py +311 -0
- package/data/workflows/pcr-primer-design/scripts/visualize_primers.py +379 -0
- package/data/workflows/polygenic-risk-score-prs-catalog/SKILL.md +195 -0
- package/data/workflows/polygenic-risk-score-prs-catalog/references/interpretation-guide.md +80 -0
- package/data/workflows/polygenic-risk-score-prs-catalog/references/pgs-catalog-guide.md +109 -0
- package/data/workflows/polygenic-risk-score-prs-catalog/scripts/export_results.R +186 -0
- package/data/workflows/polygenic-risk-score-prs-catalog/scripts/generate_plots.R +283 -0
- package/data/workflows/polygenic-risk-score-prs-catalog/scripts/load_pgs_weights.R +228 -0
- package/data/workflows/polygenic-risk-score-prs-catalog/scripts/load_reference_data.R +191 -0
- package/data/workflows/polygenic-risk-score-prs-catalog/scripts/score_traits.R +216 -0
- package/data/workflows/pooled-crispr-screens/SKILL.md +362 -0
- package/data/workflows/pooled-crispr-screens/references/crispr_screen_best_practices.md +349 -0
- package/data/workflows/pooled-crispr-screens/references/qc_guidelines.md +722 -0
- package/data/workflows/pooled-crispr-screens/references/statistical_methods.md +644 -0
- package/data/workflows/pooled-crispr-screens/references/troubleshooting_guide.md +684 -0
- package/data/workflows/pooled-crispr-screens/references/umi_optimization.md +297 -0
- package/data/workflows/pooled-crispr-screens/scripts/concatenate_libraries.py +132 -0
- package/data/workflows/pooled-crispr-screens/scripts/detect_perturbed_cells.py +255 -0
- package/data/workflows/pooled-crispr-screens/scripts/differential_expression.py +202 -0
- package/data/workflows/pooled-crispr-screens/scripts/differential_expression_glmgampoi.py +320 -0
- package/data/workflows/pooled-crispr-screens/scripts/export_results.py +261 -0
- package/data/workflows/pooled-crispr-screens/scripts/expression_filtering.py +159 -0
- package/data/workflows/pooled-crispr-screens/scripts/gene_name_corrections.py +188 -0
- package/data/workflows/pooled-crispr-screens/scripts/generate_report.py +485 -0
- package/data/workflows/pooled-crispr-screens/scripts/load_10x_libraries.py +69 -0
- package/data/workflows/pooled-crispr-screens/scripts/load_example_data.py +257 -0
- package/data/workflows/pooled-crispr-screens/scripts/map_sgrna_to_cells.py +119 -0
- package/data/workflows/pooled-crispr-screens/scripts/normalize_and_scale.py +140 -0
- package/data/workflows/pooled-crispr-screens/scripts/qc_filtering.py +185 -0
- package/data/workflows/pooled-crispr-screens/scripts/run_glmgampoi.R +181 -0
- package/data/workflows/pooled-crispr-screens/scripts/screen_all_perturbations.py +306 -0
- package/data/workflows/pooled-crispr-screens/scripts/validate_perturbations.py +314 -0
- package/data/workflows/pooled-crispr-screens/scripts/visualize_perturbations.py +314 -0
- package/data/workflows/scrnaseq-scanpy-core-analysis/SKILL.md +425 -0
- package/data/workflows/scrnaseq-scanpy-core-analysis/references/ambient_rna_correction.md +422 -0
- package/data/workflows/scrnaseq-scanpy-core-analysis/references/common-patterns.md +533 -0
- package/data/workflows/scrnaseq-scanpy-core-analysis/references/integration_methods.md +820 -0
- package/data/workflows/scrnaseq-scanpy-core-analysis/references/marker_gene_database.md +471 -0
- package/data/workflows/scrnaseq-scanpy-core-analysis/references/pseudobulk_de_guide.md +408 -0
- package/data/workflows/scrnaseq-scanpy-core-analysis/references/qc_guidelines.md +535 -0
- package/data/workflows/scrnaseq-scanpy-core-analysis/references/scanpy_best_practices.md +496 -0
- package/data/workflows/scrnaseq-scanpy-core-analysis/references/troubleshooting_guide.md +668 -0
- package/data/workflows/scrnaseq-scanpy-core-analysis/references/workflow-details.md +727 -0
- package/data/workflows/scrnaseq-scanpy-core-analysis/scripts/annotate_celltypes.py +431 -0
- package/data/workflows/scrnaseq-scanpy-core-analysis/scripts/cluster_cells.py +293 -0
- package/data/workflows/scrnaseq-scanpy-core-analysis/scripts/export_results.py +423 -0
- package/data/workflows/scrnaseq-scanpy-core-analysis/scripts/filter_cells.py +531 -0
- package/data/workflows/scrnaseq-scanpy-core-analysis/scripts/find_markers.py +391 -0
- package/data/workflows/scrnaseq-scanpy-core-analysis/scripts/find_variable_genes.py +222 -0
- package/data/workflows/scrnaseq-scanpy-core-analysis/scripts/integrate_scvi.py +665 -0
- package/data/workflows/scrnaseq-scanpy-core-analysis/scripts/integration_diagnostics.py +678 -0
- package/data/workflows/scrnaseq-scanpy-core-analysis/scripts/load_example_data.py +68 -0
- package/data/workflows/scrnaseq-scanpy-core-analysis/scripts/normalize_data.py +325 -0
- package/data/workflows/scrnaseq-scanpy-core-analysis/scripts/plot_dimreduction.py +389 -0
- package/data/workflows/scrnaseq-scanpy-core-analysis/scripts/plot_qc.py +320 -0
- package/data/workflows/scrnaseq-scanpy-core-analysis/scripts/pseudobulk_de.py +553 -0
- package/data/workflows/scrnaseq-scanpy-core-analysis/scripts/qc_metrics.py +477 -0
- package/data/workflows/scrnaseq-scanpy-core-analysis/scripts/remove_ambient_rna.py +347 -0
- package/data/workflows/scrnaseq-scanpy-core-analysis/scripts/run_umap.py +188 -0
- package/data/workflows/scrnaseq-scanpy-core-analysis/scripts/scale_and_pca.py +365 -0
- package/data/workflows/scrnaseq-scanpy-core-analysis/scripts/setup_and_import.py +334 -0
- package/data/workflows/scrnaseq-seurat-core-analysis/SKILL.md +585 -0
- package/data/workflows/scrnaseq-seurat-core-analysis/references/ambient_rna_correction.md +422 -0
- package/data/workflows/scrnaseq-seurat-core-analysis/references/common-patterns.md +667 -0
- package/data/workflows/scrnaseq-seurat-core-analysis/references/decision-guide.md +456 -0
- package/data/workflows/scrnaseq-seurat-core-analysis/references/integration_methods.md +864 -0
- package/data/workflows/scrnaseq-seurat-core-analysis/references/marker_gene_database.md +471 -0
- package/data/workflows/scrnaseq-seurat-core-analysis/references/pseudobulk_de_guide.md +408 -0
- package/data/workflows/scrnaseq-seurat-core-analysis/references/qc_guidelines.md +452 -0
- package/data/workflows/scrnaseq-seurat-core-analysis/references/seurat_best_practices.md +417 -0
- package/data/workflows/scrnaseq-seurat-core-analysis/references/troubleshooting_guide.md +566 -0
- package/data/workflows/scrnaseq-seurat-core-analysis/references/workflow-details.md +801 -0
- package/data/workflows/scrnaseq-seurat-core-analysis/scripts/annotate_celltypes.R +306 -0
- package/data/workflows/scrnaseq-seurat-core-analysis/scripts/cluster_cells.R +223 -0
- package/data/workflows/scrnaseq-seurat-core-analysis/scripts/export_results.R +292 -0
- package/data/workflows/scrnaseq-seurat-core-analysis/scripts/filter_cells.R +576 -0
- package/data/workflows/scrnaseq-seurat-core-analysis/scripts/find_markers.R +325 -0
- package/data/workflows/scrnaseq-seurat-core-analysis/scripts/find_variable_features.R +106 -0
- package/data/workflows/scrnaseq-seurat-core-analysis/scripts/integrate_batches.R +504 -0
- package/data/workflows/scrnaseq-seurat-core-analysis/scripts/integration_diagnostics.R +596 -0
- package/data/workflows/scrnaseq-seurat-core-analysis/scripts/load_example_data.R +89 -0
- package/data/workflows/scrnaseq-seurat-core-analysis/scripts/normalize_data.R +184 -0
- package/data/workflows/scrnaseq-seurat-core-analysis/scripts/plot_dimreduction.R +273 -0
- package/data/workflows/scrnaseq-seurat-core-analysis/scripts/plot_qc.R +250 -0
- package/data/workflows/scrnaseq-seurat-core-analysis/scripts/pseudobulk_de.R +324 -0
- package/data/workflows/scrnaseq-seurat-core-analysis/scripts/qc_metrics.R +358 -0
- package/data/workflows/scrnaseq-seurat-core-analysis/scripts/remove_ambient_rna.R +281 -0
- package/data/workflows/scrnaseq-seurat-core-analysis/scripts/run_umap.R +116 -0
- package/data/workflows/scrnaseq-seurat-core-analysis/scripts/scale_and_pca.R +243 -0
- package/data/workflows/scrnaseq-seurat-core-analysis/scripts/setup_and_import.R +193 -0
- package/data/workflows/spatial-transcriptomics/SKILL.md +256 -0
- package/data/workflows/spatial-transcriptomics/references/spatial-analysis-guide.md +216 -0
- package/data/workflows/spatial-transcriptomics/scripts/export_results.py +214 -0
- package/data/workflows/spatial-transcriptomics/scripts/generate_all_plots.py +397 -0
- package/data/workflows/spatial-transcriptomics/scripts/load_example_data.py +175 -0
- package/data/workflows/spatial-transcriptomics/scripts/spatial_workflow.py +206 -0
- package/dist/bgi.js +28 -1
- package/package.json +2 -1
|
@@ -0,0 +1,688 @@
|
|
|
1
|
+
# Decompiled with PyLingual (https://pylingual.io)
|
|
2
|
+
# Internal filename: 'build/lib/biomni/tool/molecular_biology.py'
|
|
3
|
+
# Bytecode version: 3.11a7e (3495)
|
|
4
|
+
# Source timestamp: 2060-12-12 19:13:11 UTC (2870104391)
|
|
5
|
+
|
|
6
|
+
from collections import namedtuple
|
|
7
|
+
from itertools import combinations
|
|
8
|
+
from typing import Any
|
|
9
|
+
from Bio import Entrez, Restriction, SeqIO
|
|
10
|
+
from Bio.Seq import Seq
|
|
11
|
+
from Bio.SeqUtils import MeltingTemp as mt
|
|
12
|
+
def find_open_reading_frames(sequence, min_length, search_reverse=False, filter_subsets=False):
|
|
13
|
+
ORF = namedtuple('ORF', ['sequence', 'aa_sequence', 'start', 'end', 'strand', 'frame'])
|
|
14
|
+
def find_orfs_in_frame(seq_str, frame, strand):
|
|
15
|
+
orfs = []
|
|
16
|
+
seq_length = len(seq_str)
|
|
17
|
+
offset = frame - 1
|
|
18
|
+
frame_seq = seq_str[offset:]
|
|
19
|
+
start_positions = []
|
|
20
|
+
stop_positions = []
|
|
21
|
+
for i in range(0, len(frame_seq) - 2, 3):
|
|
22
|
+
codon = frame_seq[i:i + 3]
|
|
23
|
+
if len(codon)!= 3:
|
|
24
|
+
continue
|
|
25
|
+
else:
|
|
26
|
+
if codon == 'ATG':
|
|
27
|
+
start_positions.append(i)
|
|
28
|
+
else:
|
|
29
|
+
if codon in ['TAA', 'TAG', 'TGA']:
|
|
30
|
+
stop_positions.append(i)
|
|
31
|
+
while start_positions and start_positions[0] < i:
|
|
32
|
+
start_pos = start_positions.pop(0)
|
|
33
|
+
orf_seq = frame_seq[start_pos:i + 3]
|
|
34
|
+
if len(orf_seq) >= min_length:
|
|
35
|
+
orig_start = start_pos + offset
|
|
36
|
+
orig_end = i + offset + 3
|
|
37
|
+
if strand == '-':
|
|
38
|
+
orig_start = seq_length - orig_end
|
|
39
|
+
orig_end = seq_length - (start_pos + offset)
|
|
40
|
+
orf_bio_seq = Seq(orf_seq)
|
|
41
|
+
aa_seq = str(orf_bio_seq.translate(to_stop=True))
|
|
42
|
+
orfs.append(ORF(sequence=orf_seq, aa_sequence=aa_seq, start=orig_start, end=orig_end, strand=strand, frame=frame if strand == '+' else -frame))
|
|
43
|
+
return orfs
|
|
44
|
+
sequence = str(sequence).upper()
|
|
45
|
+
seq_obj = Seq(sequence)
|
|
46
|
+
all_orfs = []
|
|
47
|
+
for frame in range(1, 4):
|
|
48
|
+
all_orfs.extend(find_orfs_in_frame(sequence, frame, '+'))
|
|
49
|
+
if search_reverse:
|
|
50
|
+
rev_comp = str(seq_obj.reverse_complement())
|
|
51
|
+
for frame in range(1, 4):
|
|
52
|
+
all_orfs.extend(find_orfs_in_frame(rev_comp, frame, '-'))
|
|
53
|
+
if filter_subsets:
|
|
54
|
+
all_orfs.sort(key=lambda x: len(x.sequence), reverse=True)
|
|
55
|
+
filtered_orfs = []
|
|
56
|
+
for _i, orf in enumerate(all_orfs):
|
|
57
|
+
is_subset = False
|
|
58
|
+
for larger_orf in filtered_orfs:
|
|
59
|
+
if orf.strand == larger_orf.strand and orf.start >= larger_orf.start and (orf.end <= larger_orf.end):
|
|
60
|
+
is_subset = True
|
|
61
|
+
break
|
|
62
|
+
if not is_subset:
|
|
63
|
+
filtered_orfs.append(orf)
|
|
64
|
+
all_orfs = filtered_orfs
|
|
65
|
+
all_orfs.sort(key=lambda x: len(x.sequence), reverse=True)
|
|
66
|
+
forward_orfs = len([orf for orf in all_orfs if orf.strand == '+'])
|
|
67
|
+
reverse_orfs = len([orf for orf in all_orfs if orf.strand == '-'])
|
|
68
|
+
avg_length = sum((len(orf.sequence) for orf in all_orfs)) / len(all_orfs) if all_orfs else 0
|
|
69
|
+
summary_stats = {'total_orfs': len(all_orfs), 'forward_orfs': forward_orfs, 'reverse_orfs': reverse_orfs, 'avg_length': round(avg_length, 1)}
|
|
70
|
+
explanation = 'Output fields:\n- summary_stats: Statistical overview of found ORFs\n * total_orfs: Total number of ORFs found\n * forward_orfs: Number of ORFs on forward strand\n * reverse_orfs: Number of ORFs on reverse strand\n * avg_length: Average length of all ORFs in base pairs\n- orfs: List of all found ORFs, where each ORF contains:\n * sequence: Nucleotide sequence of the ORF\n * aa_sequence: Translated amino acid sequence\n * start: Start position in original sequence (0-based)\n * end: End position in original sequence\n * strand: \'+\' for forward strand, \'-\' for reverse complement\n * frame: Reading frame (1,2,3 for forward; -1,-2,-3 for reverse)'
|
|
71
|
+
return {'explanation': explanation, 'summary_stats': summary_stats, 'orfs': all_orfs}
|
|
72
|
+
def compare_sequences_for_mutations(query_sequence, reference_sequence, query_start=1):
|
|
73
|
+
if not all([query_sequence, reference_sequence, query_start]):
|
|
74
|
+
return {'explanation': 'Output fields:\n- mutations: List of mutations found, where each mutation is formatted as:\n * RefAA_Position_QueryAA\n * RefAA: Original amino acid/base in reference sequence\n * Position: Position where mutation occurs (1-based)\n * QueryAA: New amino acid/base in query sequence\n * Example: \'A123T\' means position 123 changed from A to T\n- success: Boolean indicating if comparison was successful', 'mutations': [], 'success': False}
|
|
75
|
+
else:
|
|
76
|
+
mutations = []
|
|
77
|
+
for i, (query_aa, ref_aa) in enumerate(zip(query_sequence, reference_sequence, strict=False)):
|
|
78
|
+
if query_aa!= ref_aa and ref_aa!= '-' and (query_aa!= '-'):
|
|
79
|
+
position = query_start + i
|
|
80
|
+
mutations.append(f'{ref_aa}{position}{query_aa}')
|
|
81
|
+
return {'explanation': 'Output fields:\n- mutations: List of mutations found, where each mutation is formatted as:\n * RefAA_Position_QueryAA\n * RefAA: Original amino acid/base in reference sequence\n * Position: Position where mutation occurs (1-based)\n * QueryAA: New amino acid/base in query sequence\n * Example: \'A123T\' means position 123 changed from A to T\n- success: Boolean indicating if comparison was successful', 'mutations': mutations, 'success': True}
|
|
82
|
+
def fetch_gene_coding_sequence(gene_name: str, organism: str, email: str=None) -> list[dict[str, str]]:
|
|
83
|
+
if email:
|
|
84
|
+
Entrez.email = email
|
|
85
|
+
def search_gene() -> str:
|
|
86
|
+
query = f'{organism}[Organism] AND {gene_name}[Gene]'
|
|
87
|
+
with Entrez.esearch(db='gene', term=query, retmax=5) as handle:
|
|
88
|
+
record = Entrez.read(handle)
|
|
89
|
+
if not record['IdList']:
|
|
90
|
+
raise ValueError(f'No records found for gene \'{gene_name}\' in organism \'{organism}\'')
|
|
91
|
+
else:
|
|
92
|
+
return record['IdList'][0]
|
|
93
|
+
def get_refseq_id(gene_id: str) -> str:
|
|
94
|
+
with Entrez.efetch(db='gene', id=gene_id, rettype='gb', retmode='xml') as handle:
|
|
95
|
+
gene_record = Entrez.read(handle)
|
|
96
|
+
try:
|
|
97
|
+
locus = gene_record[0]['Entrezgene_locus'][0]
|
|
98
|
+
accession = locus['Gene-commentary_accession']
|
|
99
|
+
version = locus['Gene-commentary_version']
|
|
100
|
+
return f'{accession}.{version}'
|
|
101
|
+
except (KeyError, IndexError) as e:
|
|
102
|
+
raise RuntimeError(f'Unable to process gene record: {e}')
|
|
103
|
+
def get_coding_sequences(refseq_id: str) -> list[dict[str, str]]:
|
|
104
|
+
with Entrez.efetch(db='nucleotide', id=refseq_id, rettype='gbwithparts', retmode='text') as handle:
|
|
105
|
+
seq_record = SeqIO.read(handle, 'genbank')
|
|
106
|
+
sequences = []
|
|
107
|
+
for feature in seq_record.features:
|
|
108
|
+
if feature.type == 'CDS' and feature.qualifiers.get('gene', ['N/A'])[0] == gene_name:
|
|
109
|
+
cds_seq = feature.location.extract(seq_record).seq
|
|
110
|
+
sequences.append({'refseq_id': refseq_id, 'sequence': str(cds_seq)})
|
|
111
|
+
return sequences
|
|
112
|
+
try:
|
|
113
|
+
gene_id = search_gene()
|
|
114
|
+
refseq_id = get_refseq_id(gene_id)
|
|
115
|
+
sequences = get_coding_sequences(refseq_id)
|
|
116
|
+
explanation = 'Output fields for each coding sequence:\n- refseq_id: RefSeq identifier for the gene sequence\n * Format: NM_XXXXXX.X for mRNA or NC_XXXXXX.X for genomic DNA\n * Example: NM_000546.5 for human TP53\n- sequence: The actual coding sequence of the gene\n * Contains only exons (introns removed)\n * Starts with ATG (start codon)\n * Ends with a stop codon (TAA, TAG, or TGA)'
|
|
117
|
+
return {'explanation': explanation, 'sequences': sequences}
|
|
118
|
+
except Exception as e:
|
|
119
|
+
raise RuntimeError(f'Failed to retrieve coding sequences: {str(e)}') from e
|
|
120
|
+
def align_primers_to_sequence(long_seq: str, short_seqs: str | list[str]) -> list[dict]:
|
|
121
|
+
long_seq = long_seq.upper()
|
|
122
|
+
if isinstance(short_seqs, str):
|
|
123
|
+
short_seqs = [short_seqs.upper()]
|
|
124
|
+
else:
|
|
125
|
+
short_seqs = [seq.upper() for seq in short_seqs]
|
|
126
|
+
def reverse_complement(seq):
|
|
127
|
+
complement = {'A': 'T', 'T': 'A', 'C': 'G', 'G': 'C'}
|
|
128
|
+
return ''.join((complement.get(base, base) for base in reversed(seq)))
|
|
129
|
+
results = []
|
|
130
|
+
for short_seq in short_seqs:
|
|
131
|
+
alignments = []
|
|
132
|
+
seq_len = len(short_seq)
|
|
133
|
+
sequences_to_check = [(short_seq, '+'), (reverse_complement(short_seq), '-')]
|
|
134
|
+
for seq_to_align, strand in sequences_to_check:
|
|
135
|
+
for i in range(len(long_seq) - seq_len + 1):
|
|
136
|
+
window = long_seq[i:i + seq_len]
|
|
137
|
+
mismatches = []
|
|
138
|
+
for j in range(seq_len):
|
|
139
|
+
if window[j]!= seq_to_align[j]:
|
|
140
|
+
mismatches.append((j, seq_to_align[j], window[j]))
|
|
141
|
+
if len(mismatches) <= 1:
|
|
142
|
+
alignments.append({'position': i, 'strand': strand, 'mismatches': mismatches})
|
|
143
|
+
results.append({'sequence': short_seq, 'alignments': alignments})
|
|
144
|
+
return {'explanation': 'Output fields:\n- sequences: List of alignment results, where each contains:\n * sequence: The short sequence that was aligned\n * alignments: List of all alignment positions found, where each contains:\n - position: 0-based start position in the target sequence\n - strand: \'+\' for forward strand, \'-\' for reverse complement\n - mismatches: List of mismatches, each containing:\n * position: Position in the short sequence where mismatch occurs\n * expected: Base expected from short sequence\n * found: Base found in target sequence', 'sequences': results}
|
|
145
|
+
def design_simple_primer(sequence: str, start_pos: int, primer_length: int=20, min_gc: float=0.4, max_gc: float=0.6, min_tm: float=55.0, max_tm: float=65.0, search_window: int=100) -> dict[str, Any] | None:
|
|
146
|
+
primer_region_start = start_pos
|
|
147
|
+
primer_region_end = min(start_pos + search_window, len(sequence))
|
|
148
|
+
primer_region = sequence[primer_region_start:primer_region_end]
|
|
149
|
+
if len(primer_region) < primer_length:
|
|
150
|
+
return None
|
|
151
|
+
else:
|
|
152
|
+
best_primer = None
|
|
153
|
+
best_score = float('inf')
|
|
154
|
+
for j in range(0, len(primer_region) - primer_length + 1):
|
|
155
|
+
candidate = primer_region[j:j + primer_length]
|
|
156
|
+
gc_content = (candidate.count('G') + candidate.count('C')) / primer_length
|
|
157
|
+
if gc_content < min_gc or gc_content > max_gc:
|
|
158
|
+
continue
|
|
159
|
+
else:
|
|
160
|
+
tm = mt.Tm_Wallace(candidate)
|
|
161
|
+
if tm < min_tm or tm > max_tm:
|
|
162
|
+
continue
|
|
163
|
+
else:
|
|
164
|
+
ideal_gc = (min_gc + max_gc) / 2
|
|
165
|
+
ideal_tm = (min_tm + max_tm) / 2
|
|
166
|
+
gc_penalty = abs(gc_content - ideal_gc) * 100
|
|
167
|
+
tm_penalty = abs(tm - ideal_tm)
|
|
168
|
+
score = gc_penalty + tm_penalty
|
|
169
|
+
if score < best_score:
|
|
170
|
+
best_score = score
|
|
171
|
+
best_primer = {'sequence': candidate, 'position': primer_region_start + j, 'gc': gc_content, 'tm': tm, 'score': score}
|
|
172
|
+
return best_primer
|
|
173
|
+
def design_pcr_primers_with_overhangs(sequence: str, forward_overhang: str, reverse_overhang: str, target_tm: float, min_primer_length: int=15) -> dict:
|
|
174
|
+
sequence = sequence.upper()
|
|
175
|
+
forward_primer = sequence[0:min_primer_length]
|
|
176
|
+
additional_nucleotides = 0
|
|
177
|
+
while mt.Tm_NN(Seq(forward_primer)) < target_tm:
|
|
178
|
+
additional_nucleotides += 1
|
|
179
|
+
forward_primer = sequence[0:min_primer_length + additional_nucleotides]
|
|
180
|
+
reverse_primer = str(Seq(sequence[-min_primer_length:]).reverse_complement())
|
|
181
|
+
additional_nucleotides = 0
|
|
182
|
+
while mt.Tm_NN(Seq(reverse_primer)) < target_tm:
|
|
183
|
+
additional_nucleotides += 1
|
|
184
|
+
reverse_primer = str(Seq(sequence[-(min_primer_length + additional_nucleotides):]).reverse_complement())
|
|
185
|
+
forward_primer = forward_overhang + forward_primer
|
|
186
|
+
reverse_primer = str(Seq(reverse_overhang).reverse_complement()) + reverse_primer
|
|
187
|
+
return {'explanation': 'Output fields:\n- forward_primer: Complete forward primer sequence\n * Includes 5\' overhang (if specified)\n * Binding region designed to match target Tm\n- reverse_primer: Complete reverse primer sequence\n * Includes 5\' overhang (if specified)\n * Binding region designed to match target Tm\n * Reverse complement of template sequence', 'forward_primer': forward_primer, 'reverse_primer': reverse_primer}
|
|
188
|
+
def design_sanger_verification_primers(plasmid_sequence: str, target_region: tuple[int, int], existing_primers: list[dict[str, str]] | None=None, is_circular: bool=True, coverage_length: int=800, primer_length: int=20, min_gc: float=0.4, max_gc: float=0.6, min_tm: float=55.0, max_tm: float=65.0) -> dict[str, Any]:
|
|
189
|
+
if existing_primers is None:
|
|
190
|
+
existing_primers = [{'name': 'T7', 'sequence': 'TAATACGACTCACTATAGGG'}, {'name': 'T7_Term', 'sequence': 'GCTAGTTATTGCTCAGCGG'}, {'name': 'T3', 'sequence': 'ATTAACCCTCACTAAAGGGA'}, {'name': 'SP6', 'sequence': 'GATTTAGGTGACACTATAG'}, {'name': 'U6', 'sequence': 'GACTATCATATGCTTACCGT'}, {'name': 'BGHR', 'sequence': 'TAGAAGGCACAGTCGAGG'}, {'name': 'M13F', 'sequence': 'GTAAAACGACGGCCAG'}, {'name': 'M13R', 'sequence': 'CAGGAAACAGCTATGAC'}, {'name': 'M13-40FOR', 'sequence': 'GTTTTCCCAGTCACGAC'}, {'name': 'M13-48REV', 'sequence': 'CGGATAACAATTTCACACAG'}, {'name': 'CMV-Forward', 'sequence': 'CGCAAATGGGCGGTAGGCGTG'}, {'name': '
|
|
191
|
+
def is_position_covered(pos, covered_regions):
|
|
192
|
+
return any((region['start'] <= pos <= region['end'] for region in covered_regions))
|
|
193
|
+
def is_region_fully_covered(covered_regions, start, end):
|
|
194
|
+
merged = merge_overlapping_regions(covered_regions)
|
|
195
|
+
for pos in range(start, end + 1):
|
|
196
|
+
if not any((r['start'] <= pos <= r['end'] for r in merged)):
|
|
197
|
+
return False
|
|
198
|
+
return True
|
|
199
|
+
def merge_overlapping_regions(regions):
|
|
200
|
+
if not regions:
|
|
201
|
+
return []
|
|
202
|
+
else:
|
|
203
|
+
sorted_regions = sorted(regions, key=lambda x: x['start'])
|
|
204
|
+
merged = [sorted_regions[0]]
|
|
205
|
+
for region in sorted_regions[1:]:
|
|
206
|
+
prev = merged[(-1)]
|
|
207
|
+
if region['start'] <= prev['end'] + 1:
|
|
208
|
+
prev['end'] = max(prev['end'], region['end'])
|
|
209
|
+
else:
|
|
210
|
+
merged.append(region)
|
|
211
|
+
return merged
|
|
212
|
+
plasmid_sequence = plasmid_sequence.upper()
|
|
213
|
+
start, end = target_region
|
|
214
|
+
region_length = end - start + 1
|
|
215
|
+
if region_length <= 0:
|
|
216
|
+
raise ValueError('Target region end must be greater than start')
|
|
217
|
+
else:
|
|
218
|
+
recommended_primers = []
|
|
219
|
+
coverage_map = []
|
|
220
|
+
if is_circular and end >= len(plasmid_sequence):
|
|
221
|
+
effective_sequence = plasmid_sequence + plasmid_sequence[:end - len(plasmid_sequence) + coverage_length]
|
|
222
|
+
else:
|
|
223
|
+
effective_sequence = plasmid_sequence
|
|
224
|
+
used_existing_primers = False
|
|
225
|
+
if existing_primers:
|
|
226
|
+
primer_pool = []
|
|
227
|
+
for i, primer in enumerate(existing_primers):
|
|
228
|
+
if isinstance(primer, str):
|
|
229
|
+
primer_info = {'name': f'Existing_{i + 1}', 'sequence': primer}
|
|
230
|
+
else:
|
|
231
|
+
primer_info = primer.copy()
|
|
232
|
+
if 'name' not in primer_info:
|
|
233
|
+
primer_info['name'] = f'Existing_{i + 1}'
|
|
234
|
+
primer_pool.append(primer_info)
|
|
235
|
+
alignment_results = align_primers_to_sequence(effective_sequence, [p['sequence'] for p in primer_pool])
|
|
236
|
+
potential_primers = []
|
|
237
|
+
for i, result in enumerate(alignment_results.get('sequences', [])):
|
|
238
|
+
primer_info = primer_pool[i]
|
|
239
|
+
primer_seq = primer_info['sequence']
|
|
240
|
+
for alignment in result.get('alignments', []):
|
|
241
|
+
position = alignment['position']
|
|
242
|
+
strand = alignment['strand']
|
|
243
|
+
if strand == '+':
|
|
244
|
+
coverage_start = position
|
|
245
|
+
coverage_end = position + coverage_length
|
|
246
|
+
else:
|
|
247
|
+
coverage_end = position + len(primer_seq)
|
|
248
|
+
coverage_start = coverage_end - coverage_length
|
|
249
|
+
if coverage_start <= end and coverage_end >= start:
|
|
250
|
+
covered_start = max(start, coverage_start)
|
|
251
|
+
covered_end = min(end, coverage_end)
|
|
252
|
+
potential_primers.append({'name': primer_info['name'], 'sequence': primer_seq, 'position': position, 'strand': strand, 'source': 'existing', 'covers': [covered_start, covered_end], 'coverage_length': covered_end - covered_start + 1})
|
|
253
|
+
potential_primers.sort(key=lambda x: x['coverage_length'], reverse=True)
|
|
254
|
+
if potential_primers:
|
|
255
|
+
covered_regions = []
|
|
256
|
+
selected_primers = []
|
|
257
|
+
while potential_primers and (not is_region_fully_covered(covered_regions, start, end)):
|
|
258
|
+
best_primer = potential_primers.pop(0)
|
|
259
|
+
new_covered_start, new_covered_end = best_primer['covers']
|
|
260
|
+
adds_new_coverage = False
|
|
261
|
+
for s in range(new_covered_start, new_covered_end + 1):
|
|
262
|
+
if not is_position_covered(s, covered_regions):
|
|
263
|
+
adds_new_coverage = True
|
|
264
|
+
break
|
|
265
|
+
if adds_new_coverage:
|
|
266
|
+
selected_primers.append(best_primer)
|
|
267
|
+
covered_regions.append({'start': new_covered_start, 'end': new_covered_end})
|
|
268
|
+
covered_regions = merge_overlapping_regions(covered_regions)
|
|
269
|
+
for primer in selected_primers:
|
|
270
|
+
recommended_primers.append(primer)
|
|
271
|
+
coverage_map.append({'primer': primer['name'], 'start': primer['covers'][0], 'end': primer['covers'][1], 'length': primer['covers'][1] - primer['covers'][0] + 1})
|
|
272
|
+
used_existing_primers = True
|
|
273
|
+
if not used_existing_primers:
|
|
274
|
+
uncovered_regions = [{'start': start, 'end': end}]
|
|
275
|
+
else:
|
|
276
|
+
covered_regions = [{'start': cm['start'], 'end': cm['end']} for cm in coverage_map]
|
|
277
|
+
covered_regions = merge_overlapping_regions(covered_regions)
|
|
278
|
+
uncovered_regions = []
|
|
279
|
+
current_pos = start
|
|
280
|
+
for region in covered_regions:
|
|
281
|
+
if current_pos < region['start']:
|
|
282
|
+
uncovered_regions.append({'start': current_pos, 'end': region['start'] - 1})
|
|
283
|
+
current_pos = max(current_pos, region['end'] + 1)
|
|
284
|
+
if current_pos <= end:
|
|
285
|
+
uncovered_regions.append({'start': current_pos, 'end': end})
|
|
286
|
+
for region in uncovered_regions:
|
|
287
|
+
gap_start = region['start']
|
|
288
|
+
gap_end = region['end']
|
|
289
|
+
gap_length = gap_end - gap_start + 1
|
|
290
|
+
num_primers_needed = max(1, gap_length // (coverage_length // 2) + (1 if gap_length % (coverage_length // 2) > 0 else 0))
|
|
291
|
+
positions = []
|
|
292
|
+
if num_primers_needed == 1:
|
|
293
|
+
positions.append(max(0, gap_start - 100))
|
|
294
|
+
else:
|
|
295
|
+
interval = gap_length / (num_primers_needed - 0.5)
|
|
296
|
+
for i in range(num_primers_needed):
|
|
297
|
+
pos = max(0, int(gap_start - 100 + i * interval))
|
|
298
|
+
positions.append(min(pos, len(effective_sequence) - primer_length))
|
|
299
|
+
for i, pos in enumerate(positions):
|
|
300
|
+
new_primer = design_single_primer(effective_sequence, pos, primer_length=primer_length, min_gc=min_gc, max_gc=max_gc, min_tm=min_tm, max_tm=max_tm)
|
|
301
|
+
if new_primer:
|
|
302
|
+
primer_name = f'New_primer_{len(recommended_primers) + 1}'
|
|
303
|
+
coverage_start = new_primer['position']
|
|
304
|
+
coverage_end = coverage_start + coverage_length
|
|
305
|
+
covered_start = max(start, coverage_start)
|
|
306
|
+
covered_end = min(end, coverage_end)
|
|
307
|
+
recommended_primers.append({'name': primer_name, 'sequence': new_primer['sequence'], 'position': new_primer['position'], 'strand': '+', 'source': 'newly_designed', 'gc': new_primer['gc'], 'tm': new_primer['tm'], 'covers': [covered_start, covered_end]})
|
|
308
|
+
coverage_map.append({'primer': primer_name, 'start': covered_start, 'end': covered_end, 'length': covered_end - covered_start + 1})
|
|
309
|
+
coverage_map.sort(key=lambda x: x['start'])
|
|
310
|
+
covered_regions = [{'start': cm['start'], 'end': cm['end']} for cm in coverage_map]
|
|
311
|
+
is_fully_covered = is_region_fully_covered(covered_regions, start, end)
|
|
312
|
+
result = {'target_region': {'start': start, 'end': end, 'length': region_length}, 'recommended_primers': recommended_primers, 'coverage_map': coverage_map, 'is_fully_covered': is_fully_covered}
|
|
313
|
+
if not is_fully_covered:
|
|
314
|
+
result['warning'] = 'The target region may not be fully covered. Consider manually reviewing the coverage map.'
|
|
315
|
+
return result
|
|
316
|
+
def run_pcr_reaction(sequence: str, forward_primer: str, reverse_primer: str, circular: bool=False) -> dict:
|
|
317
|
+
fwd_result = align_primers_to_sequence(sequence, forward_primer)['sequences'][0]['alignments']
|
|
318
|
+
rev_result = align_primers_to_sequence(sequence, str(Seq(reverse_primer).reverse_complement()))['sequences'][0]['alignments']
|
|
319
|
+
if not fwd_result or not rev_result:
|
|
320
|
+
return {'explanation': 'Output fields:\n- success: Boolean indicating if any PCR products were found\n- message: Error message if no products found\n- products: Empty list when no products found\n- forward_binding_sites: Number of forward primer binding locations\n- reverse_binding_sites: Number of reverse primer binding locations', 'success': False, 'message': 'One or both primers do not align to the sequence.', 'products': [], 'forward_binding_sites': len(fwd_result), 'reverse_binding_sites': len(rev_result)}
|
|
321
|
+
else:
|
|
322
|
+
fwd_positions = [align['position'] for align in fwd_result]
|
|
323
|
+
rev_positions = [align['position'] for align in rev_result]
|
|
324
|
+
sequence_length = len(sequence)
|
|
325
|
+
products = []
|
|
326
|
+
for fwd_pos in fwd_positions:
|
|
327
|
+
for rev_pos in rev_positions:
|
|
328
|
+
if fwd_pos < rev_pos:
|
|
329
|
+
size = rev_pos - fwd_pos + len(reverse_primer)
|
|
330
|
+
product = sequence[fwd_pos:rev_pos + len(reverse_primer)]
|
|
331
|
+
else:
|
|
332
|
+
if circular:
|
|
333
|
+
size = sequence_length - fwd_pos + rev_pos + len(reverse_primer)
|
|
334
|
+
product = sequence[fwd_pos:] + sequence[:rev_pos + len(reverse_primer)]
|
|
335
|
+
else:
|
|
336
|
+
continue
|
|
337
|
+
products.append({'size': size, 'forward_position': fwd_pos, 'reverse_position': rev_pos, 'sequence': product, 'forward_mismatches': fwd_result[fwd_positions.index(fwd_pos)]['mismatches'], 'reverse_mismatches': rev_result[rev_positions.index(rev_pos)]['mismatches']})
|
|
338
|
+
if not products:
|
|
339
|
+
return {'explanation': 'Output fields:\n- success: Boolean indicating if any PCR products were found\n- message: Error message if no products found\n- products: Empty list when no products found\n- forward_binding_sites: Number of forward primer binding locations\n- reverse_binding_sites: Number of reverse primer binding locations', 'success': False, 'message': 'No valid PCR products found with these primers.', 'products': [], 'forward_binding_sites': len(fwd_positions), 'reverse_binding_sites': len(rev_positions)}
|
|
340
|
+
else:
|
|
341
|
+
return {'explanation': 'Output fields:\n- success: Boolean indicating if any PCR products were found\n- products: List of all possible PCR products, where each contains:\n * size: Length of the PCR product in base pairs\n * sequence: The actual DNA sequence of the product\n * forward_position: Starting position of forward primer binding\n * reverse_position: Starting position of reverse primer binding\n * forward_mismatches: List of mismatches in forward primer binding\n * reverse_mismatches: List of mismatches in reverse primer binding\n- forward_binding_sites: Number of locations where forward primer can bind\n- reverse_binding_sites: Number of locations where reverse primer can bind', 'success': True, 'products': products, 'forward_binding_sites': len(fwd_positions), 'reverse_binding_sites': len(rev_positions)}
|
|
342
|
+
def run_multi_primer_pcr(sequence: str, primers: list[str], circular: bool=True) -> dict:
|
|
343
|
+
if not sequence or not primers or len(primers) < 2:
|
|
344
|
+
return {'success': False, 'message': 'Invalid input. Need sequence and at least 2 primers.'}
|
|
345
|
+
else:
|
|
346
|
+
results = {'explanation': 'Output fields:\n- success: Boolean indicating if any PCR products were found\n- primer_pairs: List of successful primer combinations, where each contains:\n * forward_primer: Sequence of the forward primer\n * reverse_primer: Sequence of the reverse primer\n * products: List of PCR products for this primer pair, where each contains:\n - size: Length of the PCR product in base pairs\n - sequence: The actual DNA sequence of the product\n - forward_position: Starting position of forward primer binding\n - reverse_position: Starting position of reverse primer binding\n - forward_mismatches: List of mismatches in forward primer binding\n - reverse_mismatches: List of mismatches in reverse primer binding\n- total_primer_pairs: Total number of primer combinations tested\n- productive_pairs: Number of primer pairs that produced products\n- product_size_range: Dictionary containing min and max product sizes\n- total_products: Total number of PCR products found\n- is_circular: Whether the template sequence was treated as circular', 'success': False, 'primer_pairs': [], 'is_circular': circular}
|
|
347
|
+
primer_pairs = list(combinations(primers, 2))
|
|
348
|
+
for fwd_primer, rev_primer in primer_pairs:
|
|
349
|
+
orientations = [(fwd_primer, rev_primer), (rev_primer, fwd_primer)]
|
|
350
|
+
for forward, reverse in orientations:
|
|
351
|
+
pcr_result = run_pcr_reaction(sequence, forward, reverse, circular=circular)
|
|
352
|
+
if pcr_result['success'] and pcr_result['products']:
|
|
353
|
+
results['primer_pairs'].append({'forward_primer': forward, 'reverse_primer': reverse, 'products': pcr_result['products']})
|
|
354
|
+
results['success'] = len(results['primer_pairs']) > 0
|
|
355
|
+
if results['success']:
|
|
356
|
+
results['total_primer_pairs'] = len(primer_pairs) * 2
|
|
357
|
+
results['productive_pairs'] = len(results['primer_pairs'])
|
|
358
|
+
all_products = [product for pair in results['primer_pairs'] for product in pair['products']]
|
|
359
|
+
results['product_size_range'] = {'min': min((p['size'] for p in all_products)), 'max': max((p['size'] for p in all_products))}
|
|
360
|
+
results['total_products'] = len(all_products)
|
|
361
|
+
return results
|
|
362
|
+
def find_specific_restriction_sites(dna_sequence: str, enzymes: list[str], is_circular: bool=True) -> dict:
|
|
363
|
+
seq = Seq(dna_sequence.upper())
|
|
364
|
+
rb = Restriction.RestrictionBatch(enzymes)
|
|
365
|
+
analysis = rb.search(seq, linear=not is_circular)
|
|
366
|
+
results = {'explanation': 'Output fields:\n- sequence_info: Information about the input sequence\n * length: Length of the sequence in base pairs\n * is_circular: Whether sequence is circular or linear\n- restriction_sites: Dictionary of enzymes and their sites, where each contains:\n * recognition_sequence: The DNA sequence the enzyme recognizes\n * cut_positions: Details about where enzyme cuts relative to site\n - 5_prime: Cut position on 5\' strand relative to start of recognition site\n - 3_prime: Cut position on 3\' strand relative to start of recognition site\n - overhang: Length of overhang produced (negative for 3\' overhang)\n - overhang_type: \'sticky\' for overhanging cuts, \'blunt\' for even cuts\n * sites: List of positions where enzyme cuts in the sequence (0-based)', 'sequence_info': {'length': len(seq), 'is_circular': is_circular}, 'restriction_sites': {}}
|
|
367
|
+
for enzyme, positions in analysis.items():
|
|
368
|
+
if positions:
|
|
369
|
+
enzyme_info = {'recognition_sequence': str(enzyme.elucidate()), 'cut_positions': {'5_prime': enzyme.fst5, '3_prime': enzyme.fst3, 'overhang': enzyme.ovhg, 'overhang_type': 'sticky' if enzyme.ovhg!= 0 else 'blunt'}, 'sites': sorted(positions)}
|
|
370
|
+
results['restriction_sites'][str(enzyme)] = enzyme_info
|
|
371
|
+
else:
|
|
372
|
+
results['restriction_sites'][str(enzyme)] = {'recognition_sequence': str(enzyme.elucidate()), 'sites': []}
|
|
373
|
+
return results
|
|
374
|
+
def find_all_common_restriction_sites(sequence: str, is_circular: bool=False) -> dict[str, list]:
|
|
375
|
+
seq = Seq(sequence.upper())
|
|
376
|
+
common_enzymes = ['EcoRI', 'BamHI', 'HindIII', 'XbaI', 'NotI', 'SalI', 'XhoI', 'KpnI', 'EcoRV', 'PstI', 'SmaI', 'NdeI', 'SacI', 'SphI', 'FseI', 'PacI', 'AscI', 'SbfI', 'ApaI', 'BglII', 'ClaI', 'DraI', 'NcoI', 'NheI', 'SacII', 'SpeI', 'StuI', 'AgeI', 'AvrII', 'BstEII', 'MluI', 'PvuI', 'PvuII']
|
|
377
|
+
rb = Restriction.RestrictionBatch(common_enzymes)
|
|
378
|
+
analysis = rb.search(seq, linear=not is_circular)
|
|
379
|
+
sites = {}
|
|
380
|
+
for enzyme_name in common_enzymes:
|
|
381
|
+
for enzyme in rb:
|
|
382
|
+
if str(enzyme) == enzyme_name:
|
|
383
|
+
sites[enzyme_name] = list(analysis.get(enzyme, []))
|
|
384
|
+
break
|
|
385
|
+
return {'explanation': 'List of common restriction enzymes and their cut positions in the sequence (0-based)', 'enzyme_sites': sites}
|
|
386
|
+
def digest_with_restriction_enzymes(dna_sequence: str, enzyme_names: list[str], is_circular: bool=True) -> dict:
|
|
387
|
+
seq = Seq(dna_sequence)
|
|
388
|
+
seq_length = len(seq)
|
|
389
|
+
all_cut_positions = []
|
|
390
|
+
for enzyme_name in enzyme_names:
|
|
391
|
+
enzyme_obj = getattr(Restriction, enzyme_name)
|
|
392
|
+
cut_sites = enzyme_obj.search(seq, linear=not is_circular)
|
|
393
|
+
all_cut_positions.extend(cut_sites)
|
|
394
|
+
all_cut_positions = sorted(set(all_cut_positions))
|
|
395
|
+
fragments = []
|
|
396
|
+
if not all_cut_positions:
|
|
397
|
+
fragments.append({'fragment': str(seq), 'length': seq_length, 'start': 0, 'end': seq_length})
|
|
398
|
+
else:
|
|
399
|
+
if is_circular:
|
|
400
|
+
for i in range(len(all_cut_positions)):
|
|
401
|
+
start = all_cut_positions[i]
|
|
402
|
+
if i == len(all_cut_positions) - 1:
|
|
403
|
+
end = all_cut_positions[0] + seq_length
|
|
404
|
+
else:
|
|
405
|
+
end = all_cut_positions[i + 1]
|
|
406
|
+
if end > seq_length:
|
|
407
|
+
fragment_seq = dna_sequence[start:] + dna_sequence[:end - seq_length]
|
|
408
|
+
else:
|
|
409
|
+
fragment_seq = dna_sequence[start:end]
|
|
410
|
+
fragments.append({'fragment': fragment_seq, 'length': len(fragment_seq), 'start': start, 'end': end if end <= seq_length else end - seq_length, 'is_wrapped': end > seq_length})
|
|
411
|
+
else:
|
|
412
|
+
if all_cut_positions[0] > 0:
|
|
413
|
+
fragments.append({'fragment': dna_sequence[:all_cut_positions[0]], 'length': all_cut_positions[0], 'start': 0, 'end': all_cut_positions[0]})
|
|
414
|
+
for i in range(len(all_cut_positions) - 1):
|
|
415
|
+
start = all_cut_positions[i]
|
|
416
|
+
end = all_cut_positions[i + 1]
|
|
417
|
+
fragments.append({'fragment': dna_sequence[start:end], 'length': end - start, 'start': start, 'end': end})
|
|
418
|
+
if all_cut_positions[(-1)] < seq_length:
|
|
419
|
+
fragments.append({'fragment': dna_sequence[all_cut_positions[(-1)]:], 'length': seq_length - all_cut_positions[(-1)], 'start': all_cut_positions[(-1)], 'end': seq_length})
|
|
420
|
+
fragments.sort(key=lambda x: x['length'], reverse=True)
|
|
421
|
+
return {'explanation': 'Output fields:\n- sequence_info: Information about the input sequence\n * length: Length of the sequence in base pairs\n * is_circular: Whether sequence is circular or linear\n- digestion_info: Overview of digestion results\n * enzymes_used: List of restriction enzymes used\n * number_of_fragments: Total number of fragments produced\n * cut_positions: List of all cut positions in sequence\n- fragments: List of all fragments produced, where each contains:\n * fragment: The DNA sequence of the fragment\n * length: Length of the fragment in base pairs\n * start: Start position in original sequence (0-based)\n * end: End position in original sequence\n * is_wrapped: (Only for circular) Whether fragment wraps around sequence end', 'sequence_info': {'length': len(seq), 'is_circular': is_circular}, 'digestion_info': {'enzymes_used': enzyme_names, 'number_of_fragments': len(fragments), 'cut_positions': all_cut_positions}, 'fragments': fragments}
|
|
422
|
+
def design_golden_gate_insert_oligos(backbone_sequence: str, insert_sequence: str, enzyme_name: str, is_circular: bool=True) -> dict[str, Any]:
|
|
423
|
+
TYPE_IIS_PROPERTIES = {'BsaI': {'recognition_site': 'GGTCTC', 'offset_fwd': 1, 'offset_rev': 5}, 'BsmBI': {'recognition_site': 'CGTCTC', 'offset_fwd': 1, 'offset_rev': 5}, 'BbsI': {'recognition_site': 'GAAGAC', 'offset_fwd': 2, 'offset_rev': 6}, 'Esp3I': {'recognition_site': 'CGTCTC', 'offset_fwd': 1, 'offset_rev': 5}, 'BtgZI': {'recognition_site': 'GCGATG', 'offset_fwd': 10, 'offset_rev': 14}, 'SapI': {'recognition_site': 'GCTCTTC', 'offset_fwd': 1, 'offset_rev': 4}}
|
|
424
|
+
if enzyme_name not in TYPE_IIS_PROPERTIES:
|
|
425
|
+
supported = ', '.join(TYPE_IIS_PROPERTIES.keys())
|
|
426
|
+
return {'success': False, 'message': f'Unsupported enzyme: {enzyme_name}. Currently supporting: {supported}'}
|
|
427
|
+
else:
|
|
428
|
+
backbone_sequence = ''.join((c for c in backbone_sequence.upper() if c in 'ATGC'))
|
|
429
|
+
insert_sequence = ''.join((c for c in insert_sequence.upper() if c in 'ATGC'))
|
|
430
|
+
enzyme_props = TYPE_IIS_PROPERTIES[enzyme_name]
|
|
431
|
+
recognition_site = enzyme_props['recognition_site']
|
|
432
|
+
offset_fwd = enzyme_props['offset_fwd']
|
|
433
|
+
offset_rev = enzyme_props['offset_rev']
|
|
434
|
+
def reverse_complement(seq):
|
|
435
|
+
complement = {'A': 'T', 'T': 'A', 'G': 'C', 'C': 'G'}
|
|
436
|
+
return ''.join((complement.get(base, 'N') for base in reversed(seq)))
|
|
437
|
+
restriction_sites = []
|
|
438
|
+
for i in range(len(backbone_sequence)):
|
|
439
|
+
if is_circular and i + len(recognition_site) > len(backbone_sequence):
|
|
440
|
+
site_seq = backbone_sequence[i:] + backbone_sequence[:i + len(recognition_site) - len(backbone_sequence)]
|
|
441
|
+
else:
|
|
442
|
+
if i + len(recognition_site) <= len(backbone_sequence):
|
|
443
|
+
site_seq = backbone_sequence[i:i + len(recognition_site)]
|
|
444
|
+
else:
|
|
445
|
+
continue
|
|
446
|
+
if site_seq == recognition_site:
|
|
447
|
+
restriction_sites.append({'position': i, 'strand': 'forward'})
|
|
448
|
+
rev_comp_site = reverse_complement(recognition_site)
|
|
449
|
+
if site_seq == rev_comp_site:
|
|
450
|
+
restriction_sites.append({'position': i, 'strand': 'reverse'})
|
|
451
|
+
if len(restriction_sites) < 2:
|
|
452
|
+
return {'success': False, 'message': f'Need at least 2 {enzyme_name} recognition sites in the backbone for Golden Gate assembly.'}
|
|
453
|
+
else:
|
|
454
|
+
cut_sites = []
|
|
455
|
+
for site in restriction_sites:
|
|
456
|
+
pos = site['position']
|
|
457
|
+
if site['strand'] == 'forward':
|
|
458
|
+
cut_fwd = (pos + len(recognition_site) + offset_fwd) % len(backbone_sequence)
|
|
459
|
+
cut_rev = (pos + len(recognition_site) + offset_rev) % len(backbone_sequence)
|
|
460
|
+
else:
|
|
461
|
+
cut_rev = (pos - offset_fwd) % len(backbone_sequence)
|
|
462
|
+
cut_fwd = (pos - offset_rev) % len(backbone_sequence)
|
|
463
|
+
if cut_rev < 0:
|
|
464
|
+
cut_rev += len(backbone_sequence)
|
|
465
|
+
if cut_fwd < 0:
|
|
466
|
+
cut_fwd += len(backbone_sequence)
|
|
467
|
+
if cut_fwd < cut_rev:
|
|
468
|
+
overhang = backbone_sequence[cut_fwd:cut_rev]
|
|
469
|
+
else:
|
|
470
|
+
overhang = backbone_sequence[cut_fwd:] + backbone_sequence[:cut_rev]
|
|
471
|
+
cut_sites.append({'site_position': pos, 'strand': site['strand'], 'cut_fwd': cut_fwd, 'cut_rev': cut_rev, 'overhang': overhang})
|
|
472
|
+
upstream_overhang = cut_sites[0]['overhang']
|
|
473
|
+
downstream_overhang = cut_sites[1]['overhang']
|
|
474
|
+
fw_oligo = upstream_overhang + insert_sequence
|
|
475
|
+
rev_oligo = reverse_complement(insert_sequence + downstream_overhang)
|
|
476
|
+
return {'success': True, 'overhangs': {'upstream': upstream_overhang, 'downstream': downstream_overhang}, 'oligos': {'forward': fw_oligo, 'reverse': rev_oligo, 'notes': [f'Forward oligo: Add {upstream_overhang} to 5\' end of your insert', f'Reverse oligo: Add {reverse_complement(downstream_overhang)} to 5\' end of reverse complement of your insert']}, 'cut_sites': [{'position': site['site_position'], 'overhang': site['overhang']} for site in cut_sites], 'assembly_notes': f'Found {len(restriction_sites)} {enzyme_name} sites. Using overhangs {upstream_overhang} and {downstream_overhang} for assembly.'}
|
|
477
|
+
def get_oligo_annealing_protocol() -> dict[str, Any]:
|
|
478
|
+
return {'title': 'Oligo Annealing Protocol', 'description': 'Standard protocol for annealing complementary oligonucleotides', 'steps': [{'step_number': 1, 'title': 'Prepare annealing reaction', 'description': 'Mix the following components in a PCR tube:', 'components': [{'name': 'Forward oligo (100 μM)', 'volume': '1 μl'}, {'name': 'Reverse oligo (100 μM)', 'volume': '1 μl'}, {'name': 'Nuclease-free water', 'volume': '8 μl'}], 'total_volume': '10 μl'}, {'step_number': 2, 'title': 'Anneal in thermocycler', 'description': 'Run the following program on a thermocycler:', 'program': [{'temperature': '95°C', 'time': '5 minutes', 'description': 'Initial denaturation'}, {'temperature': 'Ramp down to 25°C', 'rate': '5°C/minute', 'description': 'Slow cooling for proper annealing'}]}, {'step_number': 3, 'title': 'Dilute annealed oligos'
|
|
479
|
+
def get_golden_gate_protocol(num_inserts: int=1, enzyme_name: str=None, vector_length: int=None, vector_amount_ng: float=75.0, insert_lengths: list[int]=None, is_library_prep: bool=False) -> dict[str, Any]:
|
|
480
|
+
# irreducible cflow, using cdg fallback
|
|
481
|
+
supported_enzymes = ['BsaI', 'BsmBI', 'BbsI', 'Esp3I', 'BtgZI', 'SapI']
|
|
482
|
+
if enzyme_name not in supported_enzymes:
|
|
483
|
+
raise ValueError(f"Unsupported enzyme: {enzyme_name}. Currently supporting: {', '.join(supported_enzymes)}")
|
|
484
|
+
if num_inserts == 1:
|
|
485
|
+
if is_library_prep:
|
|
486
|
+
thermal_protocol = [{'temperature': '37°C', 'time': '1 hour', 'description': 'Cleavage and ligation'}]
|
|
487
|
+
else:
|
|
488
|
+
thermal_protocol = [{'temperature': '37°C', 'time': '5 minutes', 'description': 'Cleavage and ligation'}]
|
|
489
|
+
thermal_protocol.append({'temperature': '60°C', 'time': '5 minutes', 'description': 'Enzyme inactivation'})
|
|
490
|
+
if 2 <= num_inserts <= 10:
|
|
491
|
+
thermal_protocol = [{'temperature': 'Cycle (30x)', 'description': 'Cleavage and ligation cycles', 'cycles': [{'temperature': '37°C', 'time': '1 minute', 'description': 'Restriction digestion'}, {'temperature': '16°C', 'time': '1 minute', 'description': 'Ligation'}]}, {'temperature': '60°C', 'time': '5 minutes', 'description': 'Enzyme inactivation'}]
|
|
492
|
+
thermal_protocol = [{'temperature': 'Cycle (30x)', 'description': 'Cleavage and ligation cycles', 'cycles': [{'temperature': '37°C', 'time': '5 minutes', 'description': 'Restriction digestion'}, {'temperature': '16°C', 'time': '5 minutes', 'description': 'Ligation'}]}, {'temperature': '60°C', 'time': '5 minutes', 'description': 'Enzyme inactivation'}]
|
|
493
|
+
assembly_mix_volume = '2 μl' if num_inserts > 10 else '1 μl'
|
|
494
|
+
vector_pmol = vector_amount_ng / (vector_length * 650) * 1000000
|
|
495
|
+
insert_components = []
|
|
496
|
+
if insert_lengths:
|
|
497
|
+
for i, length in enumerate(insert_lengths):
|
|
498
|
+
insert_pmol = 2 * vector_pmol
|
|
499
|
+
insert_ng = insert_pmol * length * 650 / 1000000
|
|
500
|
+
insert_components.append({'name': f'Insert {i + 1} ({length} bp)', 'amount': f'{insert_ng:.1f} ng ({insert_pmol:.3f} pmol)', 'molar_ratio': '2:1 (insert:vector)'})
|
|
501
|
+
else:
|
|
502
|
+
insert_components = [{'name': 'Insert DNA (precloned or amplicon)', 'amount': 'Variable based on length and concentration', 'note': 'Use 2:1 molar ratio (insert:vector) for optimal assembly'}]
|
|
503
|
+
reaction_components = [{'name': f'Destination Vector ({vector_length} bp)', 'amount': f'{vector_amount_ng} ng ({vector_pmol:.3f} pmol)'}]
|
|
504
|
+
for component in insert_components:
|
|
505
|
+
reaction_components.append(component)
|
|
506
|
+
reaction_components.extend([{'name': 'T4 DNA Ligase Buffer (10X)', 'volume': '2 μl'}, {'name': f'NEB Golden Gate Assembly Mix ({enzyme_name})', 'volume': assembly_mix_volume}, {'name': 'Nuclease-free H₂O', 'volume': 'to 20 μl'}])
|
|
507
|
+
return {'title': f'Golden Gate Assembly Protocol ({enzyme_name})', 'description': f'Customized protocol for Golden Gate assembly with {enzyme_name} and {num_inserts} insert(s)', 'steps': [{'step_number': 1, 'title': 'Prepare assembly reaction', 'description': 'Mix the following components in a PCR tube:', 'components': reaction_components, 'total_volume': '20 μl'}, {'step_number': 2, 'title': 'Run assembly reaction', 'description': 'Run the following program on a thermocycler:', 'program': thermal_protocol}], 'notes': [f'Destination vector must possess {enzyme_name} restriction sites in the proper orientation', f'Inserts must possess {enzyme_name} restriction sites at both ends in the proper orientation', f'For amplicon inserts, add 5′ flanking bases (6 recommended) before the restriction sites', f'Vector amount: {vector_amount_ng} ng = {vector_pmol:.3f} pmol', 'Insert:vector molar ratio is 2:1 for optimal assembly efficiency']}
|
|
508
|
+
def perform_golden_gate_assembly(backbone_sequence: str, enzyme_name: str, fragments: list[dict[str, str]], is_circular: bool=True) -> dict[str, Any]:
|
|
509
|
+
TYPE_IIS_PROPERTIES = {'BsaI': {'recognition_site': 'GGTCTC', 'offset_fwd': 1, 'offset_rev': 5}, 'BsmBI': {'recognition_site': 'CGTCTC', 'offset_fwd': 1, 'offset_rev': 5}, 'BbsI': {'recognition_site': 'GAAGAC', 'offset_fwd': 2, 'offset_rev': 6}, 'Esp3I': {'recognition_site': 'CGTCTC', 'offset_fwd': 1, 'offset_rev': 5}, 'BtgZI': {'recognition_site': 'GCGATG', 'offset_fwd': 10, 'offset_rev': 14}, 'SapI': {'recognition_site': 'GCTCTTC', 'offset_fwd': 1, 'offset_rev': 4}}
|
|
510
|
+
if enzyme_name not in TYPE_IIS_PROPERTIES:
|
|
511
|
+
supported = ', '.join(TYPE_IIS_PROPERTIES.keys())
|
|
512
|
+
return {'success': False, 'message': f'Unsupported enzyme: {enzyme_name}. Currently supporting: {supported}', 'assembled_sequence': None}
|
|
513
|
+
else:
|
|
514
|
+
enzyme_props = TYPE_IIS_PROPERTIES[enzyme_name]
|
|
515
|
+
recognition_site = enzyme_props['recognition_site']
|
|
516
|
+
enzyme_props['offset_fwd']
|
|
517
|
+
offset_rev = enzyme_props['offset_rev']
|
|
518
|
+
def reverse_complement(seq):
|
|
519
|
+
complement = {'A': 'T', 'T': 'A', 'G': 'C', 'C': 'G'}
|
|
520
|
+
return ''.join((complement.get(base, 'N') for base in reversed(seq)))
|
|
521
|
+
backbone_sequence = backbone_sequence.upper()
|
|
522
|
+
processed_fragments = []
|
|
523
|
+
for idx, fragment in enumerate(fragments):
|
|
524
|
+
fragment_name = fragment.get('name', f'fragment_{idx + 1}')
|
|
525
|
+
if 'sequence' in fragment and (not ('fwd_oligo' in fragment and 'rev_oligo' in fragment)):
|
|
526
|
+
ds_sequence = fragment['sequence'].upper()
|
|
527
|
+
fwd_sites = []
|
|
528
|
+
rev_sites = []
|
|
529
|
+
rev_comp_site = reverse_complement(recognition_site)
|
|
530
|
+
for i in range(len(ds_sequence) - len(recognition_site) + 1):
|
|
531
|
+
site_seq = ds_sequence[i:i + len(recognition_site)]
|
|
532
|
+
if site_seq == recognition_site:
|
|
533
|
+
fwd_sites.append(i)
|
|
534
|
+
else:
|
|
535
|
+
if site_seq == rev_comp_site:
|
|
536
|
+
rev_sites.append(i)
|
|
537
|
+
if len(fwd_sites) == 0 or len(rev_sites) == 0:
|
|
538
|
+
return {'success': False, 'message': f'Fragment \'{fragment_name}\' must contain at least one {enzyme_name} site in each orientation', 'assembled_sequence': None}
|
|
539
|
+
else:
|
|
540
|
+
fwd_site = fwd_sites[0]
|
|
541
|
+
rev_site = rev_sites[(-1)]
|
|
542
|
+
fwd_cut = fwd_site + len(recognition_site) + offset_rev
|
|
543
|
+
rev_cut = rev_site - offset_rev
|
|
544
|
+
if fwd_cut >= rev_cut:
|
|
545
|
+
return {'success': False, 'message': f'Invalid restriction sites in fragment \'{fragment_name}\': sites must be oriented to excise the insert', 'assembled_sequence': None}
|
|
546
|
+
else:
|
|
547
|
+
insert_seq = ds_sequence[fwd_cut:rev_cut]
|
|
548
|
+
fwd_overhang = ds_sequence[fwd_cut - 4:fwd_cut]
|
|
549
|
+
rev_overhang_rc = ds_sequence[rev_cut:rev_cut + 4]
|
|
550
|
+
rev_overhang = reverse_complement(rev_overhang_rc)
|
|
551
|
+
fwd_oligo = fwd_overhang + insert_seq
|
|
552
|
+
rev_oligo = rev_overhang + reverse_complement(insert_seq)
|
|
553
|
+
processed_fragments.append({'name': fragment_name, 'fwd_oligo': fwd_oligo, 'rev_oligo': rev_oligo, 'original_sequence': ds_sequence})
|
|
554
|
+
else:
|
|
555
|
+
if 'fwd_oligo' in fragment and 'rev_oligo' in fragment:
|
|
556
|
+
processed_fragments.append({'name': fragment_name, 'fwd_oligo': fragment['fwd_oligo'], 'rev_oligo': fragment['rev_oligo']})
|
|
557
|
+
else:
|
|
558
|
+
return {'success': False, 'message': f'Fragment \'{fragment_name}\' must contain either \'sequence\' or both \'fwd_oligo\' and \'rev_oligo\'', 'assembled_sequence': None}
|
|
559
|
+
return {'success': True, 'assembled_sequence': 'PLACEHOLDER_ASSEMBLED_SEQUENCE', 'message': f'Successfully assembled {len(processed_fragments)} fragments', 'fragments_used': len(processed_fragments)}
|
|
560
|
+
def design_complete_gibson_assembly(plasmid_sequence: str, replace_region: tuple[int, int], fragments: list[dict[str, str]], is_circular: bool=True, overlap_length: int=20, primer_binding_length: int=20, min_gc: float=0.4, max_gc: float=0.6, min_tm_binding: float=55.0, max_tm_binding: float=65.0, min_tm_overlap: float=48.0, backbone_amount_ng: float=100.0) -> dict[str, Any]:
|
|
561
|
+
return {'backbone_enzyme_digestion': {'upstream_enzyme': {'enzyme': 'EcoRI', 'cut_site': 100}, 'downstream_enzyme': {'enzyme': 'BamHI', 'cut_site': 500}, 'linearized_backbone_length': 4500}, 'primer_design': {'fragment_primers': [], 'assembly_strategy': 'Gibson Assembly workflow', 'notes': ['Complete primer design information would be here']}, 'assembly_prediction': {'success': True, 'assembled_sequence_length': 5000, 'circular': is_circular}, 'experimental_protocol': {'backbone_digestion': {'instructions': 'Digest with restriction enzymes'}, 'pcr_amplification': {'instructions': 'Amplify fragments with designed primers'}, 'gibson_assembly': {'title': 'Gibson Assembly Protocol'}}, 'full_sequences': {'original_plasmid': plasmid_sequence, 'linearized_backbone': 'LINEARIZED_BACKBONE_PLACEHOLDER', 'assembled_construct': 'ASSEMBLED_CONSTRUCT_PLACEHOLDER'}}
|
|
562
|
+
def perform_gateway_lr_reaction(entry_plasmid: str, destination_plasmid: str, is_circular: bool=True) -> dict[str, Any]:
|
|
563
|
+
attL1 = 'GAAATAATGATTTTATTTTGACTGATAGTGACCTGTTCGTTGCAACAAATTGATAAGCAATGCTTTTTTATAATGCCAACTTTGTACAAAAAAGTTGGCA'
|
|
564
|
+
attL2 = 'AATCAACTTTCTTGTACAAAGTTGGCATTATAGGAAAGCATTGCTTATCAATTTGTTGCAACGAACAGGTCACTATCAGTCAAAATAAAATCATTATTTG'
|
|
565
|
+
attR1 = 'ACAAGTTTGTACAAAAAAGCTGAACGAGAAACGTAAAATGATATAAATATCAATATATTAAATTAGATTTTGCATAAAAAACAGACTACATAATACTGTAAAACACAACATATCCAGTCACTATG'
|
|
566
|
+
attR2 = 'CATAGTGACTGGATATGTTGTGTTTTACAGTATTATGTAGTCTGTTTTTTATGCAAAATCTAATTTAATATATTGATATTTATATCATTTTACGTTTCTCGTTCAGCTTTCTTGTACAAAGTGGT'
|
|
567
|
+
attB1 = 'acaagtttgtacaaaaaagcaggct'
|
|
568
|
+
attB2 = 'acccagctttcttgtacaaagtggt'
|
|
569
|
+
attL1_pos = entry_plasmid.find(attL1)
|
|
570
|
+
attL2_pos = entry_plasmid.find(attL2)
|
|
571
|
+
if attL1_pos == (-1) or attL2_pos == (-1):
|
|
572
|
+
return {'success': False, 'message': 'Could not find attL1 and/or attL2 sites in the entry plasmid', 'assembled_sequence': None}
|
|
573
|
+
else:
|
|
574
|
+
if attL1_pos < attL2_pos:
|
|
575
|
+
insert = entry_plasmid[attL1_pos + len(attL1):attL2_pos]
|
|
576
|
+
else:
|
|
577
|
+
if is_circular:
|
|
578
|
+
insert = entry_plasmid[attL1_pos + len(attL1):] + entry_plasmid[:attL2_pos]
|
|
579
|
+
else:
|
|
580
|
+
return {'success': False, 'message': 'attL1 must come before attL2 in linear plasmids', 'assembled_sequence': None}
|
|
581
|
+
attR1_pos = destination_plasmid.find(attR1)
|
|
582
|
+
attR2_pos = destination_plasmid.find(attR2)
|
|
583
|
+
if attR1_pos == (-1) or attR2_pos == (-1):
|
|
584
|
+
return {'success': False, 'message': 'Could not find attR1 and/or attR2 sites in the destination plasmid', 'assembled_sequence': None}
|
|
585
|
+
else:
|
|
586
|
+
if attR1_pos < attR2_pos:
|
|
587
|
+
assembled_plasmid = destination_plasmid[:attR1_pos] + attB1 + insert + attB2 + destination_plasmid[attR2_pos + len(attR2):]
|
|
588
|
+
else:
|
|
589
|
+
if is_circular:
|
|
590
|
+
assembled_plasmid = attB1 + insert + attB2 + destination_plasmid[attR2_pos + len(attR2):attR1_pos]
|
|
591
|
+
else:
|
|
592
|
+
return {'success': False, 'message': 'attR1 must come before attR2 in linear plasmids', 'assembled_sequence': None}
|
|
593
|
+
return {'success': True, 'message': 'Gateway cloning reaction successful', 'assembled_sequence': assembled_plasmid, 'insert_length': len(insert), 'final_length': len(assembled_plasmid), 'insert': insert, 'entry_plasmid_sites': {'attL1_position': attL1_pos, 'attL2_position': attL2_pos}, 'destination_plasmid_sites': {'attR1_position': attR1_pos, 'attR2_position': attR2_pos}}
|
|
594
|
+
def get_gateway_lr_protocol(entry_clone_concentration: float=None, entry_clone_amount_ng: float=100.0, destination_vector_concentration: float=150.0, include_calculations: bool=True) -> dict[str, Any]:
|
|
595
|
+
protocol = {'name': 'Gateway LR Cloning Protocol', 'description': 'Protocol for transferring a gene from a Gateway entry clone to a destination vector using LR Clonase II enzyme mix.', 'duration': '1 hour 15 minutes', 'materials': ['Entry clone (50-150 ng)', 'Destination vector (150 ng/µl)', 'LR Clonase II enzyme mix (stored at -20°C or -80°C)', 'Proteinase K solution', 'TE buffer, pH 8.0', '1.5 ml microcentrifuge tubes', 'Vortex mixer', 'Microcentrifuge', 'Incubator or heat block (25°C and 37°C)'], 'steps': [{'name': 'Prepare reaction mixture', 'description': 'Add the following components to a 1.5 ml tube at room temperature and mix:', 'substeps': ['Entry clone (50-150 ng): 1-7 µl', 'Destination vector (150 ng/µl): 1 µl', 'TE buffer, pH 8.0: to a final volume of 8 µl']}, {'name': 'Add LR Clonase II enzyme mix', 'description': 'Thaw LR Clonase II enzyme mix on ice for about 2 minutes. Vortex briefly twice (2 seconds each time).', 'substeps': ['Add 2 µl of LR Clonase II enzyme mix to each reaction', 'Mix well by vortexing briefly twice', 'Microcentrifuge briefly', 'Return LR Clonase II enzyme mix to -20°C or -80°C storage']}, {'name': 'Incubate reaction', 'description': 'Incubate reactions at 25°C for 1 hour.'}, {'name': 'Terminate reaction', 'description': 'Add 1 µl of the Proteinase K solution to each sample to terminate the reaction.', 'substeps': ['Vortex briefly', 'Incubate samples at 37°C for 10 minutes']}, {'name': 'Proceed to transformation',
|
|
596
|
+
if include_calculations and entry_clone_concentration is not None:
|
|
597
|
+
entry_clone_volume = entry_clone_amount_ng / entry_clone_concentration
|
|
598
|
+
te_buffer_volume = 8 - entry_clone_volume - 1
|
|
599
|
+
if entry_clone_volume < 1 or entry_clone_volume > 7:
|
|
600
|
+
warning = f'Warning: Calculated entry clone volume ({entry_clone_volume:.2f} µl) is outside the recommended range (1-7 µl).'
|
|
601
|
+
if 'warnings' not in protocol:
|
|
602
|
+
protocol['warnings'] = []
|
|
603
|
+
protocol['warnings'].append(warning)
|
|
604
|
+
if te_buffer_volume < 0:
|
|
605
|
+
warning = 'Warning: Calculated TE buffer volume is negative. Reduce entry clone volume.'
|
|
606
|
+
if 'warnings' not in protocol:
|
|
607
|
+
protocol['warnings'] = []
|
|
608
|
+
protocol['warnings'].append(warning)
|
|
609
|
+
protocol['calculations'] = {'entry_clone_concentration': f'{entry_clone_concentration} ng/µl', 'entry_clone_amount': f'{entry_clone_amount_ng} ng', 'entry_clone_volume': f'{entry_clone_volume:.2f} µl', 'destination_vector_volume': '1 µl', 'te_buffer_volume': f'{max(0, te_buffer_volume):.2f} µl', 'total_reaction_volume_before_enzyme': '8 µl', 'lr_clonase_volume': '2 µl', 'total_reaction_volume': '10 µl', 'proteinase_k_volume': '1 µl', 'final_volume': '11 µl'}
|
|
610
|
+
return protocol
|
|
611
|
+
def compare_knockout_cas_systems() -> dict:
|
|
612
|
+
comparison_table = {'SpCas9': {'pam': 'NGG (12.5% genome)', 'size': '160 kDa', 'knockout_efficiency': 'High', 'specificity': 'Moderate', 'pros': ['Most characterized, extensive protocols', 'High activity, good multiplexing', 'Large tool ecosystem, low cost'], 'cons': ['Limited PAM flexibility', 'Too large for single AAV', 'Moderate off-target risk'], 'best_for': 'Basic research, cell lines, general knockouts'}, 'SaCas9': {'pam': 'NNGRRT (2.5% genome)', 'size': '123 kDa', 'knockout_efficiency': 'Moderate-High', 'specificity': 'High', 'pros': ['Fits in single AAV vector', 'Low immunogenicity, high specificity', 'Good for in vivo applications'], 'cons': ['Limited PAM sites', 'Lower activity than SpCas9', 'Fewer available tools'], 'best_for': 'Gene therapy, in vivo editing, therapeutics'}, 'AsCas12a': {'pam': 'TTTV (6.25% genome)', 'size': '151 kDa', 'knockout_efficiency': 'Moderate', 'specificity': 'High', 'pros'
|
|
613
|
+
return {'systems': comparison_table}
|
|
614
|
+
def compare_delivery_methods() -> dict:
|
|
615
|
+
Requires BSL-2+ facilities = {'High transduction efficiency': {'method_type': 'Viral Vector', 'efficiency': 'High', 'cell_type_compatibility': 'Primary cells, neurons, hepatocytes, muscle', 'cargo_capacity': 'Limited (~4.7 kb total)', 'advantages': ['High transduction efficiency in vivo', 'Low immunogenicity and toxicity', 'Tissue-specific targeting possible', 'Long-term expression capability'], 'disadvantages': ['Limited packaging capacity', 'Requires split-vector for large Cas proteins', 'Pre-existing immunity in some patients', 'Complex manufacturing and regulatory requirements'], 'best_for': 'In vivo gene therapy, primary cells, neurons', 'cas_compatibility': 'Requires split vector', 'cost': 'Single vector compatible', 'timeline': 'Requires split vector'}, 'Integrates into genome for stable expression': {'method_type': 'Viral Vector', 'efficiency': 'Very High', 'cell_type_compatibility': 'Most cell types, including non-dividing', 'cargo_capacity': 'Large (~8-10 kb)', 'advantages': ['High transduction efficiency', 'Integrates into genome for stable expression', 'Works in dividing and non-dividing cells', 'Large cargo capacity'], 'disadvantages': 'Insertional mutagenesis risk', 'best_for': 'Requires BSL-2+ facilities', 'cas_compatibility': 'Potential immune responses', 'cost': 'Permanent genomic integration'
|
|
616
|
+
selection_criteria = {'cell_line_work': 'Lipofection or Electroporation', 'primary_cells': 'Electroporation or AAV', 'in_vivo_therapy': 'AAV or Lentiviral', 'embryo_editing': 'Microinjection', 'liver_targeting': 'Hydrodynamic injection or AAV', 'immune_cells': 'Electroporation', 'neurons': 'AAV or Lentiviral', 'high_throughput': 'Lipofection or Electroporation', 'stable_expression': 'Lentiviral', 'transient_editing': 'Electroporation (RNP)'}
|
|
617
|
+
return {'delivery_methods': delivery_methods, 'selection_guide': selection_criteria}
|
|
618
|
+
def assemble_overlapping_oligos(seq1: str, seq2: str) -> dict:
|
|
619
|
+
def create_fragment(sequence: str, forward_overhang: str, reverse_overhang: str) -> dict:
|
|
620
|
+
return {'explanation': 'Output fields:\n- sequence: Main body sequence of the assembled oligo\n * Excludes overhang regions\n * Oriented 5\' to 3\'\n- forward_overhang: 5\' overhang sequence\n * Single-stranded region at 5\' end\n- reverse_overhang: 3\' overhang sequence\n * Single-stranded region at 3\' end', 'sequence': sequence, 'forward_overhang': forward_overhang, 'reverse_overhang': reverse_overhang}
|
|
621
|
+
def detect_overhang(seq1: str, seq2: str) -> tuple[bool, int, str, str]:
|
|
622
|
+
seq2_rc = str(Seq(seq2).reverse_complement())
|
|
623
|
+
max_overlap = 0
|
|
624
|
+
overhang_len = 0
|
|
625
|
+
is_5_overhang = True
|
|
626
|
+
main_seq = seq1
|
|
627
|
+
comp_seq = seq2
|
|
628
|
+
for i in range(min(len(seq1), len(seq2))):
|
|
629
|
+
if seq1[-i:] == seq2_rc[:i] and i > max_overlap:
|
|
630
|
+
max_overlap = i
|
|
631
|
+
overhang_len = len(seq1) - i
|
|
632
|
+
is_5_overhang = True
|
|
633
|
+
main_seq = seq1
|
|
634
|
+
comp_seq = seq2
|
|
635
|
+
for i in range(min(len(seq1), len(seq2))):
|
|
636
|
+
if seq1[:i] == seq2_rc[-i:] and i > max_overlap:
|
|
637
|
+
max_overlap = i
|
|
638
|
+
overhang_len = len(seq1) - i
|
|
639
|
+
is_5_overhang = False
|
|
640
|
+
main_seq = seq1
|
|
641
|
+
comp_seq = seq2
|
|
642
|
+
seq1_rc = str(Seq(seq1).reverse_complement())
|
|
643
|
+
for i in range(min(len(seq1), len(seq2))):
|
|
644
|
+
if seq2[-i:] == seq1_rc[:i] and i > max_overlap:
|
|
645
|
+
max_overlap = i
|
|
646
|
+
overhang_len = len(seq2) - i
|
|
647
|
+
is_5_overhang = True
|
|
648
|
+
main_seq = seq2_rc
|
|
649
|
+
comp_seq = seq1
|
|
650
|
+
for i in range(min(len(seq1), len(seq2))):
|
|
651
|
+
if seq2[:i] == seq1_rc[-i:] and i > max_overlap:
|
|
652
|
+
max_overlap = i
|
|
653
|
+
overhang_len = len(seq2) - i
|
|
654
|
+
is_5_overhang = False
|
|
655
|
+
main_seq = seq2_rc
|
|
656
|
+
comp_seq = seq1
|
|
657
|
+
return (is_5_overhang, overhang_len, main_seq, comp_seq)
|
|
658
|
+
seq1 = seq1.upper()
|
|
659
|
+
seq2 = seq2.upper()
|
|
660
|
+
is_5_overhang, overhang_len, main_seq, comp_seq = detect_overhang(seq1, seq2)
|
|
661
|
+
if is_5_overhang:
|
|
662
|
+
forward_overhang = main_seq[:overhang_len]
|
|
663
|
+
reverse_overhang = str(Seq(comp_seq[:overhang_len]).reverse_complement())
|
|
664
|
+
main_seq = main_seq[overhang_len:]
|
|
665
|
+
else:
|
|
666
|
+
forward_overhang = main_seq[-overhang_len:]
|
|
667
|
+
reverse_overhang = str(Seq(comp_seq[-overhang_len:]).reverse_complement())
|
|
668
|
+
main_seq = main_seq[:-overhang_len]
|
|
669
|
+
return create_fragment(main_seq, forward_overhang, reverse_overhang)
|
|
670
|
+
def get_transformation_protocol(antibiotic: str='ampicillin', is_repetitive: bool=False, is_library_transformation: bool=False) -> dict[str, Any]:
|
|
671
|
+
incubation_temp = '30°C' if is_repetitive else '37°C'
|
|
672
|
+
if is_library_transformation:
|
|
673
|
+
protocol = {'title': 'Library Transformation Protocol (Electroporation)', 'description': 'Specialized protocol for transforming DNA libraries into Stbl4 competent cells', 'steps': [{'step_number': 1, 'title': 'Prepare DNA', 'description': 'Add DNA to microcentrifuge tubes:', 'substeps': ['A. For control: Add 1 μl of pUC19 control DNA to a microcentrifuge tube.', 'B. For library DNA: Precipitate DNA with ethanol, wash with 70% ethanol, and resuspend in TE Buffer (10 mM Tris HCl, pH 7.5; 1 mM EDTA). Keep concentration below 100 ng/μl. Add 1 μl to a microcentrifuge tube.']}, {'step_number': 2, 'title': 'Thaw cells', 'description': 'Thaw ElectroMAX™ Stbl4™ cells on wet ice.'}, {'step_number': 3, 'title': 'Mix cells with DNA', 'description': 'When cells are thawed, mix by tapping gently. Add 20 μl of cells to each chilled microcentrifuge tube containing DNA.'}, {'step_number': 4, 'title': 'Refreeze unused cells', 'description': 'Refreeze any unused cells in a dry ice/ethanol bath for 5 minutes before returning to -80°C freezer. Do not use liquid nitrogen.'}, {'step_number': 5, 'title': 'Electroporation', 'description': 'Pipette the cell/DNA mixture into a chilled 0.1 cm cuvette and electroporate.', 'parameters': 'If using BTX™ ECM™ 630 or BioRad GenePulser™ II electroporator: 1.2 kV, 25 μF, 200 Ω'}, {'step_number': 9, 'title': 'Plate control transformation', 'description': 'Spread 25 μl of the diluted control on prewarmed LB plates containing 100 μg/ml ampicillin, 50 μg/ml X-gal, and 1 mM IPTG. Incubate overnight at 37°C.'}, {'step_number': 10, 'title': 'Plate library transformation', '
|
|
674
|
+
else:
|
|
675
|
+
protocol = {'title': 'Bacterial Transformation Protocol', 'description': 'Standard protocol for transforming DNA into competent E. coli cells', 'steps': [{'step_number': 1, 'title': 'Add DNA to competent cells', 'description': 'Add 5 μl of DNA to 50 μl of competent E. coli cells', 'note': 'Keep cells on ice during this step and handle gently'}, {'step_number': 2, 'title': 'Ice incubation', 'description': 'Incubate on ice for 30 minutes', 'note': 'This allows DNA to associate with the cell membrane'}, {'step_number': 3, 'title': 'Heat shock', 'description': 'Heat shock at 42°C for 45 seconds', 'note': 'Precise timing is critical'}, {'step_number': 4, 'title': 'Recovery on ice', 'description': f'{incubation_temp} for 1 hour with shaking (200-250 rpm)', 'note': 'This allows expression of antibiotic resistance genes'}, {'step_number': 8, 'title': 'Incubate plates', 'description': f'Incubate overnight (16-18 hours) at {incubation_temp}', 'note': 'Invert plates to prevent condensation from dripping onto colonies'}], 'notes': ['Always include positive and negative controls for transformation', 'is_repetitive',
|
|
676
|
+
return protocol
|
|
677
|
+
def get_transfection_protocol(method: str) -> dict[str, Any]:
|
|
678
|
+
protocols = {'lipofectamine': {'title': 'Lipofectamine Transfection Protocol', 'description': 'Standard protocol for transfecting plasmids using Lipofectamine 2000/3000', 'steps': [{'step_number': 1, 'title': 'Cell preparation', 'description': 'Seed cells 24 hours before transfection to reach 70-90% confluency. Change to antibiotic-free medium 1-2 hours before transfection.'}, {'step_number': 2, 'title': 'Prepare DNA solution', 'description': 'Dilute 0.5-2 μg plasmid DNA in 50 μL Opti-MEM per well (24-well format). For Lipofectamine 3000, add 2 μL P3000 reagent per μg DNA.'}, {'step_number': 3, 'title': 'Prepare Lipofectamine solution', 'description': 'Dilute 1-3 μL Lipofectamine in 50 μL Opti-MEM per well. Incubate both solutions for 5 minutes at room temperature.'}, {'step_number': 4, 'title': 'Form complexes', 'description': 'Combine DNA and Lipofectamine solutions. Mix gently and incubate for 10-15 minutes at room temperature.'}, {'step_number': 3, 'title': 'Transfect cells', 'description': 'Add 100 μL DNA-Lipofectamine complex dropwise to cells. Gently rock plate to distribute evenly.'}, {'step_number': 4, 'title': 'Form complexes', 'description': 'Add PEI solution to DNA solution dropwise. Vortex immediately for 10 seconds. Incubate for 10-15 minutes at room temperature.'}, {'step_number': 3, 'title': 'Add phosphate buffer', 'description': 'Add 250 μL of 2× HBS buffer (pH 7.05) dropwise while vortexing. Continue vortexing for 10 seconds.'}, {'step_number': 6, '
|
|
679
|
+
return protocols.get(method, {})
|
|
680
|
+
def get_lentivirus_production_protocol() -> dict[str, Any]:
|
|
681
|
+
return {'title': 'Lentivirus Production Protocol', 'description': 'Standard protocol for producing lentiviral particles using HEK293T cells', 'steps': [{'step_number': 1, 'title': 'Cell preparation', 'description': 'Seed HEK293T cells in 10 cm dishes to reach 70-80% confluency by transfection day. Use 8-10 million cells per dish. Change to fresh medium 2-4 hours before transfection.'}, {'step_number': 2, 'title': 'Prepare transfection mix', 'description': 'For each 10 cm dish, mix: 10 μg transfer plasmid, 7.5 μg psPAX2 (packaging), 2.5 μg pMD2.G (envelope), 1 mL Opti-MEM. Add 60 μL Lipofectamine 2000 in 1 mL Opti-MEM separately.'}, {'step_number': 3, 'title': 'Form transfection complexes', 'description': 'Combine DNA and Lipofectamine solutions. Mix gently and incubate for 15 minutes at room temperature.'}, {'step_number': 4, 'title': 'Transfect producer cells', 'description': 'Add 2 mL transfection complex dropwise to cells. Gently rock dish to distribute. Incubate at 37°C, 5% CO₂.'}, {'step_number': 5, 'title': 'Medium change', 'description': 'Replace with 10 mL fresh DMEM + 10% FBS after 6-8 hours. Continue incubation.'}, {'step_number': 6, 'title': 'Harvest viral supernatant', 'description': 'Collect supernatant at 48 and 72 hours post-transfection. Pool harvests. Filter through 0.45 μm filter to remove cells and debris.'}, {'step_number': 7, 'title': 'Concentrate virus (optional)', 'description': 'Concentrate by ultracentrifugation (25,000 rpm, 2 hours, 4°C) or PEG precipitation. Resuspend pellet in 1/10 original volume.'}, {'step_number': 8, 'title': 'Store or use immediately',
|
|
682
|
+
def get_facs_sorting_protocol() -> dict[str, Any]:
|
|
683
|
+
return {'title': 'FACS Sorting Protocol', 'description': 'Standard protocol for fluorescence-activated cell sorting', 'steps': [{'step_number': 1, 'title': 'Cell preparation', 'description': 'Harvest cells and resuspend in FACS buffer (PBS + 2% FBS + 1 mM EDTA). Filter through 40 μm cell strainer to remove clumps. Count cells and adjust to 1-5 × 10⁶ cells/mL.'}, {'step_number': 2, 'title': 'Antibody staining', 'description': 'Add antibodies at optimized concentrations (typically 1:100-1:1000 dilution). Incubate for 30 minutes at 4°C in the dark. Include unstained and single-color controls.'}, {'step_number': 3, 'title': 'Wash cells', 'description': 'Wash cells 2x with FACS buffer. Centrifuge at 300g for 5 minutes. Resuspend in 500 μL FACS buffer per 1 × 10⁶ cells.'}, {'step_number': 4, 'title': 'Add viability dye', 'description': 'Add propidium iodide (1 μg/mL) or 7-AAD (5 μg/mL) just before sorting to exclude dead cells. Do not wash after adding viability dye.'}, {'step_number': 5, 'title': 'Set up sorter', 'description': 'Set up FACS machine with appropriate laser settings. Use controls to set gates and compensation. Set collection tubes with appropriate medium.'}, {'step_number': 6, 'title': 'Sort cells', 'description': 'Run sample at low pressure (20-25 psi) for cell viability. Sort desired populations into collection tubes containing culture medium or buffer.'}, {'step_number': 7, 'title': 'Post-sort analysis', 'description': 'Check purity by reanalyzing a small aliquot of sorted cells. Count cells and assess viability. Use sorted cells immediately or culture as needed.'}], 'notes': ['Keep cells on ice throughout procedure', 'Use sterile technique if cells will be cultured post-sort',
|
|
684
|
+
def get_gene_editing_amplicon_pcr_protocol(analysis_type: str) -> dict[str, Any]:
|
|
685
|
+
protocols = {'sanger': {'title': 'Gene Editing Amplicon PCR for Sanger Sequencing', 'description': 'PCR amplification of edited genomic regions for Sanger sequencing analysis', 'steps': [{'step_number': 1, 'title': 'Design primers', 'description': 'Design primers 200-300 bp upstream and downstream of target site. Primer length: 18-25 bp, Tm: 58-62°C, GC content: 40-60%. Expected amplicon size: 400-800 bp.'}, {'step_number': 2, 'title': 'Extract genomic DNA', 'description': 'Extract DNA from edited cells using standard genomic DNA extraction kit. Quantify DNA concentration using NanoDrop or Qubit.'}, {'step_number': 3, 'title': 'Set up PCR reaction', 'description': '50 μL reaction: 25 μL 2× PCR master mix, 2.5 μL forward primer (10 μM), 2.5 μL reverse primer (10 μM), 2 μL genomic DNA (50-100 ng), 18 μL nuclease-free water.'}, {'step_number': 4, 'title': 'Run PCR program', 'description': '95°C 3 min; 35 cycles of (95°C 30 sec, 60°C 30 sec, 72°C 30 sec); 72°C 5 min; hold at 4°C.'}, {'step_number': 3, 'title': 'First PCR (gene-specific)', 'description': '25 μL reaction: 12.5 μL 2× PCR master mix, 1.25 μL each primer (10 μM), 2.5 μL gDNA template, 7.5 μL water. Use unique primer pairs for multiplexing.'}, {'step_number': 6, 'title': 'Second PCR (indexing)', 'description': '25 μL reaction: 12.5 μL 2× PCR master mix, 2.5 μL each index primer, 2.5 μL cleaned first PCR product, 5 μL water.'}, {'step_number': 7, 'title': 'Run indexing PCR', 'description': '95°C 3 min; 8 cycles of (95°C 30 sec, 55°C 30 sec, 72°C 30 sec); 72°C 5 min; hold at 4°C.'}], 'notes': ['Use unique index combinations for each sample',
|
|
686
|
+
return protocols.get(analysis_type, {})
|
|
687
|
+
def get_western_blot_protocol() -> dict[str, Any]:
|
|
688
|
+
return {'title': 'Western Blot Validation Protocol', 'description': 'Standard protocol for protein detection and validation by Western blotting', 'steps': [{'step_number': 1, 'title': 'Prepare protein lysates', 'description': 'Lyse cells in RIPA buffer + protease inhibitors. Incubate on ice for 30 minutes with occasional vortexing. Centrifuge at 14,000g for 15 minutes at 4°C.'}, {'step_number': 2, 'title': 'Quantify protein', 'description': 'Determine protein concentration using BCA or Bradford assay. Adjust samples to equal protein concentrations (1-2 μg/μL).'}, {'step_number': 3, 'title': 'Prepare samples', 'description': 'Mix samples with 4× Laemmli buffer (final 1×). Heat at 95°C for 5 minutes. Load 20-40 μg total protein per lane.'}, {'step_number': 4, 'title': 'Run SDS-PAGE', 'description': 'Load samples on appropriate percentage polyacrylamide gel (8-12% for most proteins). Run at 80V through stacking gel, then 120V through resolving gel.'}, {'step_number': 5, 'title': 'Transfer to membrane', 'description': 'Transfer proteins to PVDF or nitrocellulose membrane. Use wet transfer: 100V for 1 hour at 4°C, or semi-dry transfer: 25V for 30 minutes.'}, {'step_number': 6, 'title': 'Block membrane', 'description': 'Block membrane with 5% non-fat milk or 5% BSA in TBST for 1 hour at room temperature with gentle agitation.'}, {'step_number': 9, 'title': 'Detection', 'description': 'Wash 3× with TBST. Apply ECL substrate and detect using chemiluminescence imaging system. Optimize exposure times for best signal.'}, {'step_number': 10, 'title': 'Loading control',
|