1 Bibliotecas Utilizadas

library(knitr)
library(DT)
library(tidyverse)
library(readxl)
library(pheatmap)

2 Objetivos

O estudo tem como objetivo caracterizar compostos orgânicos voláteis (COVs), presentes no fruto da lobeira, utilizando cromatografia gasosa acoplada à um espectrômetro de massas (GC-MS), com extração por headspace.

3 Análise Cromatográfica

3.1 Preparo de Amostra

Foi utilizadoa uma amostra in natura, do fruto da lobeira, onde está amostra separanda entre casca e polpa. Após esse preparo, foram pesadas em vials de 10 mL aproximadamente 1,0 g em triplicata, a fim de verificar a reprodutibilidade, os frascos foram selados com o auxílio de um crimpador automático, utilizando tampas magnéticas.

3.2 Parâmetros Cromatográficos

As amostras foram analisadas via HS/GC-MS em cromatógrafo a gás da Agilent 7890B acoplado ao espectrômetro de massas 7000D. Os VOCs foram extraídos por 15 minutos a 750 rpm em incubadora mantida a 100 °C. O volume de injeção foi de 2,5 mL com seringa mantida a 100 °C. O gás de arraste utilizado foi o hélio 5.0 (99,999%) com velocidade linear de 30,405 cm/s e o injetor operou no modo splitless a 280 °C. Utilizou-se a coluna HP-5ms de 30 m x 250 μm x 0,25 μm. O forno operou a temperatura inicial de 40 °C por 5 minutos, seguido por rampa de 5 °C/min até 160 °C, em seguida, 1 °C/min até 170 °C, por fim, 10 °C/min até 250 °C, totalizando 47 minutos de análise. O espectrômetro de massas operou no modo EI com temperatura da fonte de íons a 300 °C, no modo SCAN a 70 eV com faixa de massa de 17-400 m/z. Os picos foram identificados com base na correlação de similaridade com os espectros padrões da biblioteca NIST 14.

4 Tratamento de Dados

Foi necessário converter os arquivos contendo os cromatogramas de (.D) para (mzML), utilizando o software da Proteo Wizard (Msconvert). Após a conversão, os arquivos foram carregados no software MZmine versão 4.9.14, onde foi realizado todo o processamento de dados com o seguinte workflow:

Fluxo de processamento de dados em GC-EI-MS
Etapa Descricao
1. Importação Entrada dos dados brutos
2. Detecção de massas Centroidização e threshold
3. EIC Construção de cromatogramas de íons extraídos
4. Deconvolução Separação de sinais sobrepostos
5. Alinhamento Comparação entre amostras (tempo de retenção e m/z)
6. Identificação Busca na biblioteca espectral NIST
7. Exportação O processamento é salvo em CSV

4.1 Parâmetros do tratamento de dados no MZmine

A tabela completa contendo os parâmetros do processamento de dados no MZmine (versão 4.9.14) está disponível no Material Suplementar:
Parâmetros

4.2 Número de picos cromatográficos identificados

##             Sample class compostos_presentes
## 1 LOBEIRA_01_CASCA casca                  23
## 2 LOBEIRA_01_POLPA polpa                  14
## 3 LOBEIRA_02_CASCA casca                  23
## 4 LOBEIRA_02_POLPA polpa                  13
## 5 LOBEIRA_03_CASCA casca                  17
## 6 LOBEIRA_03_POLPA polpa                  14

4.3 Identificação dos Compostos

Após o processamento dos dados no software MZmine, foi exportada uma tabela contendo as features detectadas, caracterizadas pela razão massa/carga (m/z), tempo de retenção (RT) e área do pico. A identificação dos compostos foi realizada no próprio software, com base na comparação dos espectros de massas obtidos com aqueles disponíveis na biblioteca espectral NIST, utilizando critérios de similaridade espectral.

dados2 <- read_xlsx("dados_brutos_lobeira.xlsx")

datatable(
  dados2 %>%
    mutate_at(vars(starts_with("Área%")), ~ round(., 2)))

4.4 CLASSIFICAÇÃO DOS COMPOSTOS

Foi realizada a contagem das classes químicas presentes em cada amostra. Embora a amostra Lobeira_03_casca tenha apresentado maior variação na quantidade de picos identificados, a classificação considerou o conjunto geral dos compostos.

dados_class <- read_xlsx("dados_classquimic.xlsx")

resultado <- dados_class %>%
  select(`Fuction Organic`, LOBEIRA_01_CASCA, LOBEIRA_01_POLPA) %>%
  
  pivot_longer(
    cols = starts_with("LOBEIRA"),
    names_to = "amostra",
    values_to = "intensidade"
  ) %>%
  
  
  filter(intensidade > 0) %>%

  
  group_by(amostra, `Fuction Organic`) %>%

  
  summarise(qtd = n(), .groups = "drop") %>%
  
  pivot_wider(
    names_from = amostra,
    values_from = qtd,
    values_fill = 0)

resultado
## # A tibble: 7 × 3
##   `Fuction Organic` LOBEIRA_01_CASCA LOBEIRA_01_POLPA
##   <chr>                        <int>            <int>
## 1 Alcino                           1                0
## 2 Aldeído                          3                1
## 3 Furano                           1                1
## 4 Sesquiterpenos                   1                0
## 5 Álcool                           2                3
## 6 Éster                           13                7
## 7 Éter                             2                2

4.5 Filtragem

Foi montada uma tabela indicando se cada composto identificado pertence exclusivamente à polpa, exclusivamente à casca ou se está presente em ambas as partes do fruto. A classificação foi realizada com base na presença/ausência dos compostos nas réplicas analisadas.

tabela_compostos <- dados2 %>%
  mutate(
    presente_casca = ifelse(`LOBEIRA_01_CASCA` > 0 | `LOBEIRA_02_CASCA` > 0 | `LOBEIRA_03_CASCA` > 0, TRUE, FALSE),
    presente_polpa = ifelse(`LOBEIRA_01_POLPA` > 0 | `LOBEIRA_02_POLPA` > 0 | `LOBEIRA_03_POLPA` > 0, TRUE, FALSE),
    categoria = case_when(
      presente_casca & presente_polpa ~ "Ambos",
      presente_casca & !presente_polpa ~ "Somente Casca",
      !presente_casca & presente_polpa ~ "Somente Polpa",
      TRUE ~ "Nenhum"
    )
  ) %>%
  select(compound, CAS, categoria)

datatable(tabela_compostos)

5 HEATMAP

# 1. Carregar pacotes (Idêntico à seção 1 do PRÓPOLIS-UFG)
library(dplyr)
library(tidyr)
library(pheatmap)
library(RColorBrewer)

# 2. Tratamento inicial e garantia do formato
dados <- as.data.frame(dados)

# Criar a matriz apenas com os dados numéricos (da coluna 3 em diante)
matriz_bruta <- apply(dados[, 3:ncol(dados)], 2, as.numeric)

# Transpor a matriz (amostras viram colunas, compostos viram linhas)
# O MetaboAnalyst e o RPubs utilizam as amostras no eixo X (colunas)
matriz_heatmap <- t(matriz_bruta)

# Definir os nomes das amostras nas colunas (pegando a 1ª coluna da tabela)
colnames(matriz_heatmap) <- trimws(as.character(dados[[1]]))

# 3. Anotação superior (Classes: casca / polpa)
# Pegando a 2ª coluna da tabela (a classificação)
vetor_classes <- trimws(tolower(as.character(dados[[2]])))
anotacao_topo <- data.frame(Grupo = vetor_classes)

# Garantir que os nomes da anotação batam perfeitamente com a matriz
rownames(anotacao_topo) <- colnames(matriz_heatmap) 

# 4. Paleta de Cores e Configurações (Estilo Seção 5.3 do PRÓPOLIS-UFG)
# Paleta clássica (Azul -> Branco -> Vermelho)
paleta_metabolomica <- colorRampPalette(rev(brewer.pal(n = 7, name = "RdYlBu")))(100)

# Cores manuais para a barra de "casca" e "polpa"
cores_grupos <- list(
  Grupo = c("casca" = "#D95F02", "polpa" = "#1B9E77") 
)

# 5. Geração do Heatmap
pheatmap(matriz_heatmap,
         scale = "row",                      # Normalização por composto (escala Z-score, cria o contraste)
         cluster_rows = TRUE,                # Agrupa compostos com comportamento similar
         cluster_cols = TRUE,                # Agrupa as amostras (casca com casca, polpa com polpa)
         annotation_col = anotacao_topo,     # Barra de classificação no topo
         annotation_colors = cores_grupos,   # Cores verde/laranja da barra superior
         color = paleta_metabolomica,        # Aplica o degradê de calor (RdYlBu)
         border_color = NA,                  # Remove borda dos quadradinhos para aspecto contínuo
         show_colnames = TRUE,               # Mostra o nome LOBEIRA_P / LOBEIRA_C
         show_rownames = TRUE,               # Mostra os nomes dos compostos (massas/íons)
         fontsize_row = 7,                   # Ajusta o tamanho da fonte (linhas)
         fontsize_col = 8,                   # Ajusta o tamanho da fonte (colunas)
         angle_col = "90")                   # Mantém o nome das amostras na vertical (fácil leitura)