cobertura_bruta =FileAttachment("data/cobertura.csv").csv({typed:true})adocoes =FileAttachment("data/adocoes.csv").csv({typed:true})status =FileAttachment("data/status.json").json()REPO ="{{< meta website.repo-url >}}"ROTULO_GRUPO =newMap([ ["anfibios","Anfíbios"], ["repteis","Répteis"], ["aves","Aves"], ["mamiferos","Mamíferos"]])OPCOES_GRUPO = ["Todos",...ROTULO_GRUPO.values()]GRUPO_POR_ROTULO =newMap([...ROTULO_GRUPO].map(([k, v]) => [v, k]))// Cores de situação (paleta de status: bom / atenção / crítico) e de grupo.SITUACOES = ["com DNA","a verificar","sem DNA"]COR_SITUACAO = ["#0ca30c","#fab219","#d03b3b"]COR_GRUPO = ["#2a78d6","#eb6834","#1baf7a","#eda100"]AMEACADAS =newSet(["CR","EN","VU"])cobertura = {const adot =newMap(adocoes.map(a => [a.especie, a]));return cobertura_bruta.map(d => {const a = adot.get(d.especie);const ufs = d.ufs?String(d.ufs).split(";") : [];const cat = d.categoria_ameaca??"";return {...d,grupo_rotulo: ROTULO_GRUPO.get(d.grupo),ufs_lista: ufs,endemica: d.endemica_br===true|| d.endemica_br==="TRUE",ameacada: AMEACADAS.has(cat),adocao: a ? a.situacao:null,adotada_por: a ? a.instituicao:null,// prioridade: ameaçada > DD > endêmica > descrita há mais tempoprioridade: (AMEACADAS.has(cat) ?0: cat ==="DD"?1:2) *10+ (d.endemica_br===true|| d.endemica_br==="TRUE"?0:1) }; });}filtra_grupo = (dados, rotulo) => rotulo ==="Todos"? dados : dados.filter(d => d.grupo=== GRUPO_POR_ROTULO.get(rotulo))fmt = d3.format(",d")fmtpct = d3.format(".0%")fmtn = n => n ==null?"":fmt(n).replace(/,/g,".")conta = dados => {const c = d3.rollup(dados, v => v.length, d => d.situacao);return {total: dados.length,com: c.get("com DNA") ??0,verificar: c.get("a verificar") ??0,sem: c.get("sem DNA") ??0 };}link_adote = especie =>`${REPO}/issues/new?template=adote.yml&title=${encodeURIComponent("Adoção: "+ especie)}&especie=${encodeURIComponent(especie)}`selo_situacao = s => {const cls = s ==="com DNA"?"com": s ==="sem DNA"?"sem":"verificar";const ico = s ==="com DNA"?"✓": s ==="sem DNA"?"✕":"?";return htl.html`<span class="situacao ${cls}">${ico}${s}</span>`;}
A pergunta
Para cada espécie de tetrápode do Brasil (anfíbios, répteis, aves e mamíferos) nas listas oficiais das sociedades científicas: quantas sequências de DNA públicas existem no BOLD Systems e no GenBank? E quais espécies ainda não têm nenhuma? O recorte é de tetrápodes; peixes não entram.
{const n =conta(cobertura);returnmd`Na última atualização (${status.atualizado_em}): **${fmtn(n.total)}** espécies,**${fmtn(n.com)}** com DNA público (${fmtpct(n.com/ n.total)}), **${fmtn(n.sem)}** sem nenhum DNAencontrado e **${fmtn(n.verificar)}** a verificar.`;}
Listas de espécies
Uma lista de referência por grupo, todas convertidas para o mesmo esquema de colunas.
md`| Grupo | Lista | Licença ||---|---|---|| Anfíbios | Drummond, L. O., Santana, D. J., Lima, L. M. C. & Toledo, L. F. (2026). *Lista de Anfíbios do Brasil*. Herpetologia Brasileira 15(2). [doi:10.5281/zenodo.18340087](https://doi.org/10.5281/zenodo.18340087). Dados estruturados do pacote [amphiBR](https://github.com/paulobarros/amphiBR) (P. Barros). UF, bioma, endemismo e as categorias DD/NT/LC vêm da lista anterior (Segalla et al. 2021, [doi:10.5281/zenodo.4716176](https://doi.org/10.5281/zenodo.4716176)) pelo nome de 2021; as espécies sem nome em 2021 recebem a UF do CTFB. | Listas CC-BY 4.0; pacote GPL ≥ 3 (só os dados são usados) || Répteis | Entiauspe-Neto, O. M., Costa, H. C. & Guedes, T. B. [ReptiliaBR](https://github.com/omarentiauspe/ReptiliaBR) v0.4.0: lista e ocorrência por UF dos répteis do Brasil (SBH). Só ocorrências confirmadas ("X") entram no mapa. | MIT || Aves | Pacheco, J. F. et al. (2021). *Annotated checklist of the birds of Brazil by the Brazilian Ornithological Records Committee*, 2ª ed. Ornithology Research 29: 94-105. Lista Primária. [doi:10.5281/zenodo.5138368](https://doi.org/10.5281/zenodo.5138368) | CC-BY 4.0 || Mamíferos | Abreu, E. F. et al. *Lista de Mamíferos do Brasil* v2025-1. CT-SBMz. [doi:10.5281/zenodo.18378485](https://doi.org/10.5281/zenodo.18378485) | CC-BY 4.0 |Quando a lista registra o nome anterior de uma espécie (combinação antiga, sinônimo júnior), essenome entra na busca de sequências junto com os sinônimos do CTFB e do GBIF: as 63 combinações novasda lista de anfíbios de 2026 (por exemplo, *Scinax agilis* → *Ololygon agilis*) não viram falsasórfãs. Espécies marinhas entram quando alista do grupo as traz (tartarugas marinhas, aves marinhas, cetáceos, sirênios): nenhum filtro manual.`
Sequências
BOLD Systems (portal v5): uma consulta por classe ao endpoint público api/summary, que devolve o número de registros públicos por nome de espécie; outra consulta igual, restrita a material coletado no Brasil. Sem chave.
GenBank (NCBI E-utilities, esearch no banco nuccore): contagem de registros por "Gênero epíteto"[Organism]. O filtro [Organism] usa a taxonomia do NCBI e já inclui os sinônimos que o NCBI conhece. Os nomes anteriores dados pela lista e os sinônimos do CTFB entram na mesma busca com OR.
Catálogo Taxonômico da Fauna do Brasil (CTFB/JBRJ, API REST aberta): sinônimos, ocorrência por UF (usada para aves, e para anfíbios sem UF na lista), endemismo e ano de descrição quando a lista não traz.
GBIF Backbone (api.gbif.org): para as espécies sem DNA sob o nome da lista, o nome aceito no GBIF e os sinônimos dele (pega transferências de gênero, como Heterospizias meridionalis / Buteogallus meridionalis). Se o GBIF não reconhece o nome, nada é inventado: a espécie fica “a verificar”.
Categoria nacional de ameaça: Portaria MMA nº 1.704, de 16/06/2026 (Lista Nacional Oficial das Espécies da Fauna Ameaçadas de Extinção, Anexo I), extraída do PDF publicado no DOU. Espécie com só subespécies listadas aparece como “categoria (ssp.)”. Quando a espécie não consta da portaria, mantêm-se as categorias DD/NT/LC das avaliações citadas pelas listas (MMA 2022 para anfíbios, MMA 2023 para mamíferos).
ao menos um registro no BOLD ou no GenBank sob o nome da lista ou sob outra combinação do mesmo epíteto (transferência de gênero; a observação diz qual)
a verificar
sem DNA sob o nome da lista, mas: há sequências só sob nome alternativo com outro epíteto (sinônimo, nome aceito no CTFB ou no GBIF; pode ser desmembramento ou agrupamento de espécies); ou o nome não está no CTFB ou não é reconhecido pelo GBIF (não deu para conferir sinônimos); ou o nome da lista é sinônimo no CTFB; ou a espécie tem sinônimos conhecidos; ou o nome aparece no GenBank fora do campo Organism (nota, subespécie, identificação antiga); ou o gênero tem 500 registros ou mais no GenBank
sem DNA
nenhuma sequência pública sob o nome e os sinônimos conhecidos, e nenhum dos sinais acima
Cuidado com a “falsa órfã”. Uma espécie pode parecer sem DNA porque o banco usa um nome antigo, um nome com erro ou uma identificação só até gênero (“Gênero sp.”). Por isso o painel nunca afirma “não existe DNA”: afirma que não foi encontrado sob os nomes conferidos. A coluna “Observação” diz o motivo de cada “a verificar” e quantos registros do gênero coletados no Brasil estão sem identificação no BOLD. Achou uma sequência que o painel não viu? Abra uma issue com o link.
Faixas de registros no BOLD seguem o iBOL Europe Gap List: 0 / 1-2 / 3-9 / 10 ou mais. A ideia de ranquear lacunas vem de lá.
Atualização
Um robô (GitHub Actions) roda toda semana: baixa as listas, consulta CTFB, BOLD e GenBank e grava os resultados em CSV no repositório. O histórico do git é o histórico dos dados. A consulta ao GenBank é incremental: espécies novas e as sem DNA são reconsultadas toda semana; as demais, a cada 4 semanas.
Dados e código
cobertura.csv: uma linha por espécie (contagens, situação, observação).