---
title: AAV outputs and interpretation
description: Published tropism reports per serotype — tissue, level, model, citation — in alphabetical order with no score, plus the aav_packaging_feasible go/no-go.
tags:
  - aav
  - outputs
---

Capsid selection returns published observations, not a verdict: per serotype, which tissues a cited study reports, the level that study reports, the species it was observed in, and the citation. Transgene optimization does return a verdict — `aav_packaging_feasible`, whether the optimized construct fits the packaging limit.

So the two results are read differently. The transgene result you can act on directly. The capsid result you have to read, because nothing in it ranks anything for you.

> **There is no composite score, and that is deliberate**

> An earlier version of this tool returned a `composite_score` that sorted serotypes by `0.70 * tissue_tropism_score + 0.30 * (1 - immune_prevalence)`. It was removed because the inputs were not real: the tropism numbers were hand-entered without sources, three of the nine seroprevalence figures were invented outright, and a caller's `serotype_preference` silently added to that serotype's score — a preference nudging its own answer. If you are carrying a `composite_score`, `tissue_tropism_score` or `ranked_capsids` from an older run or an older version of this page, it is not a measurement and nothing reproduces it.

## Capsid selection result

Under the result key `literature_serotype_lookup`. Serotypes come back in alphabetical order; the ordering carries no meaning.

| Field | Type | What it tells you |
|---|---|---|
| `method` | string | Always `literature_serotype_lookup`. |
| `query` | object | What was asked: the normalised `target_tissue`, `target_tissue_recognized`, and the `requested_serotype`. |
| `serotypes` | list | One record per serotype in the reference table (see below). |
| `n_serotypes` | int | How many records were returned. |
| `tissues_with_reports` | string[] | Every tissue any source in the table reports. |
| `packaging_limit_kb` | float | The ~4.7 kb limit applied. |
| `packaging_citation` | string | The source for that limit. |
| `payload_within_packaging_limit` | bool \| null | Whether your `max_payload_kb` fits. `null` when you sent no payload. |
| `disclaimer` | string | The result's own statement of what it is not. |
| `reports_for_tissue` | object \| null | The reports narrowed to the tissue you asked about. |
| `requested_serotype_record` | object \| null | The full record for your `serotype_preference`, when you set one. |

### Per-serotype record

| Field | Type | What it tells you |
|---|---|---|
| `serotype` | string | The serotype. |
| `reported_tropism` | list | One entry per reported observation (see below). |
| `tissues_reported` | string[] | The tissues this serotype has any report for. |
| `seroprevalence` | object \| null | Reported anti-AAV total IgG prevalence, the population, and the citation. **`null` when no study is cited** — not zero. |
| `seroprevalence_note` | string \| null | A qualification on that figure. |
| `packaging_limit_kb` | float | Packaging capacity. |
| `packaging_citation` | string | Its source. |
| `caveats` | string[] | Recorded limitations for this serotype. Read them. |
| `payload_kb` | float \| null | The payload you asked to check. |
| `payload_within_packaging_limit` | bool \| null | Whether it fits this serotype. |

### Each reported observation

Every entry in `reported_tropism`:

| Field | Type | What it tells you |
|---|---|---|
| `tissue` | string | The tissue the source reports. |
| `reported_level` | string | The level that source reports: `high`, `moderate` or `low`. A published qualitative call, not a computed number. |
| `model` | string | The species or system it was observed in, e.g. `human`, `mouse`, `c57bl6_mouse_only`. |
| `citation` | string | The source. |

## Reading the capsid result honestly

Three properties of this result change how you should use it:

- **Absence is missing evidence, not a low score.** A tissue no source reports is simply absent from `reported_tropism`. It does not appear with a zero, so you cannot infer that the serotype fails there.
- **`model` is load-bearing.** A `high` reported in `c57bl6_mouse_only` is not a claim about humans. Check the model on every entry you rely on before carrying it across species.
- **A missing `seroprevalence` is not a low one.** `null` means no study is cited for that serotype.

## Transgene optimization result

| Field | Type | What it tells you |
|---|---|---|
| `optimized_sequence` | string | The codon-optimized DNA sequence. |
| `length_bp` | int | Length in base pairs. |
| `length_kb` | float | Length in kilobases. |
| `gc_content` | float | GC fraction. |
| `aav_packaging_feasible` | bool \| null | Whether `length_kb` fits `max_payload_kb` — the go/no-go. |
| `max_payload_kb` | float \| null | The packaging limit applied. |
| `protein_length_aa` | int | Input protein length in amino acids. |
| `all_constraints_pass` | bool | Whether every optimization constraint was satisfied. |
| `codon_optimization_score` | float | Objective score from the optimizer. |
| `species` | string | Codon table used — always `h_sapiens`. |
| `restriction_sites_avoided` | string[] | Restriction sites removed during optimization. |

## What to do next

- Read `caveats` and the `model` on each `reported_tropism` entry before shortlisting a serotype. The result will not shortlist for you.
- Check `query.target_tissue_recognized`. A `false` means no source in the table reports your tissue at all, so an empty `reports_for_tissue` says nothing about any serotype.
- An `aav_packaging_feasible: false` means shortening the transgene or choosing a higher-capacity serotype. Codon optimization does not materially change `length_kb`, so trimming the input sequence is what brings it under the limit.
- Promoter, polyA and regulatory-element choices are still yours — this tool optimizes the coding sequence only.

## Read next
