( Ir para a parte 1 )

7/1/2002

Ano novo: nova disposição, novas amostras, novo eixo vertical. Eixo vertical? Sim. Depois do recesso de fim-de-ano, com a cabeça mais "fresca", enxerguei uma coisa que já deveria ter percebido há mais tempo: não é com %R (porcentagem de reflectância), onde as absorções são "vales", que se trabalha. Usa-se, isso sim, uma tal de Função de Remissão F(R), onde as absorções são "picos", e além disso "picos gaussianos". [É muito melhor, matematicamente falando, de se trabalhar com a curva gaussiana, cujas propriedades são bem conhecidas.] A relação entre F(R) e %R é fácil: F(R) = (1 - %R) ^ 2 / (2 * %R). Mas a diferenç;a entre as 2 ccurvas é bem grande. Além da transformação de vales em picos, nota-se que o que era grande vira pequeno, e vice-versa (quanto mais clara a amostra, menor o gráfico, por exemplo). Quer ver como fica o antes-e-depois daquelas 2 goethitas do "ano passado"?

Antes

Depois

E não é que até o gráfico está diferente, sem bordas pretas, neste ano novo? Mas deixando a brincadeira de lado, outra coisa que eu aprendi foi que existe um "contínuo" sobreposto aos picos (em F(R) são realmente picos) de absorção, e que este contínuo é causado pelas múltiplas reflexões nos grãos. Quanto mais moemos os grãos, mais importante fica este contínuo (isto é, mais "branca" fica a amostra, coisa que é facil de se perceber na prática).


8/1/2002

Lembra da coleção nova que eu citei (e medi!) ontem? Só percebi hoje: perdi quase todos os resultados, por não entender direito como o programa Scan grava as medidas. Você pode sobreescrever um arquivo com novas medidas, mas desde que as medidas anteriores estejam associadas a um gráfico, isto é, estejam plotadas. Caso contrário, elas só sobrevivem até você sair do programa. Paciência (de novo).

Mas como medir até que é bem rápido, cá estão as novas curvas. Além da adoção do F(R), também estou padronizando a visualisação separada da faixa NIR e da faixa Vis-UV, pois elas se tornam muito mais discrepantes (em tamanho) do que no %R.
 

Mas como medida sem algumas "esperienciazinhas" não é medida, aproveitei para ver se descobria quais destes picos estão associados à água, e quais estão associados à sílica. Veja o que aconteceu secando a amostra TORTA-1 na estufa (espectro NIR):

Legal, né? Fiz o mesmo com um pouco de sílica gel azul (também espectro NIR), e confirmei aquele pico a 5200 e pouco, além de obter alguns outros, menos importantes. De quebra, vi com é a "cara" da sílica:

Pra finalizar, um exemplo daquela história de contínuo (espectro Vis-UV, para variar):


9/1/2002

Lendo os trabalhos do pessoal, agora sob a nova luz do F(R), percebe-se que é possível até quantificar as absorções, isolando a gaussiana de cada absorção e calculando a respectiva área. O contínuo é um "complicador" nesta história, devendo ser subtraído antes que se faça tal análise. Outro problema é que no software que acompanha o espectrofotômetro não existe este ferramental; existe apenas o mecanismo (da derivada 2.a) de se definir a posição horizontal do pico, que resolve apenas parte do que queremos.

Portanto, pretendo me dedicar a implementar este método, das *áreas das gaussianas*, escrevendo um programa que leia os arquivos .DSW e faça toda a manipulação necessária. Como programar é um processo bem mais lento que medir, provavelmente este diário vai deixar de ser "diário", por uns tempos. Mas acho que o esforço compensa.


18/1/2002

Resumo do que eu andei fazendo. Basicamente navegando pela Internet, atrás de: (1) programas prontos que já fizessem o que eu pretendo implementar e (2) uma linguagem de programação gratuita, já que a Microsoft não fornece nenhuma junto com o Windows.

Quanto aos programas prontos, não encontrei só um, mas vários. Entre os não-gratuitos, se destacam o PeakFit da SPSS (do qual eu "baixei" até um programa demo, que infelizmente só aceita trabalhar com seus próprios dados-exemplo) e o *ACD/UV-IR Manager da ACD, que faz parte de um pacote profissional enorme (=caro) de análise química, e importa até arquivos Varian diretamente (o PeakFit só os aceita convertidos para planilha Excel; de qualquer modo, este é um recurso que já existe no pacote da Varian). Tem um plug-in para o Origin que também é bem citado.

Entre os gratuitos, a maioria é para análise de espectros de raio-X e/ou de baixa qualidade. De qualquer forma, recomendo os endereços: http://www.ccp14.ac.uk/mirror/mirror.htm e http://spot.fho-emden.de/ftp/mess.htm (como fonte de software) e http://www.spectroscopynow.com/ (como fonte de software e também de informações). Os melhores que eu achei para Windows foram o Xfit, que eu não me interessei porque não aceita dados quaisquer (apenas de raio-X) e o Unifit, que eu até "baixei" para ver. Mas existem muito mais recursos gratuitos para quem está criando seu próprio programa. E não falo só das linguagens de programação; existem também muitos "pedaços prontos" (pacotes matemáticos, de plotagem etc.) que se pode utilizar. É por esse caminho que eu pretendo seguir.

Quanto à linguagem de programação gratuita, depois de pesquisar um pouco acabei optando pela linguagem Python que, além de ser "software livre" por excelência, tem versões para quase todas as plataformas (Windows, Mac, Unix etc) e se relaciona bem com pacotes já existentes, mesmo os escritos em outras linguagens. De cara, já adotei o plotador Gnuplot e sua interface p/ Python, para serem usados na visualização das curvas.

Já estou com a linguagem (e seus complementos) instalada e funcionando. Como os programas Varian também exportam seus resultados em formato texto simples (.CSV = Comma-Separated Values, isto é, Valores Separados por Vírgula), é esse que eu vou adotar, como formato de entrada.


25/1/2002

Lá vai mais um resumo semanal dos meus progressos (da mesma forma que a última anotação, de 18/1, hoje também é sexta-feira; talvez fosse melhor começar a chamar este diário de "semanário" :-). Já consigo importar com segurança os arquivos, isolar as diferentes curvas que estão lá dentro, e plotá-las. Um detalhe importante: diferentemente do que acontece com o MS Excel, o Gnuplot não restringe o número máximo de pontos que se pode plotar (a 4800, se não me engano; uma curva típica minha tem quase 6000 !). Isso é um alívio, pois foi por esse motivo que abandonei a idéia de usar o Excel como ambiente de análise (além de ser um programa de planilhas e plotagem, o Excel também possui uma linguagem de programação embutida, o VBA ou Visual Basic for Applications, que eu já utilizei em algumas ocasiões). Quer ver uma plotagem? Aqui está uma da sílica-gel, na faixa do visível (ou Vis; estou dividindo as curvas em 3 seções: UV, Vis e NIR):

Os próximos passos são matemáticos: (1) suavizar ("alisar") a curva, para (2) poder calcular a derivada 2.a e então (3) usar os vales desta última para marcar os "candidatos a picos", automaticamente. Terminei a semana razoavelmente bem-sucedido nos passos 1 e 2.

Principalmente a suavização me tomou um bom tempo, porque a estratégia que eu tentei inicialmente, a das "médias móveis", ou seja, substituir cada ponto por uma média dele mesmo com os vizinhos que caem dentro de uma zona (de tamanho predefinido) ao redor desse ponto (denominada janela), não deu bons resultados: a janela tinha que ser muito grande para conseguir a suavização necessária, e isso amortizava demais os picos agudos. A solução foi adotar o método da "melhor parábola", que converge mais rapidamente para menos pontos, e que dá o bônus adicional de já fornecer as 2 primeiras derivadas durante o processo (pois eu obtenho a, b & c da equação y = ax^2+bx+c, implicando que: 1.a derivada = y' = 2ax+b & 2.a derivada = y'' = 2a). Compare os efeitos, usando a mesma janela de 11 pontos (5 para cada lado, mais o próprio ponto):

Outra coisa crítica é o passo da janela. Se o passo é muito pequeno (próximo de 1), a largura da janela tem que aumentar. No grafico acima, o passo também foi 11. (Note que o número de pontos da curva alisada é inversamente proporcional ao passo, já que é a cada passo que se gera um ponto "liso".)


1/2/2002

Outro resumo de semana. Depois de executar vários testes para certificar os passos 1 e 2, ataquei o passo 3 (marcar os picos automaticamente). Descobri que o ponto de maior curvatura negativa (derivada 2.a mínima) não é necessariamente equivalente ao pico; se a inclinação do contínuo de fundo for muito grande na região isto "puxa morro-abaixo" o máximo da curvatura, afastando-o do pico verdadeiro. Isto significa que o passo 3, apesar de já estar com a programação bem adiantada, passou a ser o passo 4, pois o novo passo 3 agora é: "subtrair o contínuo de fundo". Foi atacando o novo passo 3 que eu terminei a semana. Mas para não deixar esse resumo sem um gráfico-exemplo, vejamos o detector de picos em ação, justamente ilustrando a "queda morro-abaixo": (1) para a esquerda no ponto mais à esquerda, (2) inexistente no ponto do centro e (3) para a direita no ponto mais à direita.


7/2/2002

Quem esperava outro resumo 4S ("Semanal das Sextas Sobre Software"), se enganou duplamente. Primeiro porque hoje ainda é quinta ;-), e segundo porque os acontecimentos mudaram de rumo. Parei um pouco com a parte de programação, para atacar mais a fundo a teoria.

A base matemática da função F(R) é um texto "velho pra burro" (de 1931) escrito por 2 caras, que acabaram dando o nome para o método: Kubelka-Munk. Dando uma busca na Internet pelo nome dos 2, encontrei muita informação interessante. Até uma dedução matemática (para quem gosta!) completa dessa teoria, que é usada numa grande variedade de áreas: desde a análise de tintas e a fabricação de papel até as ciências planetárias e as redes neurais. Um texto menos matemático, mas muito bem explicado é: http://www.spectra-tech.com/innovation/manuals/t2.pdf, sobre espectroscopia infravermelha, onde ficam bem claros os limites de aplicação do método: espessura infinita (na prática, alguns mm) e diluição infinita (para que o tamanho de um pico seja proporcional à concentração do composto que provoca esse pico). Aliás, é por causa dessa exigência de "diluição infinita" que, em espectrofotometria associada à química analítica, se exige a preparação de pastilhas de KBr (um sal branco), com o material a analisar diluído dentro, coisa que até agora eu não entendia bem o porquê. Mas minha expectativa é que isso seja crítico apenas na zona do infravermelho, onde os picos são bem mais intensos que no visível. De qualquer modo, fica o alerta: "Se seus picos são intensos, cuidado com os desvios na linearidade da relação: tamanho-concentração".

Chegou também nas minhas mãos uma tese bem recente, aqui da ESALQ mesmo, sobre cor dos solos. Na bibliografia dela, encontrei os trabalhos de Barrón e Torrent, 2 pesquisadores espanhóis que estudam espectrofotometria de solos atualmente, e que têm alguns bons textos sobre o assunto. Tem até um (junto com um alemão, Scheinost) que pretende tirar conclusões sobre concentração diretamente da curva da derivada 2.a, coisa que eu acho matematicamente impossível (já que a derivada registra apenas variações, e não valores absolutos), mas tudo bem...


22/2/2002

Semana passada foi carnaval, também não teve resumo 4S. Mas hoje tem. "Perdi" boa parte da semana aprendendo Tkinter, um módulo Python para programar usando a estética de "janelas" (com botões, barras de rolagem etc, como são hoje todos os programas para Windows). Também precisei aprender mais um módulo Python, o Numeric (ou NumPy, para os íntimos), para poder implementar o método (não-linear) da melhor gaussiana.

Com a "melhor gaussiana" implementada e testada, assim como toda a parte de janelas, terminei a semana me considerando um razoável programador Python. Estou agora testando várias estratégias para subtrair o contínuo de fundo. Olha só como está o programa:

Note (além da "janelinha" de diálogo, toda caprichada!) como o fundo é calculado a partir da melhor gaussiana somente dos pontos que têm derivada 2.a não-negativa. O fundo ainda não está envolvendo a curva original totalmente "por baixo" como esperado, mas a gente chega lá. O gráfico do resíduo (diferença entre a curva suavizada e o fundo calculado) já parece bem promissor, não acham?


1/3/2002

Semana puramente matemática. O fato de que algumas vezes a "melhor gaussiana" de fundo, inexplicavelmente, não converge levou-me a gastar esta semana com: (1) um estudo aprofundado da matemática envolvida no processo, buscando informação em fontes como os (excelentes) sites: Nonlinear Least Squares Curve Fitter (interativo, em Java) e http://www.curvefit.com; (2) a realização de uma série de novas experiências, como a implementação de outros tipos de curvas (cúbica, exponencial), usando o mesmo método não-linear e (3) uma busca na Internet por implementações do método de Levenberg-Marquardt (ou Marquardt-Levenberg?), que é o algoritmo usado em quase todos os softwares "profissionais" de regressão não-linear.

8/3/2002

Enquanto não consigo descubrir porque a danada de "melhor gaussiana" às vezes não converge (e olha que eu tenho feito testes exaustivos, "enchido" a rotina de proteções, de pré-checagens etc), encerrei a semana de certa forma "pedindo água", isto é, voltando a buscar na Internet por programas prontos (e, se possível, gratuitos) que já executem essa tarefa por mim. Tive 2 gratas surpresas, vindas da turma do software livre: (1) um programa de análise de picos de NMR (Ressonância Magnética Nuclear) de proteínas, o Sparky, que embora não seja para curvas mas sim para superfícies, tem toda a rotina de regressão escrita em Python (de modo que posso aproveitar trechos dela, simplesmente copiando&colando) e principalmente (2) o francês WinPLOTR, um programa para análise de raios-X (como tantos outros) mas que, ao contrário dos outros, possui também alguma previsão para trabalhar com outros tipos de espectro. Fiquei especialmente animado ao visitar uma das páginas demo dele, sobre "fitagem" de curvas. No momento, estou tentando converter os arquivos .CSV do Varian para um formato que o WinPLOTR aceite.

15/3/2002

Finalmente, na semana que hoje se encerra, "a coisa" deslanchou. Já deu para adivinhar, não é? Descobri qual era o problema da "melhor gaussiana"! (Até parei com o trabalho de conversão dos arquivos .CSV, por enquanto.) Era simplesmente uma questão de, algumas vezes, a base da curva não estar suficientemente próxima do eixo y=0, como toda gaussiana bem comportada deve fazer. Descobri isso depois de inserir um fator de "amortecimento" na rotina, de modo que ela conseguisse convergir mais devagar, evitando assim a divergência em alguns casos de fracasso. A curva assim obtida era enorme, e seu pico ficava a "quilômetros" de distância da zona original, tudo para tentar acertar a parte baixa da curva num patamar acima de zero. Foi só mover artificialmente a base da curva para zero, que tudo se resolveu. Melhor ainda: incluí o desvio do zero como mais um parâmetro a ser "fitado", e agora nem preciso computá-lo (separadamente) antes.

De quebra, implementei uma "linha de status" na janela de diálogo (com apenas uma meia-dúzia de linhas de código; a linguagem Python realmente foi uma boa escolha!) e um algoritmo que, apesar de lento, obtém com boa segurança a tão desejada "envoltória inferior", que eu buscava para servir de fundo. Não tem muito segredo, não. A idéia é calcular a "melhor curva" uma porção de vezes, substituindo a cada vez os pontos que caem acima da "melhor curva" por pontos da própria "melhor curva". Simples, não? Olha só como é que "a coisa" está agora:


(janela de diálogo)


(janela da plotagem)

No gráfico acima: resíduo = alisada - fundo. Pelas 2 derivadas 2.as, já deu para perceber que os picos não se deslocam "tanto assim" quando se subtrai o fundo (como eu havia pensado!). Mas isso é outro problema, que fica para a semana que vem.


22/3/2002

Mais um bom e velho resumo 4S. Dizem que programar é um pouco como montar um quebra-cabeças: demora muito no começo, mas quando se está chegando no fim, tudo vai se encaixando. Pois parece que é isso mesmo: com apenas pequenas modificações no módulo da "melhor gaussiana", implementei rapidamente um outro que converge várias ao mesmo tempo (um pouco graças ao NumPy, que permite tratar matematicamente vetores e matrizes como se fossem simples números). Só tive algum trabalho na hora de dar o "palpite inicial" para a largura dos picos, que no fim acabaram saindo das meias-distâncias entre cada pico e os respectivos pontos de inflexão que o cercam, na derivada 2.a.

E não é só isso. Este novo módulo resolveu, quase que por mágica, o "enrosco" que ficou da semana passada. Agora, não tem problema que os picos encontrados não estejam *exatamente* no lugar; a convergência leva eles para lá! A convergência está lenta (e às vezes falha), mas já está dando até para ser usada, com a inclusão da lista dos valores gerados na janela de diálogo (também rapidamente -- palmas agora para o Tkinter!).

A semana realmente rendeu. Deu tempo até para retornar ao programa WinPLOTR, e conseguir descobrir o formato que ele aceita: colunas de números, separadas por espaços. Seja no Excel (salvando o arquivo .XLS como "texto separado por espaços"), seja num editor de texto qualquer (fazendo buscar&substituir, em todas as vírgulas do arquivo .CSV, por espaços), dá fácil para adaptar os arquivos Varian para ele. O WinPLOTR aceita inclusive arquivos multicolunas (isto é, contendo várias curvas ao mesmo tempo). Apenas um detalhe: os arquivos Varian trazem um resumo dos parâmetros de medida utilizados, no final do próprio arquivo. É melhor eliminar este resumo, deixando apenas as colunas de números para o WinPLOTR trabalhar.

A análise no WinPLOTR é mais "manual" do que aquela que estou implementando, como aliás bem demonstra aquele demo, que já citei antes. Mas isto talvez seja até uma vantagem, considerando os "apertos" que estou enfrentando para garantir que a convergência automática sempre funcione... Bem, para terminar, segue abaixo a velha goethita Go4, analisada nos 2 sistemas:
[Obs.: o nome é "Convert to..." porque eu primeiro medi em %R, e só então converti para F(R).]


(janela de diálogo do "nosso")


(janela de plotagem do "nosso")


(janela de análise WinPLOTR)


(gráfico do WinPLOTR)

O bom observador, além de perceber que estou escrevendo este texto na quinta seguinte (dia 28/3, às 13:56!), notará que existe um fator de escala (visualmente, em torno de 2000) embutido nas intensidades que aparecem na janela de análise do WinPLOTR, que não consta do gráfico associado. Afora isso, os resultados de ambos os sistemas estão razoavelmente próximos.


28/3/2002

Amanhã (29/3) é feriado de Sexta Feira Santa, então o tradicional resumo das sextas está indo na quinta mesmo. Pois bem: esta semana, apesar da matemática de análise já estar bem adiantada, tive de parar com o estudo de reflectância difusa por um tempo. É que tem gente querendo usar o espectrofotômetro para medir transmitância em líquidos, e percebemos que temos QUASE todo o equipamento para isso.

Digo QUASE porque, apesar do Cary 5E vir de fábrica preparado para medir apenas sólidos (o 4E é que vem preparado para líquidos, incluindo aquecimento, misturadores, medidor de temperatura, bomba de circulação etc.), quando o nosso foi comprado, sabiamente incluiram no pedido alguns frascos para líquido, e respectivo do suporte. Mas, estranhamente, parece que o fabricante esqueceu de mandar um pedaço (a parte de baixo) deste suporte. O mais chato de tudo é que temos 2 deles (1 para a amostra, e outro para a referência), e os 2 estão "sem o pé".

Depois de muito pesquisar na documentação (na verdade, o mais difícil foi descobrir O QUE estava faltando, no meio de tantas pecinhas avulsas!), estamos tentando "simular" a parte que falta. No manual existe a descrição e uma foto da peça equivalente (completa), que vai no 4E; creio que isso será suficiente, para evitar uma "importação de emergência". Portanto, depois do feriado é possível que apareça alguma curva de líquido aqui nesse diário. Vale conferir.


( Ir para a parte 3 )
Hosted by www.Geocities.ws

1