M5. Vetting na prática¶
Nesta aula você vai aprender
- A pergunta que cada teste do vetting básico responde, o que ele pega, o limite e um caso real.
- Como o score é calculado a partir dos pesos, e o que significam aprovado, P1 e P2.
- Como ler a tabela de validação: quantos planetas reais e quantos falsos positivos passam.
- Um roteiro para revisar candidatos com
planethunter candidates,dossierereview. - Como comparar dossiês de planetas conhecidos e de falsos positivos conhecidos.
A ideia: tentar derrubar o sinal¶
O vetting não tenta provar que um sinal é planeta. Tenta derrubá-lo. Cada teste é uma pergunta que um falso positivo comum responderia errado. Um sinal que sobrevive a todas as perguntas não é um planeta confirmado; é só um sinal que não conseguimos derrubar com os dados disponíveis.
O vetting básico roda sem internet, só com a curva de luz, os centróides do arquivo SPOC e os parâmetros da estrela. Está em src/planethunter/vetting/basic.py. Testes que precisam de rede (imagem-diferença no TPF, vizinhos Gaia, outros setores, FPP) ficam no vetting aprofundado, assunto do nível avançado.
Cada teste devolve um de três resultados:
- passa;
- falha: multiplica o score por um peso entre 0,3 e 0,6; alguns testes vetam acima de um limite mais duro, e veto zera o score;
- sem dados: multiplica o score por 0,95 (
unknown_weight).
Os testes, um por um¶
A tabela resume. Os casos reais são do run final de calibração do setor 69 (20261009T203437Z-single-s69), salvo indicação.
| Teste | Pergunta | Pega o quê | Limite | Veto? | Peso |
|---|---|---|---|---|---|
sde, snr |
O sinal é forte o bastante? | Ruído | SDE ≥ 9; SNR ≥ 7,1 | Sim | — |
n_transits |
Vimos pelo menos 2 trânsitos? | Evento único sem período | ≥ 2 | Sim | — |
independence |
Sobrevive se apagarmos os sinais mais fortes da estrela? | Eco de outro sinal | ≥ 50 % dos pontos restam | Sim | — |
odd_even |
Ímpares e pares têm a mesma profundidade? | Binária com período 2× | falha 3σ | ≥ 5σ | 0,4 |
secondary |
Há queda em fase 0,5? | Eclipse secundário | falha 3σ | ≥ 5σ e ≥ 10 % | 0,4 |
secondary_scan |
Há queda em outra fase? | Binária excêntrica | falha 5σ | Não | 0,5 |
shape |
Fundo chato (U) ou pontudo (V)? | Binária rasante | τ/T14 ≤ 0,35; Rp/R* ≤ 0,3 | Não | 0,5 |
radius |
O tamanho é de planeta? | Estrela | falha > 22,4 R⊕ | > 33,6 R⊕ | 0,3 |
duration |
A duração bate com a estrela? | Blend; rasante extremo | razão 0,15 a 1,3 | Não | 0,6 |
centroid |
A luz se desloca durante o trânsito? | Vizinha como fonte | ≥ 3σ e fonte > 1 px | Não | 0,4 |
edges_dumps |
Trânsitos em bordas ou ajustes do telescópio? | Sistemático | ≤ 50 % | Não | 0,4 |
consistency |
Os trânsitos concordam entre si? | Um evento dominando | p ≥ 0,001; maior < 80 % do SNR² | Não | 0,5 |
Portões de detecção: sde, snr, n_transits¶
Pergunta: há sinal suficiente para falar de período? Os limites vêm das aulas M1 e M3.
No começo eram falhas leves. O efeito medido: sinais com SNR 4,9 e sinais com um só trânsito viravam P2 e iam para a fila de revisão. Hoje são veto.
Casos reais. Planetas confirmados também caem aqui quando o setor é fraco: o TOI-286.01 teve SNR 5,6 no setor 69. Dos 4 planetas reprovados na calibração por SNR, nenhum seria detectável como novo naquele setor. E GJ 143 b, com período de cerca de 35 dias, aparece com um trânsito no setor 69: sem segundo trânsito, não há período, e o sinal é vetado.
independence¶
Pergunta: este sinal é independente dos mais fortes da mesma estrela? O teste mascara os trânsitos dos outros sinais e mede quanto do trânsito deste sobra. Se sobrar menos de 50 %, é eco.
Caso real. Na primeira fatia do setor 69, o sinal 1601 (11,95 d) estava reaproveitando os eclipses do sinal 1600 (6,75 d), da mesma estrela. Vetado.
odd_even¶
Pergunta: os trânsitos ímpares e pares têm a mesma profundidade? Uma binária de estrelas diferentes, encontrada com metade do período verdadeiro, alterna eclipses fundos e rasos. O erro usa o ruído em blocos (aula M1).
Casos reais. TOI-343.01 (falso positivo): ímpar 2 294 ppm, par 4 583 ppm, 5,8σ, veto. TOI-2391.01: 6 019 contra 12 749 ppm, veto.
Armadilha. O planeta confirmado TOI-114.01 também foi vetado: 6 690 contra 5 911 ppm, 5,7σ. É o único planeta perdido por ímpar/par na calibração. Com SNR alto, pequenas diferenças (manchas, resíduos de detrending) ficam significativas.
secondary e secondary_scan¶
Pergunta: existe uma queda menor em fase 0,5 (ou em outra fase)? Física na aula M2.
Casos reais. TOI-287.01: 4 503 ppm em fase 0,5, 37 % do primário, veto. TOI-187.01: 108 %, dois eclipses iguais, veto. WASP-18 b: 276 ppm, 3 % do primário, 8σ: falha leve sem veto, graças à regra dos 10 %. O secondary_scan foi criado porque a binária excêntrica TOI-367.01 passava; ele também dá falsos alarmes, como no planeta TOI-329 b (5,3σ em fase 0,543), por isso nunca veta.
shape¶
Pergunta: o trânsito tem forma de U ou de V? Mede \(\tau/T_{14}\) num ajuste de trapézio.
Calibração. Limite 0,35: pega 8 de 18 falsos positivos e marca 3 de 50 planetas (rasantes reais: HIP 65 A b, LTT 9779 b, TOI-2382 b). Casos: TOI-297.01 (0,42), TOI-353.01 (0,45), TOI-4858.01 (0,41, e com \(R_p/R_\star\) = 0,25).
radius¶
Pergunta: o objeto tem tamanho de planeta? \(R_p = \sqrt{\delta} \times R_\star\). Falha acima de 2 raios de Júpiter (22,4 R⊕), veta acima de 3 (33,6 R⊕). Depende do raio da estrela no TIC: raio errado, raio errado do planeta.
Casos reais. TOI-147.01: 26,2 R⊕, falha. TOI-219.01: 33,3 R⊕, falha por pouco sem veto. TOI-353.01: 29,4 R⊕.
duration¶
Pergunta: a duração combina com o tamanho e a massa da estrela? Física e fórmula na aula M2.
Casos reais. Curto demais: sinal 1594, 0,58 h numa gigante com 10,7 h previstas (razão 0,05). Longo demais: TOI-724.01, 8,40 h contra 3,56 h (razão 2,4).
centroid¶
Pergunta: o "centro de luz" da imagem se desloca durante o trânsito? Se a queda vier de uma vizinha, o centróide se move na direção oposta a ela.
O truque é a distância implícita da fonte. Se uma fonte a uma distância \(D\) do centróide escurece com profundidade relativa \(\delta\), o centróide se desloca cerca de \(\delta \times D\). Então \(D \approx\) deslocamento / profundidade.
Calibração medida. A primeira versão reprovava qualquer deslocamento acima de 3σ. Resultado: 11 de 41 planetas confirmados reprovavam. Todos tinham fonte implícita a no máximo 0,88 pixel, ou seja, em cima do alvo. Com estrelas brilhantes e muitos trânsitos, até um deslocamento minúsculo vira "significativo". Regra atual: falha só se o deslocamento for maior que 3σ e a fonte implícita estiver a mais de 1 pixel (21″).
Caso real. TOI-854.01 (falso positivo): deslocamento de 12σ, fonte implícita a 2,0 pixels. Falha.
edges_dumps¶
Pergunta: os trânsitos caem colados em bordas de segmento ou em ajustes de apontamento (momentum dumps)? Falha se mais de 50 % caírem perto de um ou de outro (aula M3).
Casos reais. Vários sinais NEW de 11 a 12 dias com 100 % dos trânsitos em bordas de segmento: eventos de borda de órbita. O planeta TOI-481 b também falhou (67 % em bordas): é falha leve porque planetas reais às vezes têm azar.
consistency¶
Pergunta: todos os trânsitos têm profundidade parecida? Qui-quadrado com erro em blocos (aula M1).
Casos reais. TOI-343.01 (falso positivo): p = 6 × 10⁻⁷. Planetas de SNR muito alto também falham (WASP-97 b, WASP-18 b), por isso é falha leve.
O score¶
O score começa em 1,0. Para cada teste:
- falhou sem veto: multiplica pelo peso do teste (tabela acima, de
config/thresholds.yaml); - sem dados: multiplica por 0,95;
- vetou: o score vira 0.
Aprovado no básico (PASS_BASIC) se o score for pelo menos 0,5 (pass_score). Para sinais NEW, a severidade segue: P1 com score ≥ 0,8; P2 entre 0,5 e 0,8, ou se a estrela não tem raio conhecido, ou se ela é uma binária eclipsante catalogada.
Três exemplos reais:
| Sinal | Falhas | Conta | Score | Resultado |
|---|---|---|---|---|
| Pi Men c (setor 1) | nenhuma | 1,0 | 1,0 | PASS_BASIC |
| WASP-18 b (setor 69) | secondary, consistency |
0,4 × 0,5 | 0,2 | FAIL |
| Sinal 1594, regras atuais | duration |
0,6 | 0,6 | PASS_BASIC, mas no máximo P2 |
O score não é uma probabilidade
Score 1,0 diz que nenhum teste automático encontrou problema. Não diz que é planeta. E WASP-18 b, um planeta confirmado, tem score 0,2. O score é uma ordenação útil para decidir o que olhar primeiro.
Exercício 1
Calcule o score e o resultado:
a) Falha em shape; todos os outros passam.
b) Falha em shape; centroid sem dados; o resto passa.
c) Falha em odd_even com 4,2σ e em edges_dumps.
d) Tudo passa, mas odd_even deu 5,3σ.
Ver resposta
a) 0,5. Aprovado (≥ 0,5), mas P2 se for NEW.
b) 0,5 × 0,95 = 0,475. Reprovado. Um teste sem dados pode ser a diferença entre passar e não passar.
c) 0,4 × 0,4 = 0,16. Reprovado. 4,2σ é falha (≥ 3σ), mas não veto (< 5σ).
d) 0. Veto: 5,3σ passa do limite de 5σ do odd_even. Nenhuma combinação de outros testes salva um veto.
A validação: o vetting funciona?¶
Como saber se os pesos e limites fazem sentido? Rodando o vetting em sinais de resposta conhecida: planetas confirmados (KNOWN_PLANET) e falsos positivos já classificados (KNOWN_FP).
Setor 69, calibração (194 alvos escolhidos: TOIs da lista de recall mais 30 falsos positivos do TFOPWG):
| Classe | Sinais | Aprovados | Taxa |
|---|---|---|---|
| KNOWN_PLANET | 54 | 44 | 81 % |
| KNOWN_TOI | 74 | 61 | 82 % |
| KNOWN_FP | 18 | 8 | 44 % |
| NEW | 10 | 0 | 0 % |
Setor 107, setor inteiro (12 998 estrelas, 4 431 sinais; run 20261009T221706Z-single-s107, tabela impressa por planethunter vet):
| Classe | Sinais | Aprovados | Taxa |
|---|---|---|---|
| KNOWN_PLANET | 84 | 66 | 79 % |
| KNOWN_TOI | 104 | 77 | 74 % |
| KNOWN_FP | 132 | 7 | 5 % |
| NEW | 1 339 | 62 | 5 % |
O guia do projeto resume as calibrações do setor 69 assim: planetas confirmados passam de 77 % a 84 %, e falsos positivos de 11 % a 44 %, conforme a amostra e a versão dos testes. No setor 107 inteiro: 79 % contra 5 %.
Por que os falsos positivos passam tanto mais no setor 69? Porque a amostra foi escolhida a dedo: falsos positivos que o TFOPWG só descartou com trabalho extra. Os 8 que ainda passam incluem secundários vistos só somando os setores 1 a 69 (TOI-366, 307, 297, 184), uma binária excêntrica (TOI-367), formas em V marginais (TOI-189, 4858) e binária de fundo. No setor 107, a amostra é o setor inteiro, dominado por binárias óbvias: vetadas por raio (45), secundário (43) e ímpar/par (14).
E por que 20 % dos planetas reais reprovam? No setor 107, os vetos em planetas foram por SNR (4), número de trânsitos (2) e secundário (1). As falhas leves mais comuns: forma, centróide, consistência. Planetas fracos num setor e rasantes reais pagam o preço de um vetting que precisa derrubar binárias.
Na ferramenta
uv run planethunter vet <run_id> imprime essa tabela a cada execução, com as colunas classe, n, pass, taxa_pass, falhas_comuns e vetos. O que esperar: KNOWN_PLANET perto de 80 % e KNOWN_FP baixo. Se KNOWN_PLANET cair muito depois de uma mudança, o vetting ficou rigoroso demais. Se KNOWN_FP subir, ficou frouxo.
Roteiro de revisão de candidatos¶
Os candidatos são sinais NEW que passaram o vetting básico. Três comandos:
uv run planethunter candidates # a fila, por severidade e score
uv run planethunter dossier <signal_id> # gera o dossiê HTML em data/dossiers/
uv run planethunter review <signal_id> rejected --reason eb --note "eclipses alternados"
O review aceita três decisões: approved, rejected e follow_up. Rejeitar exige um motivo:
| Motivo | Quando usar |
|---|---|
eb |
Binária eclipsante: ímpar/par diferente, secundário, forma em V, raio de estrela |
blend |
O sinal vem de outra estrela: centróide fora, duração incompatível, vizinha conhecida |
sistematico |
Defeito instrumental: trânsitos em bordas ou dumps, um setor só |
ruido |
Não há trânsito convincente: pico fraco, dobra sem forma |
ja_conhecido |
O objeto já existe e o crossmatch não pegou |
outro |
Nenhum dos acima; explique na nota |
A nota é guardada junto ao motivo (por exemplo, [eb] eclipses alternados). Rejeitados saem da lista. As revisões viram dados de treino para o futuro classificador.
flowchart TD
A[Abrir dossiê] --> B{Trânsito dobrado em U, pontos acompanham o modelo?}
B -- não --> R1[rejected: ruido]
B -- sim --> C{Ímpar = par e fase 0,5 plana?}
C -- não --> R2[rejected: eb]
C -- sim --> D{Trânsitos longe de bordas e dumps?}
D -- não --> R3[rejected: sistematico]
D -- sim --> E{Duração e centróide compatíveis com o alvo?}
E -- não --> R4[rejected: blend]
E -- sim --> F[ExoFOP e literatura: já existe?]
F -- sim --> R5[rejected: ja_conhecido]
F -- não --> G[follow_up ou approved]
Para cada candidato, percorra o dossiê nesta ordem: cabeçalho (severidade, classe, score, host conhecido); parâmetros (a estrela tem raio? o planeta tem tamanho de planeta?); curva de luz (trânsitos colados em linhas azuis ou bordas?); trânsito dobrado (U ou V?); ímpar, par e secundário; profundidade por trânsito (algum ponto fora da linha?); tabela de vetting (leia cada nota, não só o resultado); crossmatch (idade dos espelhos); próxima ação.
Escreva sempre a nota
"eb" sozinho ensina pouco. "eb: par 2× mais fundo que ímpar, secundário 12 % em fase 0,5" ensina muito, para você daqui a três meses e para o classificador.
Exercício principal: planetas contra falsos positivos¶
Exercício 2
Gere e compare 5 dossiês de KNOWN_PLANET e 5 de KNOWN_FP. Para listar sinais de cada classe já vetados no seu banco, salve este script como listar_conhecidos.py e rode uv run python listar_conhecidos.py:
import duckdb
con = duckdb.connect("data/planethunter.duckdb", read_only=True)
df = con.execute("""
SELECT c.match_class, s.signal_id, s.tic_id, c.matched_name,
round(s.period_days, 3) AS periodo_d, round(s.depth_ppm) AS prof_ppm,
round(v.score, 2) AS score, v.vetoed_by, v.failed
FROM signals s
JOIN crossmatch c USING (signal_id)
JOIN vetting v USING (signal_id)
WHERE c.match_class IN ('KNOWN_PLANET', 'KNOWN_FP')
ORDER BY c.match_class, s.signal_id DESC
LIMIT 60
""").df()
print(df.to_string(index=False))
Escolha 5 de cada classe (de preferência variados: alguns aprovados, alguns reprovados) e gere os dossiês com uv run planethunter dossier <signal_id>. Para cada um, anote numa tabela: profundidade, raio, forma (τ/T14), ímpar/par, fase 0,5, razão de duração, centróide, score. Depois responda: o que distingue os dois grupos visualmente?
Ver resposta
A resposta depende dos sinais escolhidos, mas os padrões que aparecem no setor 69 são:
- Profundidade e raio. Falsos positivos tendem a ser mais fundos (milhares a dezenas de milhares de ppm) e a dar raios acima de 22 R⊕ (TOI-147.01, TOI-219.01, TOI-353.01). Planetas pequenos quase nunca são falsos positivos óbvios.
- Forma. No gráfico "Trânsito dobrado", os FPs mostram V ou rampas longas (τ/T14 de 0,36 a 0,45); os planetas, U com rampas curtas (0,1 a 0,15).
- Ímpar, par e fase 0,5. Nos FPs, o painel ímpar/par mostra profundidades diferentes (TOI-343.01) ou o terceiro painel mostra uma queda clara (TOI-287.01). Nos planetas, os dois primeiros painéis são iguais e o terceiro é plano. Exceção a reconhecer: Júpiteres ultraquentes, como WASP-18 b, com uma ocultação pequena em fase 0,5.
- Centróide. Alguns FPs mostram fonte implícita a mais de 1 pixel (TOI-854.01).
- Onde eles se parecem. FPs que só se revelam com vários setores ou com imagens de alta resolução parecem planetas em todos os gráficos de um setor. É por isso que existe o vetting aprofundado.
Se você escolheu planetas reprovados (WASP-18 b, TOI-114.01, TOI-481 b), note que a reprovação vem de testes de consistência e ímpar/par em sinais de SNR altíssimo: diferenças pequenas e reais, mas sem cara de binária.
Exercício 3
Qual motivo de rejeição você usaria?
a) Dossiê com 2 trânsitos, ambos a menos de 0,1 d do início de um segmento. b) τ/T14 = 0,45, par 2× mais fundo que ímpar, Rp = 28 R⊕. c) Duração 0,6 h numa estrela de 2,5 R☉; centróide com fonte implícita a 1,8 pixel. d) O ExoFOP mostra um CTOI submetido ontem com o mesmo período.
Ver resposta
a) sistematico. Trânsitos em bordas de segmento são a assinatura de rampas de detrending. Nota sugerida: "2/2 trânsitos em borda de segmento".
b) eb. Três sinais de binária ao mesmo tempo: forma em V, alternância ímpar/par, tamanho de estrela.
c) blend. Duração curta demais para uma estrela grande (como o sinal 1594) e centróide apontando para fora do alvo: o sinal provavelmente vem de uma vizinha menor.
d) ja_conhecido. O espelho local ainda não tinha o CTOI. Vale anotar o nome do CTOI na nota.
Checklist da aula¶
- Sei dizer a pergunta de cada um dos 13 testes da tabela e um caso real de cada.
- Sei calcular o score a partir das falhas, dos testes sem dados e dos vetos.
- Sei explicar por que o centróide usa a distância implícita da fonte.
- Sei ler a tabela de validação e explicar a diferença entre o setor 69 e o setor 107.
- Gerei e comparei 5 dossiês
KNOWN_PLANETe 5KNOWN_FP. - Revisei pelo menos 10 candidatos com
planethunter review, cada um com motivo e nota. - Li
docs/benchmarks/2026-10-09-s0069-vetting.mde sei explicar cada linha da tabela "O que foi medido e corrigido".
Para ir além¶
- No repositório,
docs/benchmarks/2026-10-09-s0069-vetting.md: a calibração completa, com o que foi medido e corrigido, os FPs que ainda passam e o funil da primeira fatia real. - Guerrero et al. (2021), The Astrophysical Journal Supplement Series 254, 39: como a equipe do TESS faz o vetting dos TOIs. Compare os critérios com os desta aula.
- Thompson et al. (2018), The Astrophysical Journal Supplement Series 235, 38: o Robovetter do Kepler, o "avô" dos testes automáticos. Fica para a aula A2.
- Fóruns do Planet Hunters TESS em zooniverse.org: voluntários discutindo, com os mesmos argumentos desta aula, se um sinal é planeta ou binária.