interfase de datos entre un analizador gc-ms (gas...

265
Interfase de datos entre un analizador GC-MS (Gas Chromatograph - Mass Spectrometer) y el programa Matlab Titulació: Enginyeria en Automàtica i Electrònica Industrial AUTOR: Iñigo Gorostiaga Maguregui DIRECTOR: Jesús Brezmes Llecha DATA: Julio 2004

Upload: vokien

Post on 12-Oct-2018

213 views

Category:

Documents


0 download

TRANSCRIPT

Interfase de datos entre un analizador GC-MS (Gas Chromatograph - Mass Spectrometer) y el programa

Matlab

Titulació: Enginyeria en Automàtica i Electrònica Industrial

AUTOR: Iñigo Gorostiaga Maguregui

DIRECTOR: Jesús Brezmes Llecha

DATA: Julio 2004

Indice

1 INTRODUCCIÓN...................................................................................... 5

1.1 Antecedentes. ...................................................................................................................... 5

1.2 Objetivos ........................................................................................................................... 10

2 ARQUITECTURA DEL SOFTWARE. .................................................... 13

2.1 Esquema general de la arquitectura del software............................................................ 13

2.2 ¿Qué es COM y Automatización? .................................................................................... 15 2.2.1 COM......................................................................................................................... 15 2.2.2 Orientación a Objetos y COM.................................................................................... 16 2.2.3 Automatización. ........................................................................................................ 17

2.3 Interfaz de automatización del GCMSSolution. .............................................................. 19 2.3.1 Jerarquía de objetos. .................................................................................................. 19 2.3.2 Descripción de los objetos. ........................................................................................ 22 2.3.3 Acceso desde Visual Basic a la Interfaz de Automatización del GCMSsolution. ......... 37

2.4 Interfaz de Comunicación de MATLAB. ......................................................................... 45 2.4.1 Introducción. ............................................................................................................. 45 2.4.2 MATLAB como Servidor de Automatización. ........................................................... 46

2.4.2.1 Método Execute: .................................................................................................... 47 2.4.2.2 Método GetFullMatrix............................................................................................ 48 2.4.2.3 Método PutFullMatrix. ........................................................................................... 49

2.5 Interfaz de comunicación con el sistema operativo. ......................................................... 51

2.6 Programa IDAMAT. ........................................................................................................ 52 2.6.1 Introducción. ............................................................................................................. 52 2.6.2 Interfaz gráfica. ......................................................................................................... 56

2.6.2.1 Pantalla de inicio. ................................................................................................... 56 2.6.2.2 Pantalla para crear ficheros de texto. ....................................................................... 57 2.6.2.3 Pantalla para crear gráficos 3D................................................................................ 58 2.6.2.4 Pantalla para calcular PCA’s. .................................................................................. 59

2.6.3 Descripción del Programa.......................................................................................... 62 2.6.3.1 Introducción. .......................................................................................................... 62 2.6.3.2 Módulo de Código del Formulario de Gráficos........................................................ 63 2.6.3.3 Módulo de Código del Formulario de Texto. ........................................................... 66 2.6.3.4 Módulo de Código del Formulario de PCA’s........................................................... 77

2.7 Funciones de MATLAB.................................................................................................. 105 2.7.1 Función ObtenerDesplazamiento ............................................................................. 105 2.7.2 Función quitaceros .................................................................................................. 106

3 APLICACIÓN EJEMPLO. .................................................................... 107

4 CONCLUSIONES................................................................................. 116

4.1 Evaluación de los objetivos conseguidos......................................................................... 116

4.2 Posibilidades de mejora.................................................................................................. 117

ANEXO A: ESPECTROMETRÍA MASAS-CROMATOGRAFÍA GASES... 121

ANEXO B: LISTADO DEL PROGRAMA................................................... 129

ANEXO C: COMUNICACIÓN COM Y MATLAB. ...................................... 229

ANEXO D: FUNCIONES DE SOPORTE EN MATLAB. ............................ 241

ANEXO E: MANUAL DE USUARIO. ......................................................... 247

BIBLIOGRAFÍA. ........................................................................................ 275

1. Introducción.

5

1 Introducción.

1.1 Antecedentes.

El grupo de investigación de sensores de gases y nariz electrónica del departamento de ingeniería electrónica, eléctrica y automática de la “Universitat Rovira i Virgili” adquirió, hace algún tiempo, un analizador de espectrometría de masas y cromatografía de gases (GC-MS). El objetivo de esta adquisición era continuar con la línea de investigación prevista por el grupo. Concretamente se adquirió un sistema QP-5000 GCMS de la marca japonesa SHIMADZU.

Este sistema permite realizar análisis de espectrometría y cromatografía de gases. Está provisto de un software constituido por varios programas que permiten realizar, entre otras, las funciones de adquisición y presentación de los datos.

La línea de investigación iniciada por el grupo implica numerosas técnicas de tratamiento y procesado de señales por lo que se requiere un acceso sencillo y flexible a todos los datos obtenidos por el sistema de análisis. Enseguida se pusieron de manifiesto las limitaciones del software propio del GCMS para las necesidades del proyecto de investigación. La herramienta de que dispone este software para exportar los datos obtenidos de los análisis es insuficiente ya que no se pueden exportar todos los datos recopilados en los análisis.

Otro problema añadido al anterior consistió en que la marca SHIMADZU es japonesa y no tiene una sede oficial en España sino una empresa que la representa (IZASA). El servicio técnico proporcionado por esta empresa no satisfizo las necesidades del grupo de investigación y no fue capaz de proporcionar una herramienta informática que solventara las carencias del software del sistema de análisis.

Finalmente la limitación del software del equipo QP-5000 GCMS en cuanto a flexibilidad de operar con los datos y la falta de soporte técnico por parte del fabricante a la hora de proporcionar otras soluciones alternativas pusieron de manifiesto la necesidad de buscar una solución por parte de la universidad. Por este motivo se tomó la decisión de asignar esta tarea a un estudiante en concepto de proyecto final de carrera.

El proyecto de final de carrera consistiría en realizar un programa en un leguaje de alto nivel y de entorno gráfico que tuviera como objetivo la comunicación con el software propio del sistema de análisis y el acceso a la totalidad de información obtenida en los análisis de cromatografía y espectrometría realizados. Además, el programa debería disponer de herramientas que facilitaran el trabajo del personal de la universidad que llevarse a cabo las investigaciones y trabajos con el sistema de análisis adquirido. Finalmente se definieron un conjunto de características que debía cumplir el programa que se iba a desarrollar así como los objetivos que se debían alcanzar en el proyecto de final de carrera.

1.Introducción.

6

Profundizando más en las necesidades por las que el grupo de investigación deseaba obtener todos los datos de los análisis hay que destacar que la intención era introducir una innovación en el tratamiento de los datos del GCMS.

Hasta la fecha se aplicaban algoritmos de tratamiento de datos a un cromatograma o a un espectrograma.

Un cromatográma es un gráfico de 2 dimensiones en el que se representa el TIC (Total Ion Chromatography) en función del tiempo. El TIC mide el número de impactos detectados de todas las masas en un instante de análisis determinado. Es la intensidad total detectada para un instante de tiempo. La información de un TIC constituye una matriz de 2 dimensiones. En la figura 1.1 se puede observar un ejemplo de un TIC:

Figura 1.1. Ejemplo de un cromatograma.

Un espectrograma es un gráfico en el que se representa la intensidad (número de impactos detectados por el GCMS) en función de la masa. Por lo tanto, el espectrograma da información sobre la cantidad detectada de cada masa (que es indicativa de un compuesto químico determinado). El espectrograma corresponde a un instante determinado de tiempo de análisis. Normalmente se calcula un espectrograma calculando la media de todos los espectrogramas obtenidos durante el tiempo de análisis. Sobre este “espectrograma promedio” se aplican los algoritmos de tratamiento de datos que se desee. La figura 1.2 es un ejemplo de un espectrograma:

Figura 1.2. Ejemplo de un espectrograma.

1.Introducción.

7

Se puede intuir que tanto en el cromatograma como en el espectrograma se pierde información del análisis realizado. El cromatograma muestra el TIC, que es la suma de las intensidades de las masas. Por lo tanto la información de la intensidad en función de la masa se pierde. A su vez, el espectrograma muestra intensidad en función de las masas. Al obtener el “espectrograma medio” se pierde la información temporal de los datos.

Por estos motivos la intención del grupo de investigación es aplicar los algoritmos a los datos de todos los espectrogramas obtenidos en un análisis. De esta forma no se pierde la información temporal que varía en función de la sustancia que se analice.

El GCMSSolutions permite extraer a un fichero de texto los datos de cromatografía o el “espectrograma medio” de un análisis determinado. Sin embargo, no existe la opción de extraer los datos de los espectrogramas para cada instante de tiempo. Por este motivo, uno de los principales objetivos de este proyecto consistía en acceder a todos los datos de los análisis y contruir el espacio 3D: Intensidad-Masa-Tiempo .Finalmente, sobre esta información 3D, se aplicarían diferentes algoritmos de tratamiento de datos y se podría comprobar si, efectivamente, los resultados obtenidos mejoran con respecto a los obtenidos de aplicar los algoritmos a los datos de dos dimensiones (Intensidad-Masa y Intensidad-Tiempo).

En la figura 1.3 se puede observar el espacio 3D INTENSIDAD-MASA-TIEMPO construido por el programa desarrollado en este proyecto:

Figura 1.3. Espacio 3D (INTENSIDAD-MASA-TIEMPO)..

1.Introducción.

8

En la figura 1.4 se muestra el espacio 3D anterior visto desde la perspectiva del eje tiempo. Lo que se aprecia son los cromatogramas específicos de cada masa superpuestos. En general, la forma del gráfico se parece al cromatograma general.

Figura 1.4. Espacio 3D visto desde el eje tiempo.

1.Introducción.

9

En la figura 1.5 se puede observar el espacio 3D anterior visto desde el eje de las masas. Se estaría viendo todos los espectrogramas superpuestos (uno por cada scan o tiempo de análisis). Se puede apreciar que la figura se parece a un espectrograma.

Figura 1.5. Espacio 3D visto desde el eje masas.

En esta memoria se describe la solución desarrollada finalmente para solventar la problemática descrita anteriormente. También se muestran resultados preeliminares obtenidos para demostrar que los primeros indicios conducen a un acierto en la línea de investigación iniciada por el grupo de sensores de gases.

1.Introducción.

10

1.2 Objetivos

El primer y más importante objetivo que debe cumplir el programa desarrollado en este proyecto es conseguir la comunicación con el software propio del analizador GCMS. El programa debe ser capaz de acceder a todos los datos de interés obtenidos en los análisis realizados por el GCMS. El software del analizador está provisto de una interfaz de automatización que permite la comunicación y el acceso a los datos. El fabricante del sistema proporciona un documento que describe la estructura de esta interfaz de comunicación pero la información que contiene es escasa e insuficiente. Una pequeña parte del documento presentaba información en inglés mientras que el resto estaba escrito en japonés. Por este motivo durante el desarrollo del proyecto se ha tenido que recurrir al método de prueba y error. De esta forma se ha ido deduciendo muchos aspectos de la estructura del programa.

El programa debe cumplir un requisito importante que consiste en disponer de una interfaz gráfica sencilla e intuitiva para el usuario. Por este motivo se decidió en un principio utilizar el lenguaje Visual Basic 6.0 para la realización del programa. Este lenguaje permite diseñar programas con una interfaz gráfica de entorno windows que resulte familiar y cómoda para el usuario. Toda la interfaz se desarrolló pensando en crear un entorno intuitivo de forma que fuera sencillo aprender a manejar el programa prácticamente sin necesidad de recurrir a ayuda o instrucciones. Este aspecto del programa se pudo comprobar posteriormente que cumplía satisfactoriamente este requisito gracias a las pruebas que se hicieron con el usuario final y al “feedback” proporcionado por éste.

Otro objetivo a lograr para que el proyecto fuera realmente útil pasaba por contar con la capacidad de gestionar los datos obtenidos de una forma cómoda. Por este motivo en un inicio se dotó al programa con la capacidad de generar ficheros de texto con el formato deseado con los datos obtenidos de los análisis. La intención era poder leer los datos de estos ficheros en cualquier programa de análisis y más concretamente en Matlab ya que soporta sin problemas el formato texto. Se creó una pantalla donde introduciendo unos parámetros que determinan los datos deseados se pueden generar un fichero de texto.. Posteriormente se descubrió la posibilidad de mejorar esta manera de gestionar los datos. Concretamente se descubrió la posibilidad de colocar los datos del software del GCMS directamente en un workspace de Matlab, es decir, en una zona de memoria del programa Matlab de forma que los datos quedaban guardados en el formato de este programa y por lo tanto resultaba mucho más sencillo todo tipo de tratamiento matemático y herramientas de que dispone este programa. Este aspecto supuso una mejora considerable del programa ya que se eliminaban pasos intermedios de traslado de datos que debía realizar el usuario final para poder realizar el tratamiento deseado.

El programa también debe proporcionar un mecanismo de visualización de los datos. Por este motivo se dotó al programa de una herramienta para poder obtener los datos de los análisis y representarlos en gráficas de 3 dimensiones, ya que los datos proporcionados por el GCMS están relacionados en matrices de tres dimensiones. Para conseguir la representación de los datos en unos ejes de 3 dimensiones se utiliza la herramienta gráfica del Matlab. Esta herramienta ha resultado ser muy potente y útil ya que su utilización supone una optimización de todo el proceso de obtención de datos y posterior tratamiento. El motivo de esto es que la herramienta permite anticiparse desde un principio y comprobar en qué zona del lugar se encuentran los datos de interés. Debido a esto se puede

1.Introducción.

11

reducir la cantidad de datos con los que se va a trabajar eliminando aquellos que no aportan ninguna información. Así, el tiempo de cálculo al aplicar los algoritmos que se quieran aplicar posteriormente se reduce considerablemente.

Los objetivos del proyecto se describen en el siguiente gráfico.

Figura 1.4. Gráfico sinóptico.

GCMSSolution

Medidas con GC-MS.

IDAMAT

(Extracción y gestión de los

datos 3D)

Ficheros encriptados en formato *.qgd

Ficheros en formato *. txt o *.mat

MATLAB (procesado de

datos 3D)

Objetivo del proyecto

2. Arquitectura del Software..

13

2 Arquitectura del Software.

En este apartado se van a describir con detalle todos los aspectos del software desarrollado. En el proyecto se ha trabajado con 3 programas diferentes: MATLAB, GCMSSolution (el propio del analizador) y el programa desarrollado en Visual Basic IDAMAT. Se explicará la relación entre los programas así como el flujo de información que circula entre ellos.

2.1 Esquema general de la arquitectura del software.

En la figura 2.1 se puede ver un esquema general de la organización del software que implica el proyecto.

Figura 2.1. Esquema general de arquitectura del software.

El diagrama anterior explica de forma sencilla e intuitiva la relación que hay entre los diferentes programas y la información que se pasan entre ellos.

El programa IDAMAT es el que el usuario utiliza directamente. Muestra la interfaz gráfica con la que el usuario va a interactuar. A través de ella el usuario podrá introducir los rangos de los datos que desea obtener, qué tipo de datos quiere, en que formato los necesita...

Matrices de datos

Interacción entre el usuario y el software.

Solicitación de información

Gráficos 3D

cálculos

Datos de los análisis

GCMSSolution

(software propio del analizador)

MATLAB (herramientas gráficas y de

cálculo)

IDAMAT

(programa desarrollado en Visual Basic 6.0)

USUARIO

Ficheros de texto

2. Arquitectura del Software..

14

El programa IDAMAT es el centro de toda la arquitectura del software. Es quien se encarga de crear los objetos que constituirán la interfaz de comunicación con el resto de programas (MATLAB y GCMSSolution). Una vez creados los objetos de automatización1 que permiten la comunicación entre IDAMAT y los otros programas se puede solicitar la información que se necesita. A través de la interfaz gráfica el usuario habrá definido los parámetros (rangos, alineamiento, intensidades relativas...), entonces generará un evento, como por ejemplo pulsar un botón, que será la orden para que el programa inicie una serie de acciones que lleven a la construcción de, por ejemplo, una matriz con los datos de espectrometría. Durante la ejecución del programa se “pregunta” al software del GCMS por los datos necesarios para construir las estructuras de datos que se solicitan.

El programa MATLAB tiene un papel muy importante en la arquitectura. Supone un soporte de almacenamiento de datos ya que se pueden guardar en un workspace. También pone a disposición del programa IDAMAT sus herramientas gráficas. Las matrices de datos de los análisis de las sustancias se llevan a un workspace de MATLAB allí se ejecutan funciones gráficas y se generan gráficos 3D. Cuando el usuario pulse el botón de generar un gráfico 3D de una sustancia determinada verá aparecer una ventana de figura de MATLAB con los datos de los análisis en un eje de 3 dimensiones.

MATLAB también pone a disposición sus herramientas de cálculo y funciones matemáticas. Por ejemplo, el proceso de realizar el alineamiento de datos implica el enviar datos de análisis de cromatografía al workspace de MATLAB. Posteriormente se utiliza la función de correlaciones cruzadas crosscorr para obtener los desplazamientos de cada una de las sustancias con respecto a una sustancia seleccionada como referencia. Una vez obtenida esta información se envía de vuelta al programa IDAMAT para que se pueda construir

La comunicación con el GCMSSolution es posible gracias a que este programa esta preparado para comunicación COM. El GCMSSolution está provisto de una interfaz de comunicación que se muestra a otros programas para que estos puedan solicitar la información que necesitan. Esta interfaz se describe detalladamente en apartados posteriores.

La comunicación con MATLAB se realiza de manera similar. MATLAB está provisto de una interfaz de Automatización. Gracias a ello se dispone de un workspace temporal y el programa IDAMAT puede comunicarse con MATLAB con una serie de comandos definidos por esta interfaz de automatización.

El programa IDAMAT también utiliza la automatización que le proporciona VBScript (Microsoft Visual Basic Scripting Edition). Es el miembro más reciente de la familia de lenguajes de programación Visual Basic, suministra una automatización activa a una amplia variedad de entornos, incluidas las secuencias de comandos del cliente de Web en Microsoft Internet Explorer y las secuencias de comandos del servidor de Web en Microsoft Internet Information Server. En el caso del programa IDAMAT se utiliza esta herramienta para comunicarse con el sistema operativo y crear los ficheros de texto con los datos de las sustancias analizadas. También se utiliza VBScript para obtener información de las carpetas, nombres de los archivos de una carpeta, número de archivos de una carpeta, path completo de un archivo y una serie de datos que permiten desarrollar una interfaz gráfica mucho más cómoda para el usuario.

1. Automatización es un protocolo estándar de comunicación entre programas. Ver anéxo C.

2. Arquitectura del Software..

15

2.2 ¿Qué es COM y Automatización?

Con la tecnología COM, Microsoft pretende que el usuario dé un gran paso hacia adelante en la creación de los mejores paquetes software. El mejor paquete de software es, sin duda, el que sea más fiable y efectivo. Y además, ha de ofrecer soluciones a problemas que antes era imposible resolver.

2.2.1 COM.

Para ver qué es COM, vamos a hacernos antes la siguiente pregunta: ¿cómo pueden diferentes pedazos de software ("chunks") acceder entre sí a los distintos servicios que proporcionan?

Hasta ahora, la respuesta es clara: depende de qué tipo de software se trate. Es decir, una aplicación podría acceder a los servicios que le proporciona una librería enlazándose a ella, y llamando a alguna de sus rutinas. O bien, una aplicación puede acceder a los servicios de otra que se encuentra en un proceso diferente, para lo cual, se debe acudir a alguno de los diferentes mecanismos de comunicación entre procesos (IPC, "Interprocess Communications"). Un tercer tipo sería el acceso a los servicios del propio sistema operativo. O bien, una aplicación puede requerir los servicios de otra que se encuentra en otra máquina completamente diferente, accesible a través de la red.

La necesidad fundamental es la misma: acceder a los servicios de un determinado software. Sin embargo, el mecanismo difiere. ¿No sería mucho mejor definir un modo unificado de acceder a cualquier servicio de un determinado software, sin importarnos cómo se proporcionan?

Esto es lo que hace COM: Define un estándar mediante el cual un trozo de código proporciona sus servicios a otro, y que funciona en todos los casos a los que anteriormente nos hemos referido.

Mediante COM, un trozo de código expone sus servicios a través de uno o más objetos COM. Cada objeto COM soporta uno o más interfaces, cada uno de los cuales incluye un determinado número de métodos. Los clientes de un objeto COM pueden acceder a sus servicios invocando a alguno de los métodos definidos en alguno de sus interfaces, no pudiendo acceder directamente a los datos de dicho objeto. La mayoría de los objetos COM soportan más de un interfaz. El objeto en sí se implementa siempre dentro de un servidor, que puede ser bien una DLL o un EXE.

Para invocar a los métodos de un interfaz de un objeto COM, el cliente debe adquirir un puntero a ese interfaz.

Cada objeto COM es una instancia de una determinada clase. Es por tanto necesario conocer la clase a la que pertenece un objeto si es que queremos ejecutar una determinada instancia del mismo (lo cual podemos hacer con la librería COM). Esta librería está presente en cada sistema que soporta COM, y que tiene acceso a un directorio en el cual se encuentran todas las clases de objetos COM que se hayan en el sistema. El cliente llamaría a una función de la librería COM especificando la clase de objeto COM que queremos instanciar, y el primero de los interfaces del cual queremos un puntero.

La librería COM proporciona estos servicios a través de funciones, y no a través de métodos en interfaces COM.

2. Arquitectura del Software..

16

Una vez que el cliente tiene un puntero a uno de los interfaces, puede preguntar al objeto en cuestión acerca del resto de los interfaces que éste expone (a modo de punteros, se entiende). Así, podemos llamar a los métodos de ese interfaz como si de una función cualquiera se tratara, con la diferencia de que no tenemos que preocuparnos acerca de dónde se está ejecutando ese código, porque todo es accesible del mismo modo.

2.2.2 Orientación a Objetos y COM.

Un objeto no es más que una combinación de datos y métodos. Los objetos son una idea central en COM. Pero el modo en que COM expone y usa sus objetos difiere del modo en que se hace en otra serie de tecnologías quizás más conocidas.

Una de las principales diferencias es que los objetos COM exponen más de un interfaz (Java también lo permite), y la mayoría de las tecnologías orientadas a objetos sólo uno por objeto.

En COM, una clase define una implementación particular de un conjunto de interfaces. De hecho, dos clases distintas pueden exponer, por ejemplo, diferentes implementaciones del mismo conjunto de interfaces. El cómo estén implementados esos interfaces, que es lo que la clase define, no es materia del cliente. La habilidad de trabajar del mismo modo con diferentes tipos de objetos, soportando cada uno el mismo conjunto de interfaces es lo que se llama polimorfismo. Pues bien, COM soporta polimorfismo.

En cuanto a la herencia, tenemos que distinguir entre herencia de la implementación, y herencia de interfaces. En la herencia de interfaces, lo que se hereda es la definición de los mismos, y no su implementación: el objeto hijo ha de proveer la implementación. C++ proporciona los dos tipos de herencia; COM sólo la de interfaces. La razón se haya en que de este modo, es imposible que se pueda romper la encapsulación del objeto padre, ya que cuando se hereda la implementación se conocen los detalles del objeto padre. Claro que si no heredamos la encapsulación, la pregunta es: ¿cómo puede un objeto COM reutilizar el código que expone otro objeto? La respuesta es: mediante agregación y contención. Mediante la contención, un objeto simplemente llama a otro cuando lo necesita; con agregación, un objeto presenta uno o más de los interfaces de otro objeto como si fueran suyos; lo que un cliente ve como un único objeto que proporciona un conjunto de interfaces es en realidad dos o más objetos agregados.

Las tecnologías orientadas a objetos tradicionales presentan tres obstáculos a la hora de crear lo que podemos denominar un mercado de componentes software:

1. Distribución de objetos con el código fuente, debido a la posible incompatibilidad binaria de los mismos.

2. Es difícil la reutilización de objetos entre diferentes lenguajes.

3. Necesidad de volver a recompilar la aplicación si algún componente se modifica.

Estos tres problemas tienen solución en COM: los objetos COM pueden empaquetarse en librerías o ejecutables, y pueden ser distribuidos en formato binario sin necesidad de distribuir el código fuente. Esto es así porque COM define un mecanismo estándar de acceso a los componentes software binarios; por tanto, pueden desarrollarse con un determinado lenguaje, y utilizarse con otro. Como los objetos COM se instancian a

2. Arquitectura del Software..

17

medida que se necesitan, cuando una nueva versión se instala en el sistema, todos los clientes obtendrán automáticamente la nueva versión del componente la siguiente vez que lo necesiten.

Lo que se pretende es constituir un gran mercado de componentes software basados en COM y fácilmente reutilizables.

Entre los principales beneficios de COM se hayan:

1. las ventajas que ofrece la orientación a objetos.

La consistencia.

2. La independencia del lenguaje.

3. El versionamiento simple y eficiente.

4. COM se encontrará disponible en diferentes sistema operativos (ya lo está en los sistemas operativos de Microsoft).

2.2.3 Automatización.

La Automatización (antes denominada Automatización OLE) permite a las aplicaciones utilizar objetos implementados en otras aplicaciones o exponer objetos de forma que puedan utilizarlos otras aplicaciones.

Un servidor de automatización es una aplicación (un tipo de servidor COM) que expone su funcionalidad a otras aplicaciones mediante interfaces COM, denominadas clientes de automatización. Esto permite automatizar determinadas funciones en los clientes de automatización mediante el acceso directo a objetos y el uso de los servicios que estos objetos proporcionan.

Los servidores y los clientes de automatización utilizan interfaces COM que se derivan siempre de IDispatch y que toman y devuelven un conjunto de tipos de datos específicos denominados tipos de automatización. Puede automatizar cualquier objeto que expone una interfaz de automatización que proporciona métodos y propiedades a las que se puede tener acceso desde otras aplicaciones. La Automatización está disponible tanto para objetos OLE como para objetos COM. El objeto automatizado puede ser local o remoto (puede estar en otro equipo accesible a través de la red); por lo tanto, hay dos categorías de automatización:

Automatización (local).

Automatización remota (a través de una red, mediante COM distribuido o DCOM).

La exposición de objetos es beneficiosa si las aplicaciones proporcionan funcionalidad útil para otras aplicaciones. Por ejemplo, un control ActiveX es un tipo de servidor de automatización; la aplicación que aloja el control ActiveX es el cliente de automatización del control.

Análogamente, un procesador de textos podría exponer su funcionalidad de corrección ortográfica a otros programas. La exposición de objetos permite a los

2. Arquitectura del Software..

18

proveedores mejorar sus aplicaciones por medio de funcionalidad ya programada de otras aplicaciones. De esta manera, la Automatización aplica a las aplicaciones algunos principios de la programación orientada a objetos, como la reutilización y la encapsulación.

Otro factor aún más importante es la compatibilidad que la Automatización proporciona a los proveedores de soluciones y usuarios. La Automatización, como expone la funcionalidad de una aplicación mediante una interfaz común y bien definida, permite generar soluciones completas con un único lenguaje de programación general, como Microsoft Visual Basic, y evita así la necesidad de utilizar varios lenguajes de macros específicos de la aplicación.

Muchas aplicaciones comerciales, como Microsoft Excel y Microsoft Visual C++, permiten automatizar gran parte de su funcionalidad. Por ejemplo, en Visual C++ puede escribir macros de VBScript para automatizar el proceso de generación, algunos aspectos de la edición de código o las tareas de depuración.

2. Arquitectura del Software..

19

2.3 Interfaz de automatización del GCMSSolution.

2.3.1 Jerarquía de objetos.

El software del analizador QP-5000-GCMS de Shimadzu incorpora una interfaz de Automatización. Esta interfaz de comunicación consiste en una jerarquía de objetos con propiedades y métodos que permiten acceder a información contenida en los ficheros de datos de extensión *.qgd. No toda la información del GCMSSolution estará disponible a través de esta interfaz. Solamente aquella información que el fabricante desea que sea accesible por otros usuarios será “visible” para el programador que acceda a ellos a través de la interfaz.

El fabricante del GCMS proporciona un manual en el que se explica la jerarquía de objetos de la interfaz. Pero la información descrita en el manual es insuficiente o, al menos, muy difícil de descifrar ya que en su mayoría está escrita en japonés. Por este motivo se ha ido descifrando más o menos, mediante pruebas, cómo obtener la información que se necesitaba del GCMSSolution. La información obtenida acerca de los objetos y propiedades que se han utilizado en este proyecto para adquirir los datos que se necesitaban se describen en este apartado.

La interfaz de Automatización del GCMSSolution está compuesta por 5 objetos principales:

1. Data File Object (Objeto de fichero de datos).

2. Method File Object (Objeto de fichero de método).

3. Batch File Object ( Objeto de fichero de carga)

4. GCMS Real Time Analysis Object (Objeto de análisis en tiempo real del GCMS)..

5. GCMS Postrun Analysis Object (Objeto de análisis del Postrun del GCMS)

El Data File Object es el que contiene la mayor parte de la información referente a los análisis realizados. Contiene información acerca de los análisis de cromatrografía, espectrometría, curvas de calibración del equipo...

El Method File Object contiene información acerca de parámetros referentes a métodos de análisis empleados con el GCMS.

El Batch File Object proporciona la información relacionada con los datos que se pueden exportar a través del GCMSSolution.

El objeto GCMS Real Time Analysis Object proporciona información acerca de los parámetros relacionados con la adquisición de datos en tiempo real.

Finalmente el GCMS Postrun Analysis Object tiene información sobre cómo guardar ficheros de datos.

En la figura 2.2 se muestra de forma esquemática cada uno de estos objetos principales y los nombres de los diferentes objetos que se incluyen dentro de los primeros.

2. Arquitectura del Software..

20

Figura 2.2. Jerarquía de objetos de la interfaz de automatización del GCMSSolution.

GCMSFileObj.Data

MSSampleInformation

MSPeakTable (Qualitative Peak Table)

MSPeakTable

SpectrumProcessTable

SpectrumProcessData

SimilaritySearchResults

SimilaritySearchData

MSColumnPerformanceTable

MSColumnPerformanceData

MSCompoundTable

MSCompoundResult

MSCalibrationCurve

ReferenceIonRatio

MSPeakTable

MSPeakData

SimilaritySearchResults

SimilaritySearchData

MSGroupingTable

MSGroupingResult

MSRawData

MSChromatogram

MSSpectrum

MS3DData

2. Arquitectura del Software..

21

Figura 2.2. Jerarquía de objetos de la interfaz de automatización del GCMSSolution (continuación).

GCMSFileObj.Method

GCParameters

MSParameters

MSTableData

AOCParameters

GCMSFileObj.Batch

MSBatchTable

MSBatchData

GCMSAppObj.RealTime

MSBatchTable

MSBatchData

MSBatchProcessing

GCMSInstrumentMonitor

GCMSAcquisitionMonitor

MSRealTimeData

GCMSSingleRun

GCMSAppObj.Postrun

MSBatchProcessing

2. Arquitectura del Software..

22

El primer objeto de la figura 2.2, Data File Object, que se muestra coloreado es el que ha proporcionado la información necesaria para realizar este proyecto. Dentro de este objeto principal se encuentra el objeto MSRawData. Este objeto contiene una serie de métodos que sirven para cargar la información relacionada con los análisis de espectrometría y cromatografía en otros objetos COM. Estos últimos objetos que pertenecen a un tercer nivel dentro de la jerarquía son los que contienen los datos específicos de las sustancias analizadas.

2.3.2 Descripción de los objetos.

A continuación se muestra la información sobre estos objetos obtenida a partir del manual proporcionado por el fabricante y completado con explicaciones gracias a la experiencia obtenida al desarrollar el programa IDAMAT:

• Objeto GCMSFileObj.Data

Este es el objeto principal de datos que proporciona la interfaz de Automatización del GCMSSolution. Entre las propiedades de este objeto se encuentra otro objeto: MSRawdata.

• Propiedades:

MSRawData

Definición:

LPDISPATCH MSRawData

Valor de la propiedad:

MSRawDataObject

Descripción:

Este objeto es una propiedad del objeto superior en la jerarquía: GCMSFileObj.Data. Es como si fuera una variable que pertenece al objeto principal y que es visible al programador que contacta con la interfaz.

• Métodos:

LoadFile

Definición:

long LoadFile(LPCTSTR lpszFile, short IsReadOnly)

Parámetros:

lpszFile: este parámetro es el nombre del archivo *.qgd del cual se desean obtener los datos. Si el fichero en concreto se llama 09A2.qgd el valor de este parámetro debería ser “...path completo...\09A2.qgd”.

IsReadOnly: este parámetro sólo indica si el objeto de datos COM que se va a crear será de lectura. En el programa IDAMAT se ha dado el valor 1 a este parámetro, es decir, se crea el objeto de sólo lectura.

Valores de retorno:

2. Arquitectura del Software..

23

Al ejecutar este método se devuelve un valor de retorno. Este valor puede ser 0, 1 o -1. Si el método devuelve 1 quiere decir que la acción se ha ejecutado correctamente.

Observaciones: Para poder obtener el objeto MSRawData es necesario ejecutar el método LoadFile. Cuando se ordena ejecutar este método se creará el objeto MSRawData y se podrá acceder a los datos que guarda.

• Objeto MSRawData.

Este objeto contiene una serie de métodos que proporcionan la información de los análisis realizados. Para poder crear este objeto se debe ejecutar el método LoadFile visto anteriormente.

• Métodos:

GetTIC

Definición:

LPDISPATCH GetTIC (long lGroup)

Parámetros:

lGroup: es un número que puede tener un valor entre 1 y 64. Exactamente no se ha podido averiguar el significado de este parámetro pero con el valor 1 se obtienen los datos correctamente.

Valor de retorno:

Cuando se ejecuta este método la variable devuelta es un objeto, MSChromatogramObject.

Observaciones:

En el lenguaje de programación que se utilice para comunicarse con la interfaz del GCMSSolution se deberá haber creado una variable de tipo objeto donde se guardará el objeto MSChromatogram devuelto por este método.

GetMIC

Definición:

LPDISPATCH GetMIC (long lGroup, long lIndex)

Parámetros:

lGroup: es un número que puede tener un valor entre 1 y 64. Exactamente no se ha podido averiguar el significado de este parámetro pero con el valor 1 se obtienen los datos correctamente.

lIndex: a este parámetro se le puede asignar valores entre 1 y 8. No se ha podido averiguar la finalidad de este parámetro.

Valor de retorno:

Cuando se ejecuta este método la variable devuelta es un objeto, MSChromatogramObject.

Observaciones:

2. Arquitectura del Software..

24

En el lenguaje de programación que se utilice para comunicarse con la interfaz del GCMSSolution se deberá haber creado una variable de tipo objeto donde se guardará el objeto MSChromatogram devuelto por este método. Este método no se ha utilizado en el programa IDAMAT ya que el objeto MSChromatogramObject se obtiene a través del método GetTIC y es suficiente para obtener los datos de cromatografía que se necesitan.

GetMC

Definición:

LPDISPATCH GetMC (long lGroup, long lMz)

Parámetros:

lGroup: es un número que puede tener un valor entre 1 y 64. Exactamente no se ha podido averiguar el significado de este parámetro pero con el valor 1 se obtienen los datos correctamente.

lMz: a este parámetro se le puede asignar valores de u.m.a con una resolución máxima de 0.05 u.m.a.. No se ha podido averiguar la finalidad de este parámetro.

Valor de retorno:

Cuando se ejecuta este método la variable devuelta es un objeto, MSChromatogramObject.

Observaciones:

En el lenguaje de programación que se utilice para comunicarse con la interfaz del GCMSSolution se deberá haber creado una variable de tipo objeto donde se guardará el objeto MSChromatogram devuelto por este método. Este método no se ha utilizado en el programa IDAMAT ya que el objeto MSChromatogramObject se obtiene a través del método GetTIC y es suficiente para obtener los datos de cromatografía que se necesitan.

GetSpectrum

Definición:

LPDISPATCH GetSpectrum (long lRT, long lBackRT)

Parámetros:

lRT: es el valor del tiempo de retención para el espectro de masas del cual se desea obtener la información. Este valor se debe indicar en milisegundos.

lBackRT: a este parámetro se le deben asignar valores de tiempo en milisegundos, igual que el parámetro anterior. Se desconoce a qué se refiere este parámetro. Después de varias pruebas se descubrió que para el valor 0 se obtenían los datos correctamente. Así que este es el valor de este parámetro que se utiliza en el programa.

Valor de retorno:

Cuando se ejecuta este método la variable devuelta es un objeto, MSSpectrumObject..

Observaciones:

2. Arquitectura del Software..

25

En el lenguaje de programación que se utilice para comunicarse con la interfaz del GCMSSolution se deberá haber creado una variable de tipo objeto donde se guardará el objeto MSSpectrumObject devuelto por este método. Este método se ha utilizado en el programa IDAMAT para obtener el valor de la intensidad del pico base y poder así calcular las intensidades relativas.

GetAveSpectrum

Definición:

LPDISPATCH GetMSAveSpectrum (long lStartRT, long lEndRT, long lStartBackRT, long lEndBackRT)

Parámetros:

lStartRT: este parámetro hace referencia al valor inicial de un intervalo de tiempo de retención para el espectro de masas del cual se desea obtener la información. Este valor se debe indicar en milisegundos.

lEndRT: este parámetro hace referencia al valor final de un intervalo de tiempo de retención para el espectro de masas del cual se desea obtener la información. Este valor se debe indicar en milisegundos.

lStartBackRT: a este parámetro se le deben asignar valores de tiempo en milisegundos, igual que el parámetro anterior. Se desconoce a qué se refiere este parámetro. Debe de hacer referencia la valor inicial de un intervalo de tiempo.

lEndBackRT: a este parámetro se le deben asignar valores de tiempo en milisegundos, igual que el parámetro anterior. Se desconoce a qué se refiere este parámetro. Debe de hacer referencia la valor final de un intervalo de tiempo.

Valor de retorno:

Cuando se ejecuta este método la variable devuelta es un objeto, MSSpectrumObject..

Observaciones:

En el lenguaje de programación que se utilice para comunicarse con la interfaz del GCMSSolution se deberá haber creado una variable de tipo objeto donde se guardará el objeto MSSpectrumObject devuelto por este método. Este método no se ha utilizado en el programa IDAMAT ya que el objeto MSSpectrumObject se obtiene a través del método GetSpectrum y es suficiente para obtener los datos de espectrometría que se necesitan.

Get3DData

Definición:

LPDISPATCH Get3DData (long lGroup)

Parámetros:

lGroup: es un número que puede tener un valor entre 1 y 64. Exactamente no se ha podido averiguar el significado de este parámetro pero con el valor 1 se obtienen los datos correctamente.

2. Arquitectura del Software..

26

Valor de retorno:

Cuando se ejecuta este método la variable devuelta es un objeto, MS3DDataObject..

Observaciones:

En el lenguaje de programación que se utilice para comunicarse con la interfaz del GCMSSolution se deberá haber creado una variable de tipo objeto donde se guardará el objeto MS3DDataObject devuelto por este método. Este método se ha utilizado en el programa IDAMAT para obtener las intensidades de las masas.

• Objeto MSChromatogram.

Este objeto contiene un conjunto de propiedades que constituyen los datos relativos al análisis de cromatografía realizado. Para poder crear este objeto se debe ejecutar el método GetTIC visto anteriormente. La información que proporciona este objeto es de dos dimensiones: intensidad-tiempo.

• Propiedades:

Count

Definición:

Long Count

Valor de retorno:

Esta propiedad devuelve un valor de tipo long que es el número total de scans (instantes de análisis) que hay en todo el análisis de la cromatografía.

Observaciones:

El valor de Count es único para cada fichero de datos del GCMSSolutions (*.qgd). Este valor se utilizará posteriormente como parámetro para obtener otros datos de interés.

Intensity

Definición:

Long Intensity (long lIndex)

Parámetros:

lIndex: este parámetro define el índice del array donde se guardan todos los valores de TIC (Total Ion Chromatography) para cada instante de análisis (scan). Al especificar un valor determinado de lIndex se especifica el instante de análisis (scan) del que se quiere obtener el TIC. El valor puede variar de 1 hasta el valor de Count.

Valor de retorno:

Esta propiedad devuelve un valor de tipo long que es el valor de TIC (Total Ion Chromatography) para un instante de análisis determinado.

Observaciones:

2. Arquitectura del Software..

27

El conjunto de TIC’s de un cromatograma completo constituye un array. Se puede decir que este array tiene unas dimensiones de (1xCount). Donde Count varía en función de los parámetros del análisis.

MaxIntensity

Definición:

Long Intensity

Valor de retorno:

Esta propiedad devuelve un valor de tipo long que es el valor de la intensidad máxima registrada en los datos de la cromatografía. O, lo que es lo mismo, el máximo de la curva del TIC.

Observaciones:

Esta propiedad es un valor único para un archivo de datos *.qgd. En el caso del programa IDAMAT no se ha necesitado utilizar la información que proporciona esta propiedad.

Saturate

Definición:

Long Saturate

Valor de retorno:

Esta propiedad devuelve un valor de 0 si no hay saturación en el análisis.

Esta propiedad devuelve un valor de 1 si hay saturación en el análisis.

Observaciones:

Esta propiedad indica si ha habido saturación del GCMS, pero no indica el punto exacto (masa y tiempo) para el cual se ha producido la saturación. En el caso del programa IDAMAT no se ha necesitado utilizar la información que proporciona esta propiedad.

SaturateFlags

Definición:

Long SaturateFlags (long lIndex)

Parámetros:

lIndex: este parámetro es el índice de la matriz donde se guardan los TIC’s. En principio este valor coincide con el valor de scan.

Valor de retorno:

Esta propiedad devuelve un valor de 0 si no hay saturación en el análisis para un scan determinado.

Esta propiedad devuelve un valor de 1 si hay saturación en el análisis para un scan determinado.

2. Arquitectura del Software..

28

Observaciones:

En el caso del programa IDAMAT no se ha necesitado utilizar la información que proporciona esta propiedad.

Interval

Definición:

Long Interval

Valor de retorno:

Esta propiedad devuelve un valor en milisegundos correspondientes al valor del intervalo. El intervalo es el tiempo entre scans. Este valor se define en los parámetros de análisis antes de efectuarlo.

Observaciones:

El valor típico de intervalo que se utiliza para realizar los análisis es de 500 milisegundos. En el caso del programa IDAMAT se ha utilizado esta propiedad para calcular el RT (Retention Time) a partir del valor del intervalo y del valor de scan.

StartRT

Definición:

Long Interval

Valor de retorno:

Esta propiedad devuelve un valor en milisegundos correspondiente al valor del tiempo de inicio del análisis de cromatrografía. Este valor se define en los parámetros de análisis antes de iniciarlo.

Observaciones:

En el caso del programa IDAMAT se ha utilizado la esta propiedad para tenerla a modo de información.

EndRT

Definición:

Long EndRT

Valor de retorno:

Esta propiedad devuelve un valor en milisegundos correspondiente al valor del tiempo final del análisis de cromatrografía. Este valor se define en los parámetros de análisis antes de iniciarlo.

Observaciones:

En el caso del programa IDAMAT se ha utilizado la esta propiedad para guardarla a como información.

2. Arquitectura del Software..

29

• Objeto MSSpectrum.

Este objeto contiene un conjunto de propiedades que constituyen los datos relativos al análisis de espectrometría realizado. Para poder crear este objeto se debe ejecutar el método GetSpectrum visto anteriormente. El objeto MSSpectrum contendrá la información de un espectrograma correspondiente a un instante de tiempo determinado. Por lo tanto, la información proporcionada por este objeto será de dos dimensiones: intensidad-masa.

• Propiedades:

Count

Definición:

Long Count

Valor de retorno:

Esta propiedad devuelve un valor de tipo long que es el número de masas en las que se han detectado impactos en un espectro específico para un instante de análisis determinado.

Observaciones:

El valor de Count puede variar entre los espectrogramas de diferentes instantes de análisis. Este valor se utilizará posteriormente como parámetro para obtener otros datos de interés.

Mz

Definición:

Long Mz (long lIndex)

Parámetros:

lIndex: este parámetro define el índice del array donde se guardan todas las masas en las que se han detectado impactos en el GCMS para un espectrograma concreto. El valor puede variar de 1 a el valor de Count.

Valor de retorno:

Esta propiedad devuelve un valor de tipo long que es el valor de la masa registrada para un lIndex determinado.

Observaciones:

El conjunto de masas de un espectrograma de las cuales se ha detectado presencia en la sustancia analizada constituye un array. Se puede decir que este array tiene unas dimensiones de (1xCount). En este array solo se guardan los valores de las masas para las que se ha detectado un valor de intensidad diferente de cero o, lo que es lo mismo, las masas que ha detectado el analizador. Esta propiedad se ha utilizado en el programa IDAMAT para construir las matrices con la información de todos los espectros del análisis.

Intensity

Definición:

Long Intensity (long lIndex)

2. Arquitectura del Software..

30

Parámetros:

lIndex: este parámetro define el índice del array donde se guardan todas las intensidades que se han detectado en el GCMS para un espectrograma en un instante de análisis concreto. El valor puede variar de 1 a el valor de Count.

Valor de retorno:

Esta propiedad devuelve un valor de tipo long que es el valor de la intensidad registrada para una masa determinada determinada.

Observaciones:

El conjunto de intensidades de un espectrograma que se han detectado en la sustancia analizada constituye un array. Se puede decir que este array tiene unas dimensiones de (1xCount). En este array solo se guardan los valores de las intensidades detectadas. Esta propiedad se ha utilizado en el programa IDAMAT para construir las matrices con la información de todos los espectros del análisis.

BasePeakMz

Definición:

Long BasePeakMz

Valor de retorno:

Esta propiedad devuelve un valor de tipo long que corresponde a la masa en la que se encuentra el pico base.

Observaciones:

Esta propiedad no tiene parámetros. El objeto MSSpectrum hace referencia al espectrograma de masas de un scan determinado. Para un espectrograma habrá un único pico base por lo que esta propiedad es un valor único.

Esta propiedad se ha utilizado en el programa IDAMAT para construir las matrices con los valores de las intensidades relativas.

BasePeakIntensity

Definición:

Long BasePeakIntensity

Valor de retorno:

Esta propiedad devuelve un valor de tipo long que corresponde a la intensidad máxima detectada en un espectrograma de un scan concreto. Este pico de intensidad máxima es el pico base.

Observaciones:

Esta propiedad no tiene parámetros. El objeto MSSpectrum hace referencia al espectrograma de masas de un scan determinado. Para un espectrograma habrá un único pico base por lo que esta propiedad es un valor único.

Esta propiedad se ha utilizado en el programa IDAMAT para calcular los valores de intensidades relativas.

2. Arquitectura del Software..

31

Saturate

Definición:

Long Saturate

Valor de retorno:

Esta propiedad devuelve un valor de 0 si no hay saturación en el análisis.

Esta propiedad devuelve un valor de 1 si hay saturación en el análisis.

Observaciones:

Esta propiedad indica si ha habido saturación del analizador en un espectrograma concreto, pero no indica el punto exacto (masa) para el cual se ha producido la saturación. En el caso del programa IDAMAT no se ha necesitado utilizar la información que proporciona esta propiedad.

SaturateFlags

Definición:

Long SaturateFlags (long lIndex)

Parámetros:

lIndex: este parámetro es el índice de la matriz que contiene el SaturateFlag de cada masa que ha detectado el GCMS. Cada masa tiene su flag que indica si en la medida se ha saturado el GCMS o no.

Valor de retorno:

Esta propiedad devuelve un valor de 0 si no hay saturación en el análisis para una masa determinada.

Esta propiedad devuelve un valor de 1 si hay saturación en el análisis para un una masa determinada.

Observaciones:

En el caso del programa IDAMAT no se ha necesitado utilizar la información que proporciona esta propiedad.

2. Arquitectura del Software..

32

• Objeto MS3DData.

Este objeto contiene un conjunto de propiedades que son datos relativos a los análisis de espectrometría y cromatografía realizados. Para poder crear este objeto se debe ejecutar el método GetMS3DData visto anteriormente. El objeto MS3DData que se cree, contendrá toda la información relativa a la espectrometría para todos los instantes de tiempo de análisis. Por lo tanto, la información proporcionada por este objeto será de tres dimensiones: intensidad-masa-tiempo. En algunas propiedades habrá que indicar dos parámetros para obtener un valor.

• Propiedades:

ScanCount

Definición:

Long ScanCount

Valor de retorno:

Esta propiedad devuelve un valor de tipo long que es el número total de scans que hay en todo el análisis que se ha realizado a la muestra.

Observaciones:

El valor de ScanCount dependerá de los parámetros de análisis que se haya definido previamente. Será función del tiempo total de análisis y del intervalo seleccionado. Este valor se utilizará posteriormente como parámetro para obtener otros datos de interés.

SpectrumCount

Definición:

Long SpectrumCount (long lScan)

Parámetros:

lScan: este parámetro indica el número de scan. Para cada instante de análisis (scan) el valor de SpectrumCount será diferente. El valor lScan hace las funciones de índice de la matriz donde se guardan el valor de SpectrumCount de cada instante de análisis. El valor que se le puede dar a este parámetro puede oscilar entre 1 y ScanCount.

Valor de retorno:

Esta propiedad devuelve un valor de tipo long que es el número total de masas detectadas en la muestra analizada en un instante de tiempo determinado (lScan). Para un espectro determinado de masas se detectarán intensidades para unas masas concretas y este número se guarda en la propiedad SpectrumCount.

Observaciones:

El valor de SpectrumCount variará en función del espectro. Para cada instante de tiempo se obtiene un espectro y éste tendrá un número de SpectrumCount propio. Este valor se utilizará posteriormente como parámetro para obtener otros datos de interés.

2. Arquitectura del Software..

33

Mz

Definición:

Long Mz (long lScan, long lIndex)

Parámetros:

lScan: este parámetro indica el número de scan. El valor lScan hace las funciones de índice de la matriz donde se guarda el valor de las masas detectadas en un instante de análisis. El valor que se le puede dar a este parámetro puede oscilar entre 1 y ScanCount.

lIndex: con este parámetro se indica el índice de la matriz de masas detectadas dado un valor de scan. El valor de este parámetro puede variar entre 1 y SpectrumCount.

Valor de retorno:

Esta propiedad devuelve un valor de tipo long que es la masa detectada en la muestra analizada en un instante de tiempo determinado (lScan) y para un valor de lIndex concreto.

Observaciones:

El valor de SpectrumCount variará en función del espectro. Para cada instante de tiempo se obtiene un espectro y éste tendrá un número de SpectrumCount propio. Esta propiedad se ha utilizado en el programa IDAMAT para construir las matrices con los datos de espectrometría..

RT

Definición:

Long RT (long lScan, long lIndex)

Parámetros:

lScan: este parámetro indica el número de scan. El valor lScan hace las funciones de índice de la información referente al los tiempos de análisis. El valor que se le puede dar a este parámetro puede oscilar entre 1 y ScanCount.

lIndex: con este parámetro se indica el índice para encontrar la información sobre los tiempos de análisis. El valor de este parámetro puede variar entre 1 y SpectrumCount.

Valor de retorno:

Esta propiedad devuelve un valor de tipo long que es el valor de RT (retention time) para un valor de scan determinado (lScan) y para un valor de lIndex concreto.

Observaciones:

Este valor se puede obtener a partir del scan y del valor del intervalo. Esta propiedad permite otra forma de acceder a información del tiempo de retención para un dato del análisis determinado a partir de los dos parámetros vistos.

2. Arquitectura del Software..

34

Intensity

Definición:

Long Intensity (long lScan, long lIndex)

Parámetros:

lScan: este parámetro indica el número de scan. El valor lScan hace las funciones de índice de la información referente a las intensidades de masa detectadas por el analizador. El valor que se le puede dar a este parámetro puede oscilar entre 1 y ScanCount.

lIndex: con este parámetro se indica el índice para encontrar la información sobre las intensidades de masa. El valor de este parámetro puede variar entre 1 y SpectrumCount.

Valor de retorno:

Esta propiedad devuelve un valor de tipo long que es el valor de intensidad detectado para un valor de scan determinado (lScan) y para una masa concreta o, lo que es lo mismo, un valor de lIndex concreto.

Observaciones:

Para diferentes valores de lScan el valor de SpectrumCount puede variar. Por lo tanto los datos que proporciona esta propiedad no tienen porqué constituir una matriz cuadrada. Esta propiedad se ha utilizado en el programa IDAMAT para construir las matrices con los datos de espectrometría..

Saturate

Definición:

Long Saturate

Valor de retorno:

Esta propiedad devuelve un valor de 0 si no hay saturación en el análisis.

Esta propiedad devuelve un valor de 1 si hay saturación en el análisis.

Observaciones:

Esta propiedad indica si ha habido saturación del GCMS en un espectrograma concreto, pero no indica el punto exacto (masa y tiempo) para el cual se ha producido la saturación. En el caso del programa IDAMAT no se ha necesitado utilizar la información que proporciona esta propiedad.

SaturateFlags

Definición:

Long SaturateFlags (long lScan, long lIndex)

Parámetros:

lScan: este parámetro es el índice de scan de la matriz que contiene el SaturateFlag de cada valor de intensidad de masa que ha detectado el analizador. Cada dato tiene su flag que indica si en la medida se ha saturado el GCMS o no.

2. Arquitectura del Software..

35

lIndex: este parámetro es el índice de masa de la matriz que contiene el SaturateFlag de cada valor de intensidad de masa que ha detectado el GCMS. Cada dato tiene su flag que indica si en la medida se ha saturado el analizador o no.

Valor de retorno:

Esta propiedad devuelve un valor de 0 si no hay saturación en el análisis para una masa y un scan determinados.

Esta propiedad devuelve un valor de 1 si hay saturación en el análisis para un una masa y un scan determinados.

Observaciones:

En el caso del programa IDAMAT no se ha necesitado utilizar la información que proporciona esta propiedad.

Interval

Definición:

Long Interval

Valor de retorno:

Esta propiedad devuelve un valor en milisegundos correspondiente al valor del intervalo. El intervalo es el tiempo entre scans. Este valor se define en los parámetros de análisis antes de efectuarlo.

Observaciones:

El valor típico de intervalo que se utiliza para realizar los análisis es de 500 milisegundos. En el caso del programa IDAMAT se ha utilizado esta propiedad para calcular el RT (Retention Time) a partir del valor del intervalo y del valor de scan.

StartRT

Definición:

Long Interval

Valor de retorno:

Esta propiedad devuelve un valor en milisegundos correspondiente al valor del tiempo de inicio del análisis efectuado. Este valor se define en los parámetros de análisis antes de iniciarlo.

Observaciones:

En el caso del programa IDAMAT se ha utilizado la esta propiedad para mostrarla a modo de información para el usuario.

2. Arquitectura del Software..

36

EndRT

Definición:

Long EndRT

Valor de retorno:

Esta propiedad devuelve un valor en milisegundos correspondiente al valor del tiempo final del análisis efectuado. Este valor se define en los parámetros de análisis antes de iniciarlo.

Observaciones:

En el caso del programa IDAMAT se ha utilizado la esta propiedad para mostrarla al usuario como información.

2. Arquitectura del Software..

37

2.3.3 Acceso desde el Programa Visual Basic a la Interfaz de Automatización del GCMSsolution.

En los apartados anteriores se ha descrito la interfaz de automatización de que el GCMSSolution dispone. Esta interfaz le permite trabajar como servidor de automatización. Esto significa que cualquier programa capaz de actuar como un controlador de automatización podrá controlar el GCMSSolution y solicitar información sobre todo tipo de datos.

Existen varios programas que pueden trabajar como controladores de automatización. Entre los más conocidos se encuentran: Excel, Access, Project y los programas desarrollados en Visual Basic y en Visual C++.

Un controlador de automatización debe invocar al servidor para iniciar una comunicación. La forma de invocar al servidor varía en función del programa o lenguaje que hace las funciones de controlador. No se utilizarán los mismos comandos o instrucciones en Visual Basic que las que se utilicen en Visual C++. En la información del controlador se describirá detalladamente cómo invocar a cualquier servidor de automatización. En la información que proporcione el fabricante del servidor también debe figurar el nombre que le identifica. Aunque la forma de invocar al servidor varíe en función del controlador que lo invoque, todos deberán utilizar el mismo nombre que proporciona. En el caso del GCMSSolution el nombre que cualquier controlador debe utilizar para invocarlo es “GCMSFileObj”.

Una vez creado el objeto COM principal desde el controlador se crearán todos los objetos que sean necesarios. Algunos objetos se deberán crear ejecutando uno u otro método de los que se describen en los manuales que proporcionan los servidores. El programador podrá ejecutar los métodos y acceder a las propiedades que el servidor le permita y siempre en la forma que la interfaz de automatización se lo indique.

Figura 2.3. Aplicación cliente (IDAMAT) y servidor (GCMSSolutions).

Programa IDAMAT

(Visual Basic)

Automation Client Automation Server

GCMSSolutions lDispatch

Interface

2. Arquitectura del Software..

38

En este proyecto el programa IDAMAT ,desarrollado en Visual Basic, constituye el controlador de automatización. Para comunicarse con el GCMSSolution el primer paso es crear el objeto principal de comunicación COM.

En Visual Basic 6.0 se dispone de la instrucción CreateObject para este objetivo. Esta función crea y devuelve una referencia a un objeto de automatización. La sintaxis de esta función es la siguiente:

CreateObject(clase)

El argumento clase usa la sintaxis nombredeservidor.nombredetipo y tiene las siguientes partes:

nombredeservidor: es el nombre de la aplicación que proporciona el objeto.

nombredetipo: es el tipo o clase de objeto que se va a crear.

Los servidores de automatización proporcionan, al menos, un tipo de objeto. Por ejemplo, una aplicación de proceso de textos puede proporcionar un objeto Application, un objeto Document y un objeto Toolbar.

Para crear un objeto de automatización el primer paso es declarar la variable objeto en la sección de declaraciones:

Public ObjetoDatos As GCMSDataFile

El nombre ObjetoDatos hace referencia a una variable de objeto. Este objeto será el objeto de automatización creado mediante la instrucción CreateObject. Para crear el objeto de automatización se debe asignar el objeto devuelto por CreateObject a una variable objeto. En el siguiente trozo de código extraído del programa IDAMAT se muestra la función CrearObjeto( ). Esta función crea el objeto de automatización del GCMSSolution.

'----------------------------------------------------------

' Este procedimiento crea un objeto de datos del

' GCMSSolution. Es el objeto que muestra la interfaz

' de automatización del GCMSSolution.

'----------------------------------------------------------

Public Sub CrearObjeto()

If Not ObjetoDatos Is Nothing Then

Set ObjetoDatos = Nothing

End If

If Not ObjetoMSRawData Is Nothing Then

Set ObjetoMSRawData = Nothing

End If

2. Arquitectura del Software..

39

Set ObjetoDatos = CreateObject("GCMSFileObj.Data")

End Sub

En las primeras líneas de código se comprueba que la variable objeto a la cual se le va a asignar el objeto de automatización está vacía. Si no lo está se borra su contenido. De esta forma se evitan errores que se pueden producir al asignar un objeto a una variable de objeto que ya hace referencia a otro objeto.

Se puede observar cómo el identificador del servidor de automatización es GCMSFileObj y Data es el nombre del tipo o clase del objeto que se va a crear. Por lo tanto el objeto devuelto por la función CreateObject será un objeto de datos. Este era el primero de los 4 objetos principales que vimos en la jerarquía de objetos del la interfaz de comunicación del GCMSSolution. Será el único objeto principal que se cree en el programa IDAMAT porque es el que contiene la información que nos interesa.

El código anterior inicia la aplicación que crea el objeto (en este caso el software GCMSSolution). Una vez creado el objeto se puede hacer referencia al objeto mediante la variable de objeto que se ha definido.

Entonces ya tenemos en la variable ObjetoDatos un objeto de automatización del GCMSSolution. El siguiente paso será cargar este objeto con los datos contenidos en un archivo de datos *.qgd. Este archivo corresponderá a todos los datos relativos al análisis realizado a una sustancia determinada.

Para cargar el objeto de automatización con los datos de un análisis determinado se debe ejecutar el método LoadFile, descrito en el apartado 2.3.2.. En el programa IDAMAT se ha programado una función que realiza este método:

'-----------------------------------------------------------

' Este procedimiento carga los datos contenidos en el

' objeto MSRawData de la interfaz de automatización.

'-----------------------------------------------------------

Public Sub CargarDatos(NombreFichero As String, IsReadOnly As Integer)

If Not ObjetoDatos Is Nothing Then

Call ObjetoDatos.LoadFile(NombreFichero, IsReadOnly)

Set ObjetoMSRawData = ObjetoDatos.MSRawData

End If

End Sub

Se puede observar que la función CargarDatos programada tiene dos parámetros que habrá que proporcionar en la llamada de la función. El primero es el NombreFichero y debe contener el path completo del archivo *.qgd cuyos datos se quieren cargar en el objeto de automatización ObjetoDatos creado anteriormente. En el segundo parámetro se indica si el objeto será sólo de lectura.

Una vez ejecutado el método LoadFile estará disponible toda la información de un objeto de automatización GCMSSolution del tipo Data. En esta función, una vez cargados

2. Arquitectura del Software..

40

los datos, se asigna el “subobjeto” MSRawData a la variable ObjetoMSRawData mediante la instrucción:

Set NombreObjeto = Objeto.clase.

Previamente se ha declarado esta variable en la sección de declaraciones:

Public ObjetoMSRawData As MSRawData

En la variable de nombre ObjetoMSRawData se guarda el objeto de automatización que contiene los datos que nos interesan. Pero todavía no se puede acceder a estos datos directamente.

Como se vio en el apartado en que se explicaba la jerarquía de objetos el objeto MSRawData contiene 3 objetos cuyas propiedades son los datos que nos interesan:

Figura 2.4. Jerarquía de objetos.

Para poder obtener los objetos contenidos en el objeto MSRawData es necesario ejecutar los métodos que están incluidos en éste. Como se ha visto anteriormente el objeto MSRawData contiene los métodos:

• GetTIC

• GetMIC

• GetMC

• GetSpectrum

• GetAveSpectrum

• GetMS3DData

De estos 6 métodos sólo se utilizan 3 en el programa IDAMAT: GetTIC, GetSpectrum y GetMS3DData . Mediante estos 3 métodos se obtienen los tres objetos

MSRawData

MSChromatogram

MSSpectrum

MS3DData

GCMSFileObj.Data

2. Arquitectura del Software..

41

incluidos dentro del objeto MSRawData. Estos 3 objetos contienen toda la información necesaria para construir las matrices.

Para ejecutar los métodos y obtener los objetos se han programado 3 funciones en el programa IDAMAT que se muestran a continuación:

'-----------------------------------------------------------

' Este procedimiento carga los datos contenidos en el

' objeto MS3DData de la interfaz de automatización.

'-----------------------------------------------------------

Public Function CargarMS3DData() As Boolean

Dim lGroup As Long

Dim Datos_ok As Boolean

lGroup = 1

Datos_ok = True

If Not ObjetoMS3DData Is Nothing Then

Set ObjetoMS3DData = Nothing

End If

If Not ObjetoMSRawData Is Nothing Then

Set ObjetoMS3DData = ObjetoMSRawData.GetMS3DData(lGroup)

End If

CargarMS3DData = Datos_ok

End Function

'-----------------------------------------------------------

' Este procedimiento ejecuta el método con el que se

' obtienen datos relativos a la cromatografía de la

' sustancia analizada.

'-----------------------------------------------------------

Public Function CargarTIC() As Boolean

Dim lGroup As Long

Dim Datos_ok As Boolean

lGroup = 1

Datos_ok = True

If Not ObjetoMSChromatogram Is Nothing Then

Set ObjetoMSChromatogram = Nothing

End If

If Not ObjetoMSRawData Is Nothing Then

Set ObjetoMSChromatogram = ObjetoMSRawData.GetTIC(lGroup)

2. Arquitectura del Software..

42

End If

CargarTIC = Datos_ok

End Function

'----------------------------------------------------------

' Con este procedimiento se cargan los datos relativos

' a la espectrometría de la sustancia analizada.

'----------------------------------------------------------

Public Function CargarMSSpectrum(RT As Long, BackRT As Long) As Boolean

Dim Datos_ok As Boolean

Datos_ok = True

If Not ObjetoMSSpectrum Is Nothing Then

Set ObjetoMSSpectrum = Nothing

End If

If Not ObjetoMSRawData Is Nothing Then

Set ObjetoMSSpectrum = ObjetoMSRawData.GetSpectrum(RT, BackRT)

End If

CargarMSSpectrum = Datos_ok

End Function

Se puede observar que en las tres funciones se liberan las variables de objeto si estas contienen algún objeto asignado previamente. De esta forma se evitan errores que pueden tener lugar cuando se asigna un objeto a una variable que contiene otro.

Al ejecutar uno de los métodos este devuelve un objeto que se guarda en una variable que ha sido declarada previamente en la sección de declaraciones del programa IDAMAT. Estas variables se declaran como objetos de la clase que van a contener:

Public ObjetoMS3DData As MS3DData

Public ObjetoMSChromatogram As MSChromatogram

Public ObjetoMSSpectrum As MSSpectrum

Cuando se ejecutan los métodos se puede observar que se han de indicar diferentes parámetros que se pasan a través de la llamada a la función. En el caso del objeto MSSpectrum se indica el tiempo de retencion (RT) como parámetro. En función del valor de este parámetro se obtendrán unos datos determinados. Esto es así, ya que para cada instante de análisis se obtiene un espectrograma diferente.

Finalmente se dispone de 3 objetos:

• MS3DData

• MSChromatogram

• MSSpectrum

2. Arquitectura del Software..

43

Estos tres objetos están compuestos de una serie de propiedades que constituyen los datos obtenidos de los análisis de espectrometría y cromatografía. Estas propiedades se han explicado en apartados anteriores cuando se describió la interfaz de automatización del GCMSSolution.

La sintaxis para obtener un dato de una propiedad desde Visual Basic y guardar el valor en una variable es la siguiente:

NombreVariable = NombreObjeto.NombrePropiedad

A continuación se muestran diferentes funciones del programa IDAMAT. En estos ejemplos se puede apreciar cómo se obtienen los datos que contienen las propiedades de los objetos de automatización una vez creados éstos:

'----------------------------------------------------------

' Con este procedimiento se obtiene el valor de la

' intensidad para un instante de analisis determinado y un

' número de cuenta. El número de cuenta es el número

' que indica las masas en las cuales se registra impacto

' para todo el espectro de masas.

'----------------------------------------------------------

Public Function DataIntensidad(i As Integer, k As Integer) As Long

DataIntensidad = ObjetoMS3DData.Intensity(i, k)

End Function

'----------------------------------------------------------

' Con este procedimiento se obtiene el valor de la masa

' para un instante de analisis determinado y un número

' de cuenta. El número de cuenta es el número

' que indica las masas en las cuales se registra impacto

' para todo el espectro de masas.

'----------------------------------------------------------

Public Function Get3DMz(ByVal lScan As Long, ByVal lIndex As Long) As Long

Dim lMz As Long

lMz = 0

If Not ObjetoMS3DData Is Nothing Then

lMz = ObjetoMS3DData.Mz(lScan, lIndex)

End If

Get3DMz = lMz

End Function

2. Arquitectura del Software..

44

'----------------------------------------------------------

' Con este procedimiento se obtiene el número de scans que

' componen el análisis de la sustancia analizada.

'----------------------------------------------------------

Public Function ScanCount() As Long

ScanCount = ObjetoMS3DData.ScanCount

End Function

'----------------------------------------------------------

' Con este procedimiento se obtiene el número de cuentas que

' componen el análisis de la sustancia analizada.

'----------------------------------------------------------

Public Function Count() As Long

Count = ObjetoMSChromatogram.Count

End Function

'----------------------------------------------------------

' Con este procedimiento se obtiene el valor del TIC

' para un instante de análisis determinado.

'----------------------------------------------------------

Public Function Dato_intensidad_TIC(i As Integer) As Long

Dato_intensidad_TIC = ObjetoMSChromatogram.Intensity(i)

End Function

'----------------------------------------------------------

' Con este procedimiento se obtiene el valor de impactos

' registrados por el analizador para todo el espectro de

' masas en un instante de tiempo determinado.

'----------------------------------------------------------

Public Function SpectrumCount(i As Integer) As Long

SpectrumCount = ObjetoMS3DData.SpectrumCount(i)

End Function

2. Arquitectura del Software..

45

2.4 Interfaz de Comunicación de MATLAB.

2.4.1 Introducción.

Se puede configurar MATLAB tanto para controlar objetos COM como para ser controlado por otros componentes COM. Cuando MATLAB controla otros componentes, MATLAB es el cliente y el otro componente realiza el papel de servidor. Cuando MATLAB es controlado por otro componente está actuando como servidor.

MATLAB puede soportar 4 tipos de configuración cliente-servidor COM:

1. MATLAB cliente y un control (servidor) In-process.

2. MATLAB cliente y un servidor Out-of-process.

3. Aplicación cliente y MATLAB como servidor de Automatización.

4. Aplicación cliente y MATLAB como un motor servidor.

En este proyecto se utiliza a MATLAB un servidor de Automatización. Podrá ser iniciado y controlado por cualquier programa de tipo windows que pueda actuar como controlador de automatización. En nuestro caso, la aplicación IDAMAT desarrollada en Visual Basic realizará las funciones de controlador. Enviará a MATLAB datos e instrucciones y solicitará datos.

Un servidor de automatización desarrollado en MATLAB puede ejecutar comandos en el workspace de MATLAB y adquirir y trasladar matrices directamente en el workspace.

Figura 2.5. IDAMAT (cliente) y MATLAB como servidor de Automatización.

En el apartado siguiente se explican los métodos e instrucciones que se pueden ejecutar cuando se controla un servidor de MATLAB. Para obtener una información más detallada de las posibilidades de MATLAB en lo que a automatización se refiere ver la ayuda de MATLAB.

Aplicación IDAMAT

(Visual Basic)

Automation Client Automation Server

MATLAB lDispatch

Interface

2. Arquitectura del Software..

46

2.4.2 MATLAB como Servidor de Automatización.

MATLAB soporta capacidades de un servidor de automatización COM en windows. Como ya se ha explicado anteriormente, Automatización es un protocolo COM que permite a una aplicación o componente (el controlador) controlar a otra aplicación (el servidor). Así, MATLAB puede iniciarse y controlarse mediante cualquier programa window que tenga capacidad para actúar como un controlador de automatización.

Gracias a esta comunicación el programa IDAMAT podrá aprovechar funciones y herramientas de MATLAB sin necesidad de crearlas en Visual Basic, lo cual sería bastante complicado.

Para utilizar MATLAB como servidor de automatización, en primer lugar, hay que invocar al servidor COM de automatización. La forma de invocar a depende del programa (o lenguaje en que esté escrita la aplicación) que actúa como controlador. En el caso del programa IDAMAT será de la misma forma que se vio anteriormente en la comunicación con el programa GCMSSolution. El nombre del objeto COM de MATLAB que está en el registro de objetos es “Matlab.Application”. Todos los controladores, sean del tipo que sean, requieren este nombre para identificar al objeto que se creará como un servidor de MATLAB.

En primer lugar, se debe declarar la variable de objeto que va a contener al objeto de automatización de MATLAB:

Public Matlab As Object

Después, mediante la función CreateObject que vimos anteriormente, se crea el objeto de automatización. Como se puede ver abajo, en el programa IDAMAT se ha creado una función CrearMatlab( ) que crea el objeto de automatización Matlab:

' Este procedimiento sirve para crear el objeto de Matlab

' que servirá de interfaz de comunicación de este programa

' con Matlab. Este objeto se utilizará con las matrices.

Public Sub CrearMatlab()

If Matlab Is Nothing Then

Set Matlab = CreateObject("Matlab.Application")

End If

End Sub

Un servidor de automatización de MATLAB soporta una serie de métodos. Los tipos de datos de los argumentos y de los valores devueltos se expresan como tipos de datos de automatización, que son independientes de cualquier lenguaje de programación ya que están definidos por el protocolo de automatización. Por ejemplo, el tipo BSTR es un string de “carácter amplio” definido como un tipo de dato de automatización. El formato de un dato BSTR es el mismo formato utilizado por Visual Basic para almacenar strings.

2. Arquitectura del Software..

47

Cualquier controlador que soporte COM debería soportar este tipo de datos, aunque los detalles de cómo se declaran y manipulan estos datos son específicos del programa controlador.

2.4.2.1 Método Execute:

Sintaxis: BSTR Execute ( [in] BSTR Command)

El método Execute acepta una única cadena ( Command )que contiene cualquier comando que se pueda ejecutar en la línea de comandos de MATLAB.

MATLAB ejecutará el comando y devolverá el resultado como una cadena de caracteres.

Cualquier figura que se genere debido al comando especificado, se verá en la pantalla como si el comando se ejecutara directamente desde la linea de comandos de MATLAB.

A continuación se muestran diferentes partes del código del programa IDAMAT que se han utilizado para utilizar funciones y herramientas de MATLAB:

Result = MatlabGrafico.Execute("figure")

Result = MatlabGrafico.Execute("surfc(X,Y,Z)")

Result = MatlabGrafico.Execute("XLABEL('Masas')")

Result = MatlabGrafico.Execute("YLABEL('tiempo')")

Result = MatlabGrafico.Execute("ZLABEL('Intensidad')")

Result = MatlabGrafico.Execute("TITLE('" & List_nombres_qgds.Text &_ "')")

Result = Matlab.Execute("OBJETOS_ESP = char(OBJETOS_ESP);")

Result = Matlab.Execute("[MAT2PCA_SIN_ALINEAR_SINCEROS,VARIABLES_

SIN_ALINEAR_SINCEROS]= quitaceros(MAT2PCA_SIN_ALINEAR,VARIABLES_

SIN_ALINEAR);")

Se puede observar que se puede ejecutar todo tipo de instrucciones que se puedan ejecutar en el workspace de MATLAB. En la primera línea de instrucciones se ejecuta la orden figure. Aparecerá, por lo tanto, una ventana de MATLAB de figura. Posteriormente se ejecuta la orden surfc(X,Y,Z) . Se mostrará en la figura creada anteriormente la superficie definida por las tres matrices X, Y y Z. Previamente se deben haber colocado estas matrices en el workspace de MATLAB mediante los métodos que veremos a continuación.

2. Arquitectura del Software..

48

En todas las instrucciones que se ejecutan se guarda el string devuelto por la instrucción en la variable Result. Posteriormente el contenido de esta variable se mostrará en un cuadro de texto del programa IDAMAT:

Txt_Matlab.Text = Result

De esta forma el usuario del programa IDAMAT podrá ver los mensajes de error devueltos por MATLAB.

En el texto que se incluye como parámetro del método Execute se debe incluir una orden de MATLAB tal y como se escribiría en el workspace. No debe haber errores. Esta orden será un string que, como se ve en los ejemplos anteriores, se puede construir concatenando caracteres y variables del tipo string mediante el operador &.

2.4.2.2 Método GetFullMatrix.

Sintaxis: void GetFullMatrix(

[in] BSTR Name,

[in] BSTR Workspace,

[in, out] SAFEARRAY(double)* pr,

[in, out] SAFEARRAY(double)* pi);

Este método sirve para traer una matriz de 1 o 2 dimensiones del workspace donde se está trabajando al programa que hace el papel de controlador de automatización. La matriz puede ser real o imaginaria (opcional). Si la matriz es imaginaria, los valores se reparten en 2 matrices: una con los valores reales de la matriz y la otra con valores reales que corresponderan a la parte imaginaria del número complejo. A continuación se describen los argumentos del método GetFullMatrix:

Name: Identifica el nombre del mxArray que se quiere obtener.

Workspace: Identifica el workspace donde está la mxArray que se desea obtener. Si se quiere indicar el workspace por defecto se debe poner el valor “base”. Para poner el mxArray en el workspace global de MATLAB se pondrá el valor “global”.

pr: Array de reales que se dimensiona para que tenga el mismo tamaño que la matriz que se quiere obtener. Esta matriz contendrá los valores reales de la matriz obtenida del workspace de MATLAB.

pi: Array de valores reales que se dimensiona para que tenga el mismo tamaño que la matriz que se quiere obtener del workspace de MATLAB. Esta matriz contendrá la parte imaginaria de los valores de la matriz obtenida. Si la matriz que se desea obtener no tiene parte imaginaria se deberá pasar una matriz vacía. Esta matriz se deberá declarar igualmente. En Visual Basic una matriz vacía se declara de la siguiente forma:

Dim Mempty( ) As Double

2. Arquitectura del Software..

49

En las siguientes líneas de código extraídas del programa IDAMAT se pueden ver un ejemplo de datos obtenidos del workspace de MATLAB para ser utilizados en el entorno de Visual Basic:

Call Matlab.GetFullMatrix("DESPLA", "base", MTRZ_DESPLA_Real,

MTRZ_DESPLA_Imag)

En este caso se ha utilizado MATLAB para calcular el desplazamiento entre las sustancias que se van a analizar. Los valores de los desplazamientos entre las diferentes sustancias se guardan en un vector DESPLA en el workspace de MATLAB. A partir de este vector que se obtiene mediante el método GetFullMatrix se podrá realizar el alineamiento de los datos de cromatografía y/o espectrometría.

En la parte del programa de declaraciones se deben declarar las dos matrices correspondientes a la matriz DESPLA. Una será la matriz que contenga los valores de la parte real y la otra guardará los valores de la parte imaginaria de la matriz DESPLA. En este caso todos los valores tienen solamente parte real por lo que la matriz MTRZ_DESPLA_Imag será una matriz vacía. Aún así la matriz se debe declarar e incluir en la sintaxis del método GetFullMatrix para que funcione correctamente.

Dim MTRZ_DESPLA_Real() As Double

Dim MTRZ_DESPLA_Imag() As Double

Aunque la matriz MTRZ_DESPLA_Real en un principio se declara como una matriz vacía posteriormente se redimensiona una vez se conocen las dimensiones que tendrá la matriz DESPLA calculada en el workspace de MATLAB. Como se puede ver en el ejemplo siguiente se utiliza la instrucción Redim para dar a la matriz las dimensiones que le corresponden:

ReDim MTRZ_DESPLA_Real(1 To List_nombres_qgds.ListCount)

2.4.2.3 Método PutFullMatrix.

Sintaxis:

void PutFullMatrix(

[in] BSTR Name,

[in] BSTR Workspace,

[in] SAFEARRAY(double) pr,

[in] SAFEARRAY(double) pi);

Este método sirve para trasladar una matriz de 1 o 2 dimensiones (real o imaginaria) en el workspace indicado. La parte real y la imaginaria (opcional) se pasan en 2 matrices separadas de datos del tipo double.

2. Arquitectura del Software..

50

Name: Identifica la matriz que se trasladará al workspace de MATLAB.

Workspace: Identifica el workspace donde está la mxArray que se desea obtener. Si se quiere indicar el workspace por defecto se debe poner el valor “base”. Para poner el mxArray en el workspace global de MATLAB se pondrá el valor “global”.

pr: Array de reales que contiene los valores de la parte real de los elementos de la matriz que se quiere trasladar al workspace de MATLAB.

pi: Array de valores reales. Esta matriz contendrá la parte imaginaria de los valores de los elementos de la matriz que se quiere trasladar a MATLAB. Si la matriz que se desea trasladar no tiene parte imaginaria se deberá pasar una matriz vacía. Esta matriz se deberá declarar igualmente.

A continuación se muestran ejemplos de código del programa IDAMAT en los que se pasan matrices al workspace de MATLAB mediante el método PutFullMatrix:

Call CrearMatlab

Call Matlab.PutFullMatrix("MAT2PCA_ALINEADA", "base", MTRZ_ESP_INT_

ALIN_Real, MTRZ_ESP_INT_ALIN_Imag)

Call Matlab.PutFullMatrix("VARIABLES_ALINEADA", "base", MTRZ_ESP_

VAR_ALIN_Real, MTRZ_ESP_VAR_ALIN_Imag)

Call Matlab.PutFullMatrix("OBJETOS_ESP_ALIN", "base", MTRZ_ESP_

OBJ_ALIN_Real, MTRZ_ESP_OBJ_ALIN_Imag)

Se puede observar que previamente se crea el objeto de automatización de MATLAB mediante la llamade a la función CrearMatlab.

Estas matrices se han declarado previamente en la sección de declaraciones del módulo de código correspondiente:

Dim MTRZ_ESP_INT_ALIN_Real() As Double

Dim MTRZ_ESP_INT_ALIN_Imag() As Double

Dim MTRZ_ESP_VAR_ALIN_Real() As Double

Dim MTRZ_ESP_VAR_ALIN_Imag() As Double

Dim MTRZ_ESP_OBJ_ALIN_Real() As Double

Dim MTRZ_ESP_OBJ_ALIN_Imag() As Double

Las matrices que contienen la parte imaginaria son matrices vacías porque no se trabajará con datos que contengan parte imaginaria. En el caso de las matrices de parte real, se declararán como matrices vacías. Después cuando se conoce la dimensión que van a tener se redimensionan con la instrucción Redim:

ReDim MTRZ_ESP_INT_ALIN_Real(1 To List_nombres_qgds.ListCount, 1 To

NumVariables)

ReDim MTRZ_ESP_VAR_ALIN_Real(1 To NumVariables, 1 To 9)

ReDim MTRZ_ESP_OBJ_ALIN_Real(1 To List_nombres_qgds.ListCount, 1 To 20)

2. Arquitectura del Software..

51

2.5 Interfaz de comunicación con el sistema operativo.

El programa IDAMAT tiene la posibilidad de obtener los datos de los análisis del GCMSSolution y guardarlos en ficheros de texto. Para poder crear estos ficheros se crea un objeto de automatización : FileSystemObject mediante las funciones que proporciona el Visual Basic Script.

Este objeto proporciona métodos y propiedades para trabajar con unidades, carpetas y ficheros. Se puede utilizar para, por ejemplo, leer y escribir o crear un fichero de texto, recorrer los ficheros de una carpeta, etc.

El objeto FileSystemObject que proporciona Visual Basic Script (y también Javascript, aunque aquí utilizaremos el primero) es un entramado de varios objetos: esto quiere decir que, mientras que podemos realizar ciertas operaciones con el objeto FSO en sí, para otras muchas tendremos que crear a su vez otros objetos, e interactuar con ellos independientemente de FSO.

Por esto, es importante distinguir bien de qué objeto es tal o cual propiedad, para no creer que nuestro FSO "no funciona". Si Name es una propiedad del objeto File, para saber el nombre de un fichero necesitamos un objeto fichero.

De entre las opciones que proporciona el objeto de automatización FileSystemObject se utilizarán las que permiten crear ficheros de texto y escribir datos en ellos. El primer paso es crear una instanciación de la clase:

Dim Obj_txt_esp_int As Object

Dim Obj_txt_esp_variables As Object

Dim Obj_txt_esp_objetos As Object

Set Obj_ESP = CreateObject("Scripting.FileSystemObject")

Set Obj_txt_esp_int = Obj_ESP.CreateTextFile (

Txt_esp_intensidades.Text,True)

Set Obj_txt_esp_variables = Obj_ESP.CreateTextFile(

Txt_esp_variables.Text, True)

Set Obj_txt_esp_objetos = Obj_ESP.CreateTextFile(

Txt_esp_objetos.Text, True)

Observar que anteponemos Scripting, puesto que FSO no es un objeto COM corriente: lo proporciona el motor de script, en este caso VBScript.

Una vez creados los archivos de texto sólo queda utilizar los métodos que proporciona el objeto FileSystemObject para escribir los datos en los ficheros de texto. Las siguientes instrucciones muestran cómo se han escrito los datos del GCMSSolution en los fichero de texto:

Obj_txt_esp_int.writeline (intensidad)

Obj_txt_esp_int.write (intensidad & " ")

Obj_txt_esp_variables.writeline (NombreVariable)

2. Arquitectura del Software..

52

2.6 Programa IDAMAT.

2.6.1 Introducción.

Hasta ahora se ha visto los diferentes programas que componen la arquitectura de software que supone todo el desarrollo de este proyecto. También se ha descrito cómo estos programas se comunican entre sí gracias a interfaces de automatización.

En este apartado se describe el programa IDAMAT, que es el centro de la arquitectura del software y constituye el controlador de automatización del resto de programas.

El programa IDAMAT se ha desarrollado en el lenguaje de programación Visual Basic 6.0. Este lenguaje permite desarrollar programas con una interfaz gráfica de ventanas típicas del entorno windows. La palabra "Visual" hace referencia al método que se utiliza para crear la interfaz gráfica de usuario (GUI). En lugar de escribir numerosas líneas de código para describir la apariencia y la ubicación de los elementos de la interfaz, simplemente puede agregar objetos prefabricados en su lugar dentro de la pantalla. Si ha utilizado alguna vez un programa de dibujo como Paint, ya tiene la mayor parte de las habilidades necesarias para crear una interfaz de usuario efectiva.

La palabra "Basic" hace referencia al lenguaje BASIC (Beginners All-Purpose Symbolic Instruction Code), un lenguaje utilizado por más programadores que ningún otro lenguaje en la historia de la informática o computación. Visual Basic ha evolucionado a partir del lenguaje BASIC original y ahora contiene centenares de instrucciones, funciones y palabras clave, muchas de las cuales están directamente relacionadas con la interfaz gráfica de Windows. Los principiantes pueden crear aplicaciones útiles con sólo aprender unas pocas palabras clave, pero, al mismo tiempo, la eficacia del lenguaje permite a los profesionales acometer cualquier objetivo que pueda alcanzarse mediante cualquier otro lenguaje de programación de Windows.

El lenguaje de programación Visual Basic no es exclusivo de Visual Basic. La Edición para aplicaciones del sistema de programación de Visual Basic, incluida en Microsoft Excel, Microsoft Access y muchas otras aplicaciones Windows, utilizan el mismo lenguaje. El sistema de programación de Visual Basic, Scripting Edition (VBScript) es un lenguaje de secuencias de comandos ampliamente difundido y un subconjunto del lenguaje Visual Basic.

El funcionamiento de una aplicación desarrollada en Visual Basic incluye básicamente tres conceptos clave: ventanas, eventos y mensajes.

Una ventana es simplemente una región rectangular con sus propios límites. Hay muchos tipos de ventanas: una ventana de documento dentro de su programa de proceso de textos o un cuadro de diálogo que emerge para avisar de un dato erróneo introducido... Aunque éstos son los ejemplos más comunes, realmente hay otros muchos tipos de ventanas. Un botón de comando es una ventana. Los iconos, cuadros de texto, botones de opción y barras de menús son todos ventanas.

El sistema controla continuamente cada una de estas ventanas para ver si existen signos de actividad o eventos. Los eventos pueden producirse mediante acciones del usuario, como hacer clic con el mouse (ratón) o presionar una tecla, mediante programación o incluso como resultado de acciones de otras ventanas.

2. Arquitectura del Software..

53

Cada vez que se produce un evento se envía un mensaje al sistema operativo. El sistema procesa el mensaje y lo transmite a las demás ventanas. Entonces, cada ventana puede realizar la acción apropiada, basándose en sus propias instrucciones para tratar ese mensaje en particular (por ejemplo, volverse a dibujar cuando otra ventana la ha dejado al descubierto).

Como puede imaginar, tratar todas las combinaciones posibles de ventanas, eventos y mensajes podría ser interminable. Afortunadamente, Visual Basic le evita tener que tratar con todos los controladores de mensajes de bajo nivel. Muchos de los mensajes los controla automáticamente Visual Basic, mientras que otros se tratan como procedimientos de evento para su comodidad. Esto le permite crear rápidamente eficaces aplicaciones sin tener que tratar detalles innecesarios.

Una aplicación desarrollada con Visual Basic está compuesta por una interfaz de usuario y una parte de código escrito.

La interfaz de usuario es quizás la parte más importante de una aplicación; ciertamente, es la más visible. Para los usuarios, la interfaz es la aplicación; seguramente a ellos no les interesa el código que se ejecuta detrás. Independientemente del tiempo y el esfuerzo que haya empleado en la escritura y optimización del código, la facilidad de uso de su aplicación depende de la interfaz. Ésta la componen los diferentes formularios que el programador desarrolla en tiempo de diseño. Los formularios son las ventanas que el usuario final verá cuando utilice la aplicación.

La parte de código escrito en un programa desarrollado en Visual Basic se puede estructurar de muchas formas. Existen diferentes módulos de código en los que se puede distribuir el código: módulo estandar, módulo de clase, módulo de código de un formulario...

Un módulo estándar es un módulo que contiene solamente declaraciones y definiciones de procedimiento, tipo y datos. Las declaraciones y definiciones a nivel de módulo de un módulo estándar son Public de manera predeterminada.

Un módulo de clase es un módulo que contiene la definición de una clase (sus definiciones de propiedades y métodos).

Un módulo de formulario es un archivo en un proyecto de Visual Basic con una extensión de nombre de archivo .frm que puede contener descripciones gráficas de un formulario; sus controles y sus valores de propiedad; declaraciones a nivel de formulario de constantes, variables y procedimientos externos; eventos y procedimientos generales.

El programa IDAMAT está compuesto por cuatro formularios:

• Form_inicio

• Form_graficos

• Form_pca

• Form_texto

En el formulario de inicio se introduce al usuario en el funcionamiento del programa IDAMAT y se le da instrucciones para que empiece a utilizarlo. En esta pantalla el usuario debe seleccionar la carpeta de trabajo que contiene los archivos *.qgd obtenidos de los

2. Arquitectura del Software..

54

análisis de las sustancias que son objeto de estudio. Posteriormente podrá “navegar” a alguno de los otros tres formularios según los datos que desee obtener.

En el formulario de gráficos el usuario puede seleccionar una sustancia determinada y visualizarla en un gráfico. Como los datos del análisis de una sustancia constituyen un espacio de tres dimensiones el gráfico obtenido constará de tres ejes.

En el formulario de PCA’s el usuario puede calcular PCA’s de las sustancias. En primer término debérá seleccionar los intervalos que definan los datos que desea seleccionar. Posteriormente, con los datos escogidos, creará un tipo u otro de matrices (con intensidades absolutas o relativas, sin alinear o alineadas...). Finalmente iniciará la herramienta pcagui de MATLAB que le permitirá calcular las PCA’s.

En el formulario de texto se generan los ficheros de texto con los datos obtenidos del GCMSSolution. El usuario podrá seleccionar los datos que desea guardar introduciendo los límites de varios intervalos. Los datos quedarán guardados en ficheros de extensión *.txt con el nombre que el usuario defina.

El código del programa IDAMAT se ha organizado en un total de nueve módulos de código. Cuatro son módulos de formulario que corresponden a los cuatro formularios descritos anteriormente. Los otros cinco módulos son módulos estándar que contienen diferentes funciones y procedimientos.

Los nueve módulos en los que se ha distribuido el código son:

• Módulos de código de los formularios:

o Form_graficos.frm

o Form_Inicio.frm

o Form_pca.frm

o Form_texto.frm

• Módulos estándar:

o BuscarCarpeta.bas

o Gráficos.bas

o Generar_matriz.bas

o PCA.bas

o Texto.bas

El módulo de código del formulario inicio contiene todas las instrucciones que se van a ejecutar cuando se produzca un evento en algún control de este formulario. En éste módulo está incluido el código de los diferentes cajas de texto que actualizan su contenido cuando se selecciona otra carpeta de texto.

El módulo de código del formulario de gráficos contiene las instrucciones relacionadas con la obtención de los datos de análisis y su traslado a MATLAB para que puedan ser representados en sus herramientas gráficas.

2. Arquitectura del Software..

55

El módulo de código de formulario de PCA contiene todas las instrucciones necesarias para construir las matrices que servirán para calcular la PCA correspondiente.

El módulo de código de formulario de texto contiene todo el código capaz de generar ficheros de texto con los datos obtenidos del GCMSSolution.

En la figura 2.6. se puede apreciar esta estructura de código descrita en la ventana de proyecto que muestra la pantalla principal de Visual Basic 6.0:

Figura 2.6. Ventana de proyecto de la aplicación IDAMAT.

El módulo estándar BuscarCarpeta contiene el código de una llamada a una API de windows. Se trata de la API BrowseForFolder que permite presentar por pantalla un cuadro de diálogo típico de windows de BuscarCarpeta. De esta forma se consigue que el usuario pueda seleccionar la carpeta de trabajo de forma más cómoda y sencilla.

El módulo estándar Gráficos contiene funciones relacionadas con la creación del objeto de automatización de MATLAB y la creación de los gráficos en 3 dimensiones.

El módulo estándar GenerarMatriz contiene una serie de funciones de carácter público, es decir, que son utilizadas por todos los módulos del programa. Estas funciones están relacionadas con la construcción de las matrices en general. En todas los formularios del programa hay acciones en las que se necesitan construir matrices de datos.

En el módulo estándar PCA hay funciones y procedimientos relacionados con la construcción de las matrices relativas a las PCA’s y al cálculo de estas últimas.

Finalmente el código contenido en el módulo estándar Texto contiene las instrucciones necesarias para la construcción de un objeto de automatización del tipo FileSystemObject que permitirá generar los ficheros de texto con los datos de los análisis.

2. Arquitectura del Software..

56

2.6.2 Interfaz gráfica.

Las diferentes herramientas de que dispone el programa IDAMAT están distribuidas en una serie de pantallas que constituyen la interfaz gráfica. Éstas han sido diseñadas para que sean fáciles de utilizar y su funcionamiento sea intuitivo.

2.6.2.1 Pantalla de inicio.

Cuando el usuario inicia el programa IDAMAT aparece la pantalla de inicio donde han incluido explicaciones sobre el funcionamiento del programa. En la figura se puede ver la pantalla de inicio del programa:

Figura 2.7. Pantalla de inicio del programa IDAMAT.

1. Cuadro de texto donde se indica el path de la carpeta de trabajo en la que se encuentran los ficheros de datos *.qgd. Pulsando el botón “Examinar...” se abre un cuadro de dialogo de “Buscar carpeta”. El usuario puede seleccionar a través de este cuadro de dialogo la carpeta donde se encuentran los ficheros del GCMSSolution que contienen los datos que se desea obtener.

2. Arquitectura del Software..

57

2. Lista de los ficheros de texto *.qgd de la carpeta seleccionada. En este cuadro de lista se mostrarán todos los ficheros de datos del GCMSSolution que se encuetran en la carpeta seleccionada.

3. Botón de navegación que lleva a la pantalla donde se pueden generar ficheros de texto (*.txt) a partir de los datos de los ficheros del GCMSSolutions seleccionados.

4. Botón de navegación que lleva a la pantalla donde se pueden generar gráficos en 3 dimensiones. En esta pantalla, como se verá más adelante en este manual, se puede seleccionar un fichero *.qgd que contiene todos los datos referentes a una sustancia determinada. Una vez seleccionada la sustancia se podrá generar un gráfico 3D con los datos de espectrometría correspondientes a dicha sustancia.

5. Botón de navegación que lleva a la pantalla donde se pueden generar matrices con datos de espectrometría o cromatografía y trasladarlas a un workspace de Matlab. También se podrá iniciar desde esta pantalla una herramienta propia de Matlab que permite generar PCA’s con los ficheros *.qgd seleccionados.

2.6.2.2 Pantalla para crear ficheros de texto.

En la siguiente figura se muestra la pantalla del programa donde se pueden generar los ficheros de texto con la información de los ficheros *.qgd seleccionados previamente. A esta pantalla se accede mediante el navegador visto anteriormente en la pantalla de inicio:

Figura 2.8. Pantalla para generar ficheros de texto.

2. Arquitectura del Software..

58

1. Cuadro de lista donde se muestran los ficheros de datos del GCMSSolution seleccionados de los cuales se guardarán los datos en los ficheros de texto.

2. Botones para eliminar algún fichero que no se desee incluir en los ficheros de texto que se van a crear y para volver a listar todos los ficheros de la carpeta.

3. Botones de selección. Según se elija cromatografía o espectrometría apareceran los controles (botones y cajas de texto) relacionados con una elección u otra.

4. Cajas de texto donde el usuario puede introducir el intervalo del cual desea obtener los datos.

5. Cajas de texto para que el usuario introduzca los nombres de los ficheros de texto que se van a crear. El primer nombre introducido corresponderá al fichero donde se guardarán las intensidades. El segundo nombre deberá ser el del fichero donde se guardarán los nombres de las variables que indicarán la masa y el número de scan. Por último, en la tercera caja de texto, el usuario introducirá el nombre del fichero donde desea guardar los nombres de los objetos (sustancias analizadas) que coincide con los nombres de los ficheros de datos del GCMSSolution.

6. Botón con el que el usuario da la orden de crear los ficheros de texto una vez se han introducido todos los datos necesarios en las diferentes cajas de texto de la pantalla.

2.6.2.3 Pantalla para crear gráficos 3D.

Figura 2.9. Pantalla para generar los ficheros 3D con los datos de la espectrometría de una sustancia determinada.

2. Arquitectura del Software..

59

1. Cuadro de lista donde se muestran los ficheros de datos del GCMSSolution seleccionados de los cuales se guardarán los datos en los ficheros de texto. El usuario puede seleccionar un fichero de la lista haciendo doble click sobre él. De esta forma el path completo del fichero queda registrado en la caja de texto del fichero seleccionado.

2. Botón para seleccionar el fichero de la lista del cual se va a generar el gráfico 3D. Al pulsar este botón el path completo del fichero queda registrado en la caja de texto del fichero seleccionado.

3. Caja de texto donde queda registrado el path completo del fichero del que se quiere generar el gráfico 3D.

4. Cajas de texto donde el usuario debe introducir los intervalos de tiempo (scans) y masas que definan el espacio 3D que se quiere visualizar.

5. Botón para generar el gráfico 3D con los datos de espectrometría de la sustancia previamente seleccionada.

6. Caja de texto donde se visualizarán los posibles errores que puedan tener lugar en el workspace de matlab donde se genera el gráfico 3D.

7. Botón que abre el cuadro de dialogo “guardar como...” para que el usuario introduzca el nombre del fichero con extensión “*.mat” donde se guardará el workspace que contiene los datos relacionados con el gráfico 3D.

8. Botón de navegación para volver a la pantalla de inicio.

2.6.2.4 Pantalla para calcular PCA’s.

En la siguiente figura se muestra la pantalla del programa donde se pueden generar diferentes matrices con los datos de espectrometría o cromatografía. Estas matrices se mantendrán en un workspace de Matlab, hasta que el usuario cierre el programa o decida guardarlas en un fichero *.mat.

El usuario también podrá iniciar una herramienta propia del Matlab: PCAGUI que es una interfaz gráfica para calcular PCA’s. De esta manera se podrán calcular las PCA’s de las matrices generadas a partir de la información solicitada por el usuario.

Una pantalla mostrará cualquier mensaje de error que se genere en el workspace de Matlab para poder, así, detectar posibles errores que puedan tener lugar.

2. Arquitectura del Software..

60

Figura 2.10. Pantalla para generar matrices y PCA’s de los datos de intensidades de las sustancias.

1. Cuadro de lista donde se muestran los ficheros de datos del GCMSSolution seleccionados de los cuales se guardarán los datos en los ficheros de texto. El usuario puede seleccionar un fichero de la lista haciendo doble click sobre él. De esta forma el path completo del fichero queda registrado en la caja de texto del fichero seleccionado.

2. Botones para eliminar algún fichero que no se desee incluir en los ficheros de texto que se van a crear y para volver a listar todos los ficheros de la carpeta.

3. Botones de selección. Según se elija cromatografía o espectrometría apareceran los controles (botones y cajas de texto) relacionados con una elección u otra.

4. Cajas de texto donde el usuario puede introducir el intervalo del cual desea obtener los datos. En este caso se muestra la pantalla con la opción de espectrometría seleccionado por lo que los intervalos que el usuario puede seleccionar corresponden al tiempo (scans) y a las masas.

5. Botones para crear las matrices con los datos de espectrometría pero si el alineamiento realizado a estos datos. Una vez generadas, las matrices se mantendrán en un workspace de Matlab. Los datos se perderán una vez el usuario cierre el programa IDAMAT, a no ser que previamente haya salvado el workspace.

6. Caja de texto donde se registra la sustancia que se va a tomar como referencia para realizar el alineamiento de todas las restantes. El usuario puede escribir el nombre de una de las sustancias que figure en el listado (1) o también puede hacer doble click sobre la sustancia seleccionada en la lista y automáticamente el nombre de la sustancia quedará registrado en esta caja de texto.

2. Arquitectura del Software..

61

7. Botones para crear las matrices con los datos de espectrometría alineados. Los datos se alinearán con respecto a la sustancia que previamente se haya indicado en la caja de texto de la muestra de referencia. Se pueden observar que hay dos botones. Uno crea la matriz con los valores absolutos de intensidad y el otro con los valores relativos.

8. Caja de texto donde se mostrarán los mensajes de error que se puedan generar en el workspace de Matlab cuando se generan las matrices de datos.

9. Botón para arrancar la herramienta de Matlaba: PCAGUI. Es una interfaz gráfica con la que el usuario podrá crear las PCA’s de los datos generados.

10. Botón que abre un cuadro de dialogo estándar de windows con el que se podrá guardar todos los datos generados hasta el momento en un fichero *.mat .

11. Botón de navegación para volver a la pantalla de inicio.

2. Arquitectura del Software..

62

2.6.3 Descripción del Programa.

2.6.3.1 Introducción.

En este apartado se pretende describir el programa IDAMAT en lo que a su ejecución se refiere. No se va a profundizar en el código ni en las instrucciones propias de Visual Basic ya que resultaría demasiado extenso. Las explicaciones se complementarán con diagramas de flujo. De esta forma se espera describir cómo opera el programa sin necesidad de que la persona que lea las explicaciones tenga conocimientos de Visual Basic 6.0. Incluso, si se decide mejorar esta aplicación en un futuro y desarrollar la nueva aplicación en otro lenguaje como podrían ser Visual Basic .Net o Visual C++, estos algoritmos podrían servir al programador.

En la figura siguiente se describen los símbolos que se utilizan en un diagrama de flujo a modo de recordatorio:

Figura 2.11. Simbología utilizada en los diagramas de flujo.

Se llama Símbolo Terminal y su función consiste en indicar dónde principia y dónde termina un programa.

Este es el Símbolo de Proceso y representa una función de proceso, por ejemplo un cálculo.

Es el Símbolo de Documento y representa una salida de la computadora en forma de un Documento.

Este es el Símbolo de Decisión y permite alterar el curso de acción de un programa. La pregunta o test a ser hecha debe ser mostrada dentro del diamante. Desde el simbolo pueden fluir dos o más flechas.

Este es el Símbolo Conector y se usa para conectar una parte de un diagrama de flujo con otra. Puede encerrarse cualquier símbolo o carácter o carácter dentro de los símbolos conectores.

Es el Símbolo de Entrada/Salida y representa información que va a ser leída para su posterior procesado, o bien información a ser escrita. Este símbolo puede ser usado para mostrar salida impresa en lugar del símbolo de documento.

Se utilizará este símbolo para indicar la presencia de un buclel for.

2. Arquitectura del Software..

63

2.6.3.2 Módulo de Código del Formulario de Gráficos.

2.6.3.2.1 Botón de Comando “Generar gráfico 3D”.

En el módulo de código del formulario de gráficos cabe destacar la programación relacionada con el botón de comando Generar gráfico 3D. Es el comando cuyo código asociado constituye el algoritmo más complicado por lo que se explicará en este apartado.

El código relacionado con el resto de comandos no es de gran complejidad para una persona que tenga conocimientos de Visual Basic por lo que no se considera necesaria su descripción.

Las instrucciones relacionadas con este botón empezaran a ejecutarse cuando tenga lugar el evento click del control. El usuario habrá introducido todos los datos requeridos por el programa y pulsará el botón de comando.

En primer lugar se declaran las variables de carácter local al procedimiento click del botón. Entre estas variables destacan las matrices donde se guardarán los datos de los análisis, las variables donde se guardan los límites de los intervalos introducidos por el usuario, las variables que guardarán los contadores de los bucles que se utilizan en el algoritmo...

El siguiente paso consiste en comprobar si el usuario ha introducido todos los límites requeridos para indicar los intervalos que se van a incluir en el gráfico 3D. Seguidamente se comprueba si los intervalos introducidos son correctos, si los caracteres corresponden a valores numéricos y si los valores iniciales de un intervalo son menores que los valores finales. En caso contrario el sistema no creará las matrices con los datos de los análisis ni se generará el gráfico 3D. Aparecerá un cuadro de diálogo en el que se informará al usuario del error. Éste deberá volver a introducir los valores correctos y pulsar de nuevo el botón de comando Generar gráfico 3D.

Si los datos introducidos por el usuario son correctos continuará la ejecución de las instrucciones. El siguiente paso será redimensionar las matrices que guardarán los datos de los análisis. En un principio no se conocen estas dimensiones por lo que las matrices se declaran como matrices vacías. Cuando se conocen los intervalos introducidos por el usuario se puede calcular el tamaño de las matrices. Entonces se asigna el tamaño que les corresponde con la instrucción Redim.

El siguiente paso consiste en crear los objetos de automatización del GCMSSolution que contiene los datos de los análisis. Para ello se utilizarán las instrucciones que se vieron en apartados anteriores como CreateObject.

A continuación se ejecutan dos bucles For anidados que tienen como objetivo construir las matrices con los datos obtenidos de los análisis. La matriz donde se guardarán los valores de intensidades será una matriz de dos dimensiones ya que cada valor de intensidad depende de dos parámetros: tiempo y masa. El primer bucle For efectúa un barrido por todos los scans del intervalo introducido por el usuario. En la primera instrucción interna de este bucle se obtiene el número de masas que se han detectado en el análisis para ese scan determinado por lo que se ejecuta el segundo bucle For. Este segundo bloque For efectúa un barrido a través de todas las masas del espectro. De esta forma se irá construyendo la matriz dato a dato.

2. Arquitectura del Software..

64

Figura 2.12. Diagrama de flujo del botón de comando Generar gráfico 3D

F

F

T

Declaración de variables locales.

Guardar intervalos introducidos por el usuario

¿Intervalos completos?

Mensaje de aviso al usuario: intervalos

incorrectos

¿Intervalos correctos?

Redimensionar matrices declaradas en función de los

intervalos introducidos.

Crear objetos de automatización del

GCMSSolutions

INICIO

Obtener valor SpectrumCount para un valor i (scan)

Calcular valor intensidad (ScanCount,SpectrumCount)

Guardar valor intensidad en matriz de intensidades.

Guardar valor variables en matriz de variables.

Bucle For desde scan

inicial a scan final

Bucle For desde masa

inicial a masa final

Liberar objetos de automatización del GCMSSolutions

1

2. Arquitectura del Software..

65

Figura 2.12.(continuación). Diagrama de flujo del botón de comando Generar gráfico 3D

La matriz de intensidades contendrá los datos ordenados de la siguiente forma:

Masa1 Masa2 Masa3 Masa4 Masa5 Scan1 Intensidad1,1 Intensidad1,2 Intensidad1,3 Intensidad1,4 Intensidad1,5 Scan2 Intensidad2,1 Intensidad2,2 Intensidad2,3 Intensidad2,4 Intensidad2,5 Scan3 Intensidad3,1 Intensidad3,2 Intensidad3,3 Intensidad3,4 Intensidad3,5

Figura 2.13. Estructura de la matriz de intensidades

Una vez creadas las matrices con los datos de los análisis se deben liberar los objetos de automatización del GCMSSolutions que se han creado. Si no se liberan los objetos una vez utilizados cuando se cierre la aplicación se producirán errores.

En este momento se dispone de las matrices completadas con los datos de los análisis. El siguiente paso es crear un objeto de automatización de MATLAB. Este objeto proporciona acceso a un workspace de MATLAB temporal. Las matrices creadas se trasladarán al workspace mediante el método que proporciona la interfaz de automatización de MATLAB : PutFullMatrix. Una vez se han colocado las matrices en el workspace se ejecutará la instrucción surfc que construye una superficie en un espacio de 3 dimensiones con los datos proporcionados por las matrices. Concretamente la función que se ejecuta en el workspace de MATLAB es:

Surfc(X,Y,Z)

Esta orden se ejecuta desde Visual Basic con la instrucción: Result = MatlabGrafico.Execute("surfc(X,Y,Z)")

1

Crear objeto de automatización MATLAB.

Escribir matrices en workspace de MATLAB.

Ejecutar función generar gráfico 3D funcio surfc(X,Y,Z)

FIN

2. Arquitectura del Software..

66

2.6.3.3 Módulo de Código del Formulario de Texto.

2.6.3.3.1 Botón de Comando “Crear ficheros de TIC’s”.

En el módulo de código del formulario desarrollado para crear los ficheros de texto se encuentran las instrucciones ligadas al botón de comando Crear ficheros de TIC’s. El algoritmo que implementan estas instrucciones se describe en este apartado. En la figura 2.14 se describe este algoritmo mediante un diagrama de flujo.

Este algoritmo está asociado al evento clic del botón de comando. Cuando el usuario pulse el botón se ejecutarán todas las instrucciones que componen el algoritmo.

En primer lugar se declaran las variables de carácter local al procedimiento click del botón. Entre estas variables destacan los objetos de texto creados mediante la interfaz de automatización que proporciona el objeto FileSystemObject. En estos fichero de texto se guardarán los datos de los análisis. También se declaran las variables donde se guardan los límites de los intervalos introducidos por el usuario, las variables que guardarán los contadores de los bucles que se utilizan en el algoritmo...

A continuación se crearán los objetos de texto que permitirán crear los archivos de texto. Para ello se crea un objeto FileSystemObject mediante el servidor de automatización scripting. De esta forma el programa IDAMAT se comunica con el sistema operativo windows y concretamente con el sistema de archivos. Se crean tres ficheros de texto donde se guardarán los valores de los TIC’s, los nombres de las variables que en este caso son los scans y los nombres de las sustancias que son objeto del estudio que en terminología química se denominan objetos.

El siguiente paso consiste en comprobar si el usuario ha introducido todos los límites requeridos para indicar los intervalos que se van a incluir en el gráfico 3D. Seguidamente se comprueba si los intervalos introducidos son correctos, si los caracteres corresponden a valores numéricos y si los valores iniciales de un intervalo son menores que los valores finales. En caso contrario el sistema no creará las matrices con los datos de los análisis ni se generará el gráfico 3D. Aparecerá un cuadro de dialogo en el que se informará al usuario del error. Éste deberá volver a introducir los valores correctos y pulsar de nuevo el botón de comando de Crear ficheros de TIC’s.

Si los datos introducidos por el usuario son correctos continuará la ejecución de las instrucciones. El siguiente paso consiste en crear los objetos de automatización del GCMSSolution que contiene los datos de los análisis. Para ello se utilizarán las instrucciones que se vieron en apartados anteriores como CreateObject.

A continuación se ejecutan dos bucles For anidados que tienen como objetivo construir los ficheros de texto con los datos de los análisis. El fichero de texto donde se guardarán los valores de TIC’s constituye una matriz de dos dimensiones ya que cada valor de intensidad depende de dos parámetros: tiempo (scan) y objeto (sustancia analizada). El primer bucle For efectúa un barrido por todos los objetos que el usuario ha incluido en el listado correspondiente del formulario. Para cada sustancia se ejecutará el bucle FOR que se encuentra anidado en el primero. Este segundo bloque FOR efectúa un barrido a través de todos los scans del cromatograma de todas las sustancias. De esta forma se irá construyendo el fichero de texto dato a dato. Se obtendrá un valor y se escribirá en el fichero de texto, luego otro valor y se escribe...

2. Arquitectura del Software..

67

Figura 2.14. Diagrama de flujo de algoritmo del botón de comando Crear ficheros de TIC’s.

T

F

F

T

Declaración de variables locales.

Guardar intervalos introducidos por el usuario

¿Intervalos completos?

Mensaje de aviso al usuario: intervalos

incorrectos

¿Intervalos correctos?

Crear objetos de texto mediante el objeto script

FileSystemObject

INICIO

Obtener valor Count (número de scan final

Calcular valor TIC para cada valor de scan.

Guardar valor de TIC en archivo texto de intensidades.

Guardar valor variable en archivo texto de variables.

Bucle For desde

sustancia 1 hasta n.

Bucle For desde scan

inicial a scan final

Guardar nombre de archivo de datos de análisis en fichero de

texto de objetos.

1

Crear objetos de automatización del

GCMSSolutions

2. Arquitectura del Software..

68

Figura 2.14 (continuación). Diagrama de flujo de algoritmo del botón de comando Crear ficheros de TIC’s.

En el fichero de texto donde se guardan los datos de TIC de todos los objetos incluidos en el estudio se estructura la información de la siguiente forma:

Scan1 Scan2 Scan3 Scan4 Scan5 Objeto1 TIC1,1 TIC1,2 TIC1,3 TIC1,4 TIC1,5 Objeto2 TIC2,1 TIC2,2 TIC2,3 TIC2,4 TIC2,5 Objeto3 TIC3,1 TIC3,2 TIC3,3 TIC3,4 TIC3,5

Figura 2.15. Estructura del fichero de texto donde se guardan los TIC’s.

Dentro del bucle interior se va ejecutando en cada iteración la orden de escribir el dato de TIC y del nombre de variable en los ficheros de texto correspondientes.

En el bucle exterior, que se ejecuta tantas veces como archivos de sustancias analizadas hay, se incluyen las instrucciones necesarias para obtener el nombre del objeto y escribirlo en el fichero de texto en el que se guardarán todos los nombres de los objetos.

Cuando la ejecución del programa sale de los bucles los ficheros de texto estarán completados con toda la información. Ya sólo queda cerrar los ficheros de texto creados con el FileSystemObject y liberarlos junto con los objetos de automatización del GCMSSolutions creados para obtener los datos de los análisis.

1

Liberar objetos de texto creados mediante FileSystemObject.

FIN

Liberar objetos de automatización del GCMSSolutions

Cerrar objetos de texto creados mediante FileSystemObject.

2. Arquitectura del Software..

69

2.6.3.3.2 Botón de Comando “Crear ficheros de intensidades absolutas...”.

En el módulo de código del formulario desarrollado para crear los ficheros de texto se encuentran las instrucciones ligadas al botón de comando Crear ficheros de intensidades absolutas. El algoritmo que implementan estas instrucciones se describe en este apartado. En la figura 2.17 se describe este algoritmo mediante un diagrama de flujo.

Este algoritmo está asociado al evento clic del botón de comando. Cuando el usuario pulse el botón se ejecutarán todas las instrucciones que componen el algoritmo.

En primer lugar se declaran las variables de carácter local en relación al procedimiento. Entre estas variables destacan los objetos de texto creados mediante la interfaz de automatización que proporciona el objeto FileSystemObject. En estos ficheros de texto se guardarán los datos de los análisis. También se declaran las variables donde se guardan los límites de los intervalos introducidos por el usuario, las variables que guardarán los contadores de los bucles que se utilizan en el algoritmo...

A continuación se crearán los objetos de texto que permitirán crear los archivos de texto. Para ello se crea un objeto FileSystemObject mediante el servidor de automatización scripting. Se crean tres ficheros de texto donde se guardarán los valores de las intensidades, los nombres de las variables que en este caso son los del tipo s134m45 (son strings que indican tiempo y masa a los que corresponde el valor de intensidad) y los nombres de las sustancias.

El siguiente paso consiste en comprobar si el usuario ha introducido todos los límites requeridos para definir los datos seleccionados para el estudio. Si existe algún error en los datos introducidos por el usuario aparecerá un cuadro de diálogo en el que se informará al usuario del error. El siguiente paso consiste en crear los objetos de automatización del GCMSSolution que contiene los datos de los análisis.

La serie de instrucciones siguientes están formadas por una serie de bucles FOR anidados. Concretamente se trata de cuatro bucles FOR anidados. La ejecución de estos bucles tiene por objetivo ir obteniendo uno a uno los datos requeridos por el usuario y guardarlos en los ficheros de texto correspondientes. Son necesarios tantos bucles porque cada valor de intensidad depende de varias variables (la sustancia a la que pertenece, el scan en que se ha detectado el valor y la masa a la que pertenece).El primero de los bucles, y el más externo, se ejecuta para el número de sustancias (objetos) del estudio. El segundo bucle FOR se ejecuta para todos los valores de scans incluidos en los intervalos indicados por el usuario. Para cada valor de scan se debe efectuar un barrido con todos los valores de masa que se deben incluir en el fichero. Por este motivo se ejecuta otro bucle FOR en el interior del segundo.Así se obtendrá un valor de intensidad que corresponde a una masa y a un instante de análisis (scan) determinados. Finalmente se ha añadido un bucle más dentro del tercer bucle FOR debido a una imprecisión propia del software GCMSSolution. Cuando se obtienen los datos de las masas detectadas se obtienen valores de masas con decimales. Esto no tiene sentido desde el punto de vista químico ya que las masas en unidades de u.m.a deben ser valores enteros. Para evitar errores en la adquisición de los datos se ha implementado este bucle FOR. El cometido de este bucle consiste en realizar un barrido para un mismo valor de masa y sumar los valores de intensidad obtenidos. Supongamos que se obtienen unos valores de masa 35 y 35.2 a los cuales les corresponden unos valores de intensidad de 10000 y 30000. El cuarto bucle FOR guardará estos valores y los sumará, obteniéndose así un valor total para la masa 35 de 40000. Este valor debería ser el correcto. Normalmente cuando se obtienen dos valores para una misma masa uno de

2. Arquitectura del Software..

70

ellos contiene un valor de intensidad y el otro un valor cero. Pero para evitar problemas debido a que en los valores obtenidos del GCMSSolution se obtienen valores de masas con decimales se decidió implementar este cuarto bucle FOR.

Una vez ejecutados los cuatro bucles FOR los ficheros de texto contienen toda la información solicitada por el usuario.

Cabe destacar la estructura en que se dispone la información para el fichero de texto en el que se guardan las intensidades obtenidas:

... s100m45 s100m46 ... s101m45 s101m46 ... Objeto1 ... Int_abs(1,1) Int_abs(1,2) ... Int_abs(1,4) Int_abs(1,5) ... Objeto2 ... Int_abs(2,1) Int_abs(2,2) ... Int_abs(2,4) Int_abs(2,5) ... Objeto3 ... Int_abs(3,1) Int_abs(3,2) ... Int_abs(3,4) Int_abs(3,5) ...

Figura 2.16. Estructura del fichero de texto donde se guardan las intensidades absolutas.

Se puede observar que los datos constituyen un espacio de 3 dimensiones (tiempo, masa e intensidad) pero se disponen en una matriz de 2 dimensiones. Esta forma de estructurar la información es debido a que posteriormente se aplicará el algoritmo de PCA a los datos y no es posible aplicarlo a una matriz de 3 dimensiones.

Cuando la ejecución del programa sale de los bucles los ficheros de texto estarán completados con toda la información. Se habrán creado 3 ficheros de texto a los que el usuario previamente les habrá asignado un nombre. Uno guardará los valores de las intensidades detectadas por el GCMS. Otro guardará los nombres de las variables que servirán para indicar el scan y la masa a las que pertenece cada valor de intensidad. Por último, el tercer fichero guardará los nombres de las sustancias (objetos) incluidas en el estudio.

Al finalizar la construcción de los ficheros de texto aparecerá un cuadro de dialogo con un botón de aceptar informando al usuario que los ficheros con los datos de las sustancias indicadas han sido creados.

Los objetos que se han creado mediante el objeto FileSystemObject y que han servido para crear los ficheros de texto se cerrarán mediante el método close:

Obj_txt_esp_int.Close

Obj_txt_esp_variables.Close

Obj_txt_esp_objetos.Close

Por último se liberan los objetos de automatización creados para comunicarse con el GCMSSolution y los objetos de texto creados con FileSystemObject.

2. Arquitectura del Software..

71

Figura 2.17. Diagrama de flujo del algoritmo del botón de comando Crear ficheros de intensidades absolutas....

T

F

F

T

Declaración de variables locales.

Guardar intervalos introducidos por el usuario

¿Intervalos completos?

Mensaje de aviso al usuario: intervalos

incorrectos

¿Intervalos correctos?

Crear objetos de texto mediante el objeto script

FileSystemObject

INICIO

Obtener valor ScanCount (número de scan final)

Obtener valor SpectrumCount (número de masas detectadas)

Calcular valor de intensidad para una masa determinada.

Guardar valor intensidad en archivo texto de intensidades.

Bucle FOR desde

sustancia 1 hasta n.

Bucle FOR desde scan

inicial a scan final

1

Crear objetos de automatización del

GCMSSolutions

FOR j= masa ini to masa

final

FOR k=1 to

SpectrumCount

Intensidad = 0

Guardar nombre archivo datos de análisis en fichero texto de objetos.

2. Arquitectura del Software..

72

Figura 2.17 (cont.) . Diagrama de flujo del algoritmo del botón de comando Crear ficheros de intensidades absolutas....

1

Liberar objetos de texto creados mediante FileSystemObject.

FIN

Liberar objetos de automatización del GCMSSolutions

Cerrar objetos de texto creados mediante FileSystemObject.

Mensaje de aviso: “Ficheros de texto

creados”

2. Arquitectura del Software..

73

2.6.3.3.3 Botón de Comando “Crear ficheros de intensidades relativas...”.

En el módulo de código del formulario desarrollado para crear los ficheros de texto se encuentran las instrucciones ligadas al botón de comando Crear ficheros de intensidades relativas. El algoritmo que implementan estas instrucciones se describe en este apartado. En la figura 2.19 se describe este algoritmo mediante un diagrama de flujo.

Este algoritmo está asociado al evento clic del botón de comando. Cuando el usuario pulse el botón se ejecutarán todas las instrucciones que componen el algoritmo.

En primer lugar se declaran las variables de carácter local en relación al procedimiento. Entre estas variables destacan los objetos de texto creados mediante la interfaz de automatización que proporciona el objeto FileSystemObject. En estos ficheros de texto se guardarán los datos de los análisis. También se declaran las variables donde se guardan los límites de los intervalos introducidos por el usuario, las variables que guardarán los contadores de los bucles que se utilizan en el algoritmo...

A continuación se crearán los objetos de texto que permitirán crear los archivos de texto. Para ello se crea un objeto FileSystemObject mediante el servidor de automatización scripting. Se crean tres ficheros de texto donde se guardarán los valores de las intensidades relativas, los nombres de las variables que en este caso son los del tipo s134m45 (son strings que indican tiempo y masa a los que corresponde el valor de intensidad) y los nombres de las sustancias.

El siguiente paso consiste en comprobar si el usuario ha introducido todos los límites requeridos para definir los datos seleccionados para el estudio. Si existe algún error en los datos introducidos por el usuario aparecerá un cuadro de diálogo en el que se informará al usuario del error. El siguiente paso consiste en crear los objetos de automatización del GCMSSolution que contiene los datos de los análisis.

La serie de instrucciones siguientes están formadas por una serie de bucles FOR anidados. Concretamente se trata de cuatro bucles FOR anidados. La ejecución de estos bucles tiene por objetivo ir obteniendo uno a uno los datos requeridos por el usuario y guardarlos en los ficheros de texto correspondientes. Son necesarios tantos bucles porque cada valor de intensidad depende de varias variables (la sustancia a la que pertenece, el scan en que se ha detectado el valor y la masa a la que pertenece).El primero de los bucles, y el más externo, se ejecuta para el número de sustancias (objetos) del estudio. El segundo bucle FOR se ejecuta para todos los valores de scans incluidos en los intervalos indicados por el usuario. Para cada valor de scan se debe efectuar un barrido con todos los valores de masa que se deben incluir en el fichero. Por este motivo se ejecuta otro bucle FOR en el interior del segundo.Así se obtendrá un valor de intensidad que corresponde a una masa y a un instante de análisis (scan) determinados. Finalmente se ha añadido un bucle más dentro del tercer bucle FOR debido a una imprecisión propia del software GCMSSolution. Cuando se adquieren los datos de las masas detectadas se obtienen valores de masas con decimales. Esto no tiene sentido desde el punto de vista químico ya que las masas en unidades de u.m.a deben ser valores enteros. Para evitar errores en la adquisición de los datos se ha implementado este bucle FOR. El cometido de este bucle consiste en realizar un barrido para un mismo valor de masa y sumar los valores de intensidad obtenidos. Supongamos que se obtienen unos valores de masa 35 y 35.2 a los cuales les corresponden unos valores de intensidad de 10000 y 30000. El cuarto bucle FOR guardará estos valores y los sumará, obteniéndose así un valor total para la masa 35 de 40000. Este valor debería ser el correcto. Normalmente cuando se obtienen dos valores para una misma masa uno de

2. Arquitectura del Software..

74

ellos contiene un valor de intensidad y el otro un valor cero. Pero para evitar problemas debido a que en los valores obtenidos del GCMSSolution se obtienen valores de masas con decimales se decidió implementar este cuarto bucle FOR.

En la misma iteración del bucle en que se obtiene el valor de intensidad absoluta para una determinada masa se obtiene el valor de intensidad absoluta del pico base del espectrograma al que pertenece la masa. Con este valor de pico base se podrá calcular el valor de intensidad relativa de la masa. Para ello se multiplica el valor de la intensidad absoluta por 100 y se divide por el valor de intensidad del pico base. En las siguientes líneas de código extraídas del programa IDAMAT se muestra como se realiza este cálculo:

Int_BasePeak = ObjetoMSSpectrum.BasePeakIntensity

(...)

IntensidadRelativa = CCur(intensidad * 100 / Int_BasePeak)

Una vez ejecutados los cuatro bucles FOR los ficheros de texto estarán completos con toda la información solicitada por el usuario.

Cabe destacar la estructura en que se dispone la información para el fichero de texto en el que se guardan las intensidades relativas obtenidas:

... s100m45 s100m46 ... s101m45 s101m46 ... Objeto1 ... Int_rel(1,1) Int_rel(1,2) ... Int_rel(1,4) Int_rel(1,5) ... Objeto2 ... Int_rel(2,1) Int_rel(2,2) ... Int_rel(2,4) Int_rel(2,5) ... Objeto3 ... Int_rel(3,1) Int_rel(3,2) ... Int_rel(3,4) Int_rel(3,5) ...

Figura 2.18. Estructura del fichero de texto donde se guardan las intensidades relativas.

Se puede observar que los datos constituyen un espacio de 3 dimensiones (tiempo, masa e intensidad) pero se disponen en una matriz de 2 dimensiones. Esta forma de estructurar la información es debido a que posteriormente se aplicarará el algoritmo de PCA a los datos y no es posible aplicarlo a una matriz de 3 dimensiones.

Se habrán creado 3 ficheros de texto a los que el usuario previamente les habrá asignado un nombre. Uno guardará los valores de las intensidades detectadas por el GCMS. Otro guardará los nombres de las variables que servirán para indicar el scan y la masa a las que pertenece cada valor de intensidad. Por último, el tercer fichero guardará los nombres de las sustancias (objetos) incluidas en el estudio.

2. Arquitectura del Software..

75

Figura 2.19. Diagrama de flujo del algoritmo del botón de comando Crear ficheros de intensidades relativas....

T

F

F

T

Declaración de variables locales.

Guardar intervalos introducidos por el usuario

¿Intervalos completos?

Mensaje de aviso al usuario: intervalos

incorrectos

¿Intervalos correctos?

Crear objetos de texto mediante el objeto script

FileSystemObject

INICIO

Obtener valor ScanCount (número de scan final)

Obtener valor SpectrumCount (número de masas detectadas)

Calcular valor de intensidad absoluta. Obtener valor

intensidad Pico Base. Calcular valor de intensidad relativa.

Guardar valor intensidad en archivo texto de intensidades.

Bucle FOR desde

sustancia 1 hasta n.

Bucle FOR desde scan

inicial a scan final

1

Crear objetos de automatización del

GCMSSolutions

FOR j= masa ini to masa

final

FOR k=1 to

SpectrumCount

Intensidad = 0

Guardar nombre archivo datos de análisis en fichero texto de objetos.

2. Arquitectura del Software..

76

Figura 2.19 (cont.) . Diagrama de flujo del algoritmo del botón de comando Crear ficheros de intensidades relativas....

Al finalizar la construcción de los ficheros de texto aparecerá un cuadro de dialogo con un botón de aceptar informando al usuario que los ficheros con los datos de las sustancias indicadas han sido creados.

Los objetos que se han creado mediante el objeto FileSystemObject y que han servido para crear los ficheros de texto se cerrarán mediante el método close:

Obj_txt_esp_int.Close

Obj_txt_esp_variables.Close

Obj_txt_esp_objetos.Close

Por último se liberan los objetos de automatización creados para comunicarse con el GCMSSolution y los objetos de texto creados con FileSystemObject.

1

Liberar objetos de texto creados mediante FileSystemObject.

FIN

Liberar objetos de automatización del GCMSSolutions

Cerrar objetos de texto creados mediante FileSystemObject.

Mensaje de aviso: “Ficheros de texto

creados”

2. Arquitectura del Software..

77

2.6.3.4 Módulo de Código del Formulario de PCA’s.

2.6.3.4.1 Botón de Comando “Crear matrices de cromatografía sin alinear”.

En el módulo de código del formulario desarrollado para crear las matrices de datos se encuentran las instrucciones ligadas al botón de comando Crear matrices de cromatografía sin alinear. El algoritmo implementado por estas instrucciones se describe en este apartado. En la figura 2.20 se describe este algoritmo mediante un diagrama de flujo.

Este algoritmo está asociado al evento clic del botón de comando. Cuando el usuario pulse el botón se ejecutarán todas las instrucciones ligadas a este evento.

En primer lugar se declaran las variables de carácter local al procedimiento click del botón. Entre estas variables destacan los objetos de automatización creados para comunicarse con la interfaz de automatización que proporciona el GCMSSolutions. También se declaran las variables donde se guardan los límites de los intervalos introducidos por el usuario, las variables que guardarán los contadores de los bucles que se utilizan en el algoritmo, las matrices donde se van a guardar los datos de los análisis y que posteriormente se pasarán a un workspace de MATLAB...

A continuación se guardan los límites de los intervalos introducidos por el usuario en variables locales al procedimiento.

El siguiente paso consiste en comprobar si el usuario ha introducido todos los límites requeridos para indicar los intervalos que se van a incluir en el estudio. Seguidamente se comprueba si los intervalos introducidos son correctos: si los caracteres corresponden a valores numéricos y si los valores iniciales de un intervalo son menores que los valores finales. En caso contrario el sistema no creará las matrices con los datos de los análisis. Aparecerá un cuadro de dialogo en el que se informará al usuario del error. Éste deberá volver a introducir los valores correctos y pulsar de nuevo el botón de comando de Crear matrices de cromatografía sin alinear.

Si los datos introducidos por el usuario son correctos continuará la ejecución de las instrucciones. Se redimensionarán las tres matrices que se han declarado al inicio del procedimiento asignándoles el tamaño que se ha calculado a partir de los intervalos introducidos por el usuario. En estas matrices de datos se guardarán los valores de TIC’s, los nombres de las variables que en este caso son los scans y los nombres de las sustancias que se han incluido en el estudio que en terminología química se denominan objetos.

. El siguiente paso consiste en crear los objetos de automatización del GCMSSolution que permitirán la obtención de los datos de los análisis. Para ello se utilizarán las instrucciones que se vieron en apartados anteriores como CreateObject.

A continuación se ejecutan dos bucles FOR anidados que tienen como objetivo construir las matrices con los datos. Los valores de TIC’s constituyen una matriz de dos dimensiones ya que cada valor de intensidad depende de dos parámetros: tiempo (scan) y objeto (sustancia analizada). El primer bucle FOR efectúa un barrido por todos los objetos que el usuario ha incluido en el listado correspondiente del formulario. Para cada sustancia se ejecutará el bucle FOR que se encuentra en el interior del primero. Este segundo bloque FOR efectúa un barrido a través de todos los scans del cromatograma de todas las sustancias. De esta forma se irá construyendo la matriz dato a dato. Se obtendrá un valor y se escribirá guardará en lugar de la matriz que le corresponde.

2. Arquitectura del Software..

78

Figura 2.20. Diagrama de flujo del algoritmo del botón de comando Crear matrices de cromatografía sin alinear.

T

F

F

T

Declaración de variables locales.

Guardar intervalos introducidos por el usuario

¿Intervalos completos?

Mensaje de aviso al usuario: intervalos

incorrectos

¿Intervalos correctos?

Redimensionar las matrices con el tamaño apropiado calculado en

función de los intervalos

INICIO

Obtener valor Count (número de scan final)

Obtener valor TIC para cada scan.

Guardar valor de TIC en matriz de TIC’s.

Guardar valor variable en matriz de variables.

Bucle For desde

sustancia 1 hasta n.

Bucle For desde scan

inicial a scan final

Guardar nombre de archivo de datos de análisis en matriz de

objetos.

1

Crear objetos de automatización del

GCMSSolutions

2. Arquitectura del Software..

79

Figura 2.20. Diagrama de flujo del algoritmo del botón de comando Crear matrices de cromatografía sin alinear.

En la matriz donde se guardan los datos de TIC de todos los objetos incluidos en el estudio se estructura la información de la siguiente forma:

Scan1 Scan2 Scan3 Scan4 Scan5 Objeto1 TIC1,1 TIC1,2 TIC1,3 TIC1,4 TIC1,5 Objeto2 TIC2,1 TIC2,2 TIC2,3 TIC2,4 TIC2,5 Objeto3 TIC3,1 TIC3,2 TIC3,3 TIC3,4 TIC3,5

Figura 2.21. Estructura de la matriz donde se guardan los TIC’s.

Dentro del bucle interior se va ejecutando en cada iteración la orden de escribir el dato de TIC y del nombre de variable en las posiciones de las matrices correspondientes.

En el bucle exterior, que se ejecuta tantas veces como archivos de sustancias analizadas hay, se incluyen las instrucciones necesarias para obtener el nombre del objeto y escribirlo en la matriz en la que se guardarán todos los nombres de los objetos.

Cuando la ejecución del programa sale de los bucles todas las matrices se habrán completado con toda la información solicitada. En este momento se liberan los objetos de automatización del GCMSSolutions creados para obtener los datos de los análisis. Finalmente se crea un objeto de automatización de MATLAB para trasladar las matrices de datos a un workspace de MATLAB.

1

FIN

Liberar objetos de automatización del GCMSSolutions

Crear objeto de automatización MATLAB.

Escribir matrices en workspace de MATLAB.

Mensaje de aviso: “Matrices de datos

creadas”

2. Arquitectura del Software..

80

2.6.3.4.2 Botón de Comando “Crear matrices de cromatografía alineadas”.

En el módulo de código del formulario desarrollado para crear las matrices de datos se encuentran las instrucciones ligadas al botón de comando Crear matrices de cromatografía alineadas. El algoritmo implementado por estas instrucciones se describe en este apartado. En la figura 2.22 se describe este algoritmo mediante un diagrama de flujo.

Este algoritmo está asociado al evento click del botón de comando. Cuando el usuario pulse el botón se ejecutarán todas las instrucciones asociadas.

En primer lugar se declaran las variables de carácter local al procedimiento click del botón. Entre estas variables destacan los objetos de automatización creados para comunicarse con la interfaz de automatización que proporciona el GCMSSolutions. También se declaran las variables donde se guardan los límites de los intervalos introducidos por el usuario, las variables que guardarán los contadores de los bucles que se utilizan en el algoritmo, las matrices donde se van a guardar los datos de los análisis y que posteriormente se pasarán a un workspace de MATLAB, la matriz de TIC’s y el vector DESPLA que servirán para realizar el alineamiento...

A continuación se guardan los límites de los intervalos introducidos por el usuario en variables locales al procedimiento.

El siguiente paso consiste en comprobar si el usuario ha introducido todos los límites requeridos para indicar los intervalos que se van a incluir en el estudio. Seguidamente se comprueba si los intervalos introducidos son correctos: si los caracteres corresponden a valores numéricos y si los valores iniciales de un intervalo son menores que los valores finales. En caso contrario el sistema no creará las matrices con los datos de los análisis. Aparecerá un cuadro de dialogo en el que se informará al usuario del error. Éste deberá volver a introducir los valores correctos y pulsar de nuevo el botón de comando de Crear matrices de cromatografía alineadas.

Si los datos introducidos por el usuario son correctos continuará la ejecución de las instrucciones. El siguiente paso del algoritmo consiste en obtener los valores de desplazamiento de cada sustancia. Para realizar el alineamiento de los datos es necesario, en primer lugar, seleccionar una de las sustancias que servirá como referencia. Todas las demás sustancias se alinearán en función de la sustancia de referencia y se modificarán los datos temporales en función del desplazamiento que tengan.

Para calcular el desplazamiento de cada sustancia se utiliza la matriz con los datos de cromatografía (TIC’s) de todas las sustancias. Una vez construida esta matriz, se crea un objeto de automatización de MATLAB. Se trasladará la matriz de TIC’s al workspace temporal creado junto con la variable que indica cual es la sustancia que el usuario ha seleccionado como referencia. Con estos dos datos se ejecutará la función ObtenerDesplazamiento en el workspace de MATLAB. Esta función se vale de la función crosscorr que provee MATLAB para calcular las correlaciones cruzadas entre dos series temporales. Como resultado de ejecutar la función ObtenerDesplazamiento se obtiene el vector DESPLA. Este vector tendrá tantos elementos como sustancias se hayan incluido en el estudio. Cada uno de los elementos indica el desplazamiento cada sustancia con respecto a la de referencia. Lógicamente, el valor para el elemento que corresponda a la sustancia de referencia será cero. Si, por ejemplo, se han seleccionado 10 sustancias para estudiar el vector DESPLA será un array de 10 elementos. Si se toma como referencia para el alineamiento a la sustancia 7, el elemento que ocupe esta posición en el vector DESPLA tendrá un valor de 0.

2. Arquitectura del Software..

81

Una vez calculado del vector DESPLA en el workspace de MATLAB se trasladará al programa IDAMAT para poder utilizar la información que contiene para realizar el alineamiento.

A continuación se redimensionarán las tres matrices que se han declarado al inicio del procedimiento asignándoles el tamaño que se ha calculado a partir de los intervalos introducidos por el usuario. En estas matrices de datos se guardarán los valores de TIC’s alineados, los nombres de las variables que en este caso son los scans y los nombres de las sustancias que se han incluido en el estudio que en terminología química se denominan objetos.

.El siguiente paso consiste en crear los objetos de automatización del GCMSSolution que permitirán la obtención de los datos de los análisis. Para ello se utilizarán las instrucciones que se vieron en apartados anteriores como CreateObject.

Posteriormente se ejecutan dos bucles FOR anidados que tienen como objetivo construir las matrices con los datos. Los valores de TIC’s constituyen una matriz de dos dimensiones ya que cada valor de intensidad depende de dos parámetros: tiempo (scan) y objeto (sustancia analizada). El primer bucle FOR efectúa un barrido por todos los objetos que el usuario ha incluido en el listado correspondiente del formulario. Para cada sustancia se ejecutará el bucle FOR que se encuentra en el interior del primero. Este segundo bloque FOR efectúa un barrido a través de todos los scans del cromatograma de todas las sustancias. De esta forma se irá construyendo la matriz dato a dato. Se obtendrá un valor y se escribirá guardará en lugar de la matriz que le corresponde.

La matriz se construirá de forma que en el momento de guardar el valor de la intensidad se tendrá en cuenta el valor de desplazamiento de cada sustancia. Por ejemplo, supongamos que se están guardando los valores para el scan 100 de la sustancia 4. Supongamos que esta sustancia está retrasada con respecto a la de referencia 3 scans. Si no se tuviera en cuenta el desplazamiento se obtendría el valor de TIC para el scan 100 de la sustancia 4 con la instrucción siguiente:

intensidad_TIC = Dato_intensidad_TIC(i)

donde i sería el valor de scan (3). Pero para realizar el alineamiento en lugar de coger el valor de scan que corresponde a la iteración del bucle FOR se tiene en cuenta el valor de desplazamiento y se le suma al valor de scan:

d = i + MTRZ_DESPLA_Real(n + 1)

intensidad_TIC = Dato_intensidad_TIC(d)

La variable “d” contiene el resultado de la suma de scan (100) y el desplazamiento (3) por lo que es estaría guardando el valor de la intensidad para el scan 103. De esta forma se realiza el alineamiento al mismo tiempo que se va construyendo la matriz que contiene los datos de cromatografía (TIC’s).

2. Arquitectura del Software..

82

Figura 2.22. Diagrama de flujo del algoritmo del botón de comando Crear matrices de cromatografía alineadas.

T

F

F

T

Declaración de variables locales.

Guardar intervalos introducidos por el usuario

¿Intervalos completos?

Mensaje de aviso al usuario: intervalos

incorrectos

¿Intervalos correctos?

Redimensionar la matriz de TIC’s y la matriz del vector de desplazamientos con

el tamaño en función de los intervalos

INICIO

Obtener valor Count (número de scan final)

Obtener valor TIC para cada scan.

Guardar valor de TIC en matriz de TIC’s.

Guardar valor del objeto de referencia para alinear.

Bucle For desde

sustancia 1 hasta n. Bucle For

desde scan inicial a

scan final

1

Crear objetos de automatización del

GCMSSolutions

2. Arquitectura del Software..

83

Figura 2.22. Diagrama de flujo del algoritmo del botón de comando Crear matrices de cromatografía alineadas.

Redimensionar las matrices de datos con el tamaño apropiado calculado en

función de los intervalos

Obtener valor Count (número de scan final)

Obtener valor TIC para cada scan teniendo en cuenta el

desplazamiento: d = i + despla(n)

Guardar valor de TIC en matriz de TIC’s alineados.

Guardar valor variable en matriz de variables.

Bucle For desde

sustancia 1 hasta n. Bucle For

desde scan inicial a

scan final

Guardar nombre de archivo de datos de análisis en fichero de

texto de objetos.

2

Crear objetos de automatización del

GCMSSolutions

1

Crear objeto de automatización MATLAB.

Trasladar matriz de TIC’s a workspace de MATLAB.

Ejecutar función ObtenerDesplazamiento en el

workspace de MATLAB.

Trasladar vector DESPLA desde MATLAB a programa IDAMAT.

2. Arquitectura del Software..

84

Figura 2.22. Diagrama de flujo del algoritmo del botón de comando Crear matrices de cromatografía alineadas.

En la matriz donde se guardan los datos alineados de TIC(Total Ion Chromatography) de todos los objetos incluidos en el estudio se estructura la información de la siguiente forma:

Scan1 Scan2 Scan3 Scan4 Scan5 Objeto1 TIC1,1 TIC1,2 TIC1,3 TIC1,4 TIC1,5 Objeto2 TIC2,1 TIC2,2 TIC2,3 TIC2,4 TIC2,5 Objeto3 TIC3,1 TIC3,2 TIC3,3 TIC3,4 TIC3,5

Figura 2.23. Estructura de la matriz donde se guardan los TIC’s alineados.

Dentro del bucle interior se va ejecutando en cada iteración la orden de escribir el dato de TIC y del nombre de variable en las posiciones de las matrices correspondientes.

En el bucle exterior, que se ejecuta tantas veces como archivos de sustancias analizadas hay, se incluyen las instrucciones necesarias para obtener el nombre del objeto y escribirlo en la matriz en la que se guardarán todos los nombres de los objetos.

Cuando la ejecución del programa sale de los bucles todas las matrices se habrán completado con toda la información solicitada. En este momento se liberan los objetos de automatización del GCMSSolutions creados para obtener los datos de los análisis. Finalmente se crea un objeto de automatización de MATLAB para trasladar las matrices de datos a un workspace de MATLAB.

2

FIN

Liberar objetos de automatización del GCMSSolutions

Crear objeto de automatización MATLAB.

Escribir matrices de TIC’s alineados en workspace de MATLAB.

Mensaje de aviso: “Matrices de datos alineados creadas”

2. Arquitectura del Software..

85

2.6.3.4.3 Botón de Comando “Crear matrices de espectrometría sin alinear (intensidades absolutas)”.

En el módulo de código del formulario para crear las PCA’s se encuentran las instrucciones ligadas al botón de comando Crear matrices de espectrometría sin alinear (intensidades absolutas).... El algoritmo que implementan estas instrucciones se describe en este apartado. En la figura 2.25 se describe este algoritmo mediante un diagrama de flujo.

Este algoritmo está asociado al evento clic del botón de comando. Cuando el usuario pulse el botón se ejecutarán todas las instrucciones que componen el algoritmo.

En primer lugar se declaran las variables de carácter local en relación al procedimiento. Entre estas variables destacan las matrices donde se guardarán los datos de los análisis. También se declaran las variables donde se guardan los límites de los intervalos introducidos por el usuario, las variables que guardarán los contadores de los bucles que se utilizan en el algoritmo...

El siguiente paso consiste en comprobar si el usuario ha introducido todos los límites requeridos para definir los datos seleccionados para el estudio. Si existe algún error en los datos introducidos por el usuario aparecerá un cuadro de diálogo en el que se informará al usuario del error.

A continuación se redimensionarán las tres matrices que se han declarado al inicio del procedimiento asignándoles el tamaño que se ha calculado a partir de los intervalos introducidos por el usuario. En estas matrices de datos se guardarán los valores de intensidades absolutas, los nombres de las variables que son strings que indican el scan y la masa a los que pertenece cada valor de intensidad y los nombres de las sustancias que se han incluido en el estudio.

.El siguiente paso consiste en crear los objetos de automatización del GCMSSolution que permitirán la obtención de los datos de los análisis realizados.

La serie de instrucciones siguientes están formadas por una serie de bucles FOR anidados. Concretamente se trata de cuatro bucles FOR anidados. La ejecución de estos bucles tiene por objetivo ir obteniendo uno a uno los datos requeridos por el usuario y guardarlos en la matriz correspondiente. Son necesarios tantos bucles porque cada valor de intensidad depende de varias variables (la sustancia a la que pertenece, el scan en que se ha detectado el valor y la masa a la que pertenece).El primero de los bucles, y el más externo, se ejecuta para el número de sustancias (objetos) del estudio. El segundo bucle FOR se ejecuta para todos los valores de scans incluidos en los intervalos indicados por el usuario. Para cada valor de scan se debe efectuar un barrido con todos los valores de masa. Por este motivo se ejecuta otro bucle FOR en el interior del segundo.Así se obtendrá un valor de intensidad que corresponde a una masa y a un instante de análisis (scan) determinados. Finalmente se ha añadido un bucle más dentro del tercer bucle FOR debido a una imprecisión propia del software GCMSSolution. Cuando se obtienen los datos de las masas detectadas se obtienen valores de masas con decimales. Esto no tiene sentido desde el punto de vista químico ya que las masas en unidades de u.m.a deben ser valores enteros. Para evitar errores en la adquisición de los datos se ha implementado este bucle FOR. El cometido de este bucle consiste en realizar un barrido para un mismo valor de masa y sumar los valores de intensidad obtenidos. Supongamos que se obtienen unos valores de masa 35 y 35.2 a los cuales les corresponden unos valores de intensidad de 10000 y 30000. El cuarto bucle FOR guardará estos valores y los sumará, obteniéndose así un valor total

2. Arquitectura del Software..

86

para la masa 35 de 40000. Este valor debería ser el correcto. Normalmente, cuando existen dos valores para una misma masa uno de ellos contiene un valor de intensidad determinado y el otro un valor cero. Pero para evitar problemas, debido a que en los valores de masas obtenidos del GCMSSolution pueden tener decimales, se decidió implementar este cuarto bucle FOR.

Una vez ejecutados los cuatro bucles FOR las matrices contienen toda la información solicitada por el usuario.

Cabe destacar la estructura en que se dispone la información para la matriz en la que se guardan las intensidades absolutas obtenidas:

... s100m45 S100m46 ... s101m45 s101m46 ... Objeto1 ... Int_abs(1,1) Int_abs(1,2) ... Int_abs(1,4) Int_abs(1,5) ... Objeto2 ... Int_abs(2,1) Int_abs(2,2) ... Int_abs(2,4) Int_abs(2,5) ... Objeto3 ... Int_abs(3,1) Int_abs(3,2) ... Int_abs(3,4) Int_abs(3,5) ...

Figura 2.24. Estructura de la matriz donde se guardan las intensidades absolutas.

Se puede observar que los datos constituyen un espacio de 3 dimensiones (tiempo, masa e intensidad) pero se disponen en una matriz de 2 dimensiones. Esta forma de estructurar la información es debido a que posteriormente se aplicará el algoritmo de PCA a los datos y no es posible aplicarlo a una matriz de 3 dimensiones.

Cuando la ejecución del programa sale de los bucles las matrices estarán completadas con toda la información. Se habrán creado 3 matrices. Una guardará los valores de las intensidades absolutas detectadas por el GCMS para un scan y masa determinados. Otra guardará los nombres de las variables que servirán para indicar el scan y la masa a las que pertenece cada valor de intensidad. Por último, la tercera matriz guardará los nombres de las sustancias (objetos) incluidas en el estudio.

Una vez completadas las matrices aparecerá un cuadro de diálogo con un botón de aceptar informando al usuario que se ha completado la ejecución.

Por último se liberan los objetos de automatización creados para comunicarse con el GCMSSolution .

En este momento las matrices se encuentran en Visual Basic. Para trasladar las matrices a MATLAB se creará un objeto de automatización y se ejecutará el método PutFullMatrix que proporciona la interfaz de automatización que proporciona MATLAB.

2. Arquitectura del Software..

87

Figura 2.25. Diagrama de flujo del algoritmo del botón de comando Crear matrices de espectrometría sin

alinear(intensidades.absolutas).

T

F

F

T

Declaración de variables locales.

Guardar intervalos introducidos por el usuario

¿Intervalos completos?

Mensaje de aviso al usuario: intervalos

incorrectos

¿Intervalos correctos?

INICIO

Obtener valor ScanCount (número de scan final)

Obtener valor SpectrumCount (número de masas detectadas)

Calcular valor de intensidad para una masa determinada.

Guardar valor intensidad en matriz de intensidades.

Guardar variable en matriz de variables

Bucle FOR desde

sustancia 1 hasta n.

Bucle FOR i desde scan

inicial a scan final

1

Crear objetos de automatización del

GCMSSolutions

FOR j= masa ini to masa

final

FOR k=1 to

SpectrumCount

Intensidad = 0

Guardar nombre archivo datos de análisis en matriz de objetos.

Redimensionar las matrices con el tamaño apropiado calculado en

función de los intervalos

2. Arquitectura del Software..

88

Figura 2.25. Diagrama de flujo del algoritmo del botón de comando Crear matrices de espectrometría sin

alinear(intensidades.absolutas).

1

FIN

Liberar objetos de automatización del GCMSSolutions

Crear objeto de automatización MATLAB.

Escribir matrices en workspace de MATLAB.

Mensaje de aviso: “Matrices de datos

creadas”

2. Arquitectura del Software..

89

2.6.3.4.4 Botón de Comando “Crear matrices de espectrometría sin alinear (intensidades relativas)”.

En el módulo de código del formulario para crear las PCA’s se encuentran las instrucciones ligadas al botón de comando Crear matrices de espectrometría sin alinear (intensidades relativas).... El algoritmo que implementan estas instrucciones se describe en este apartado. En la figura 2.25 se describe este algoritmo mediante un diagrama de flujo.

Este algoritmo está asociado al evento clic del botón de comando. Cuando el usuario pulse el botón se ejecutarán todas las instrucciones que componen el algoritmo.

En primer lugar se declaran las variables de carácter local en relación al procedimiento. Entre estas variables destacan las matrices donde se guardarán los datos de los análisis. También se declaran las variables donde se guardan los límites de los intervalos introducidos por el usuario, las variables que guardarán los contadores de los bucles que se utilizan en el algoritmo...

El siguiente paso consiste en comprobar si el usuario ha introducido todos los límites requeridos para definir los datos seleccionados para el estudio. Si existe algún error en los datos introducidos por el usuario aparecerá un cuadro de diálogo en el que se informará al usuario del error.

A continuación se redimensionarán las tres matrices que se han declarado al inicio del procedimiento asignándoles el tamaño que se ha calculado a partir de los intervalos introducidos por el usuario. En estas matrices de datos se guardarán los valores de intensidades relativas, los nombres de las variables que son strings que indican el scan y la masa a los que pertenece cada valor de intensidad y los nombres de las sustancias que se han incluido en el estudio.

.El siguiente paso consiste en crear los objetos de automatización del GCMSSolution que permitirán la obtención de los datos de los análisis realizados.

La serie de instrucciones siguientes están formadas por una serie de bucles FOR anidados. Concretamente se trata de cuatro bucles FOR anidados. La ejecución de estos bucles tiene por objetivo ir obteniendo uno a uno los datos requeridos por el usuario y guardarlos en la matriz correspondiente. Son necesarios tantos bucles porque cada valor de intensidad depende de varias variables (la sustancia a la que pertenece, el scan en que se ha detectado el valor y la masa a la que pertenece).El primero de los bucles, y el más externo, se ejecuta para el número de sustancias (objetos) del estudio. El segundo bucle FOR se ejecuta para todos los valores de scans incluidos en los intervalos indicados por el usuario. Para cada valor de scan se debe efectuar un barrido con todos los valores de masa. Por este motivo se ejecuta otro bucle FOR en el interior del segundo.Así se obtendrá un valor de intensidad que corresponde a una masa y a un instante de análisis (scan) determinados. Finalmente se ha añadido un bucle más dentro del tercer bucle FOR debido a una imprecisión propia del software GCMSSolution. Cuando se obtienen los datos de las masas detectadas se obtienen valores de masas con decimales. Esto no tiene sentido desde el punto de vista químico ya que las masas en unidades de u.m.a deben ser valores enteros. Para evitar errores en la adquisición de los datos se ha implementado este bucle FOR. El cometido de este bucle consiste en realizar un barrido para un mismo valor de masa y sumar los valores de intensidad obtenidos. Supongamos que se obtienen unos valores de masa 35 y 35.2 a los cuales les corresponden unos valores de intensidad de 10000 y 30000. El cuarto bucle FOR guardará estos valores y los sumará, obteniéndose así un valor total

2. Arquitectura del Software..

90

para la masa 35 de 40000. Este valor debería ser el correcto. Normalmente, cuando existen dos valores para una misma masa uno de ellos contiene un valor de intensidad determinado y el otro un valor cero. Pero para evitar problemas, debido a que en los valores de masas obtenidos del GCMSSolution pueden tener decimales, se decidió implementar este cuarto bucle FOR.

En la misma iteración del bucle en que se obtiene el valor de intensidad absoluta para una determinada masa se obtiene el valor de intensidad absoluta del pico base del espectrograma al que pertenece la masa. Con este valor de pico base se podrá calcular el valor de intensidad relativa de la masa. Para ello se multiplica el valor de la intensidad absoluta por 100 y se divide por el valor de intensidad del pico base. En las siguientes líneas de código extraídas del programa IDAMAT se muestra como se realiza este cálculo:

Int_BasePeak = ObjetoMSSpectrum.BasePeakIntensity

(...)

IntensidadRelativa = CCur(intensidad * 100 / Int_BasePeak)

Una vez ejecutados los cuatro bucles FOR las matrices contienen toda la información solicitada por el usuario.

Cabe destacar la estructura en que se dispone la información para la matriz en la que se guardan las intensidades relativas obtenidas:

... s100m45 s100m46 ... s101m45 s101m46 ... Objeto1 ... Int_rel(1,1) Int_rel(1,2) ... Int_rel(1,4) Int_rel(1,5) ... Objeto2 ... Int_rel(2,1) Int_rel(2,2) ... Int_rel(2,4) Int_rel(2,5) ... Objeto3 ... Int_rel(3,1) Int_rel(3,2) ... Int_rel(3,4) Int_rel(3,5) ...

Figura 2.26. Estructura de la matriz donde se guardan las intensidades relativas.

Se puede observar que los datos constituyen un espacio de 3 dimensiones (tiempo, masa e intensidad) pero se disponen en una matriz de 2 dimensiones. Esta forma de estructurar la información es debido a que posteriormente se aplicará el algoritmo de PCA a los datos y no es posible aplicarlo a una matriz de 3 dimensiones.

2. Arquitectura del Software..

91

Figura 2.27. Diagrama de flujo del algoritmo del botón de comando Crear matrices de espectrometría sin

alinear(intensidades relativas).

T

F

F

T

Declaración de variables locales.

Guardar intervalos introducidos por el usuario

¿Intervalos completos?

Mensaje de aviso al usuario: intervalos

incorrectos

¿Intervalos correctos?

INICIO

Obtener valor ScanCount (número de scan final)

Obtener valor SpectrumCount (número de masas detectadas)

Guardar valor intensidad relativa en matriz de

intensidades. Guardar variable en matriz de variables

Bucle FOR desde

sustancia 1 hasta n.

Bucle FOR i desde scan

inicial a scan final

1

Crear objetos de automatización del

GCMSSolutions

FOR j= masa ini to masa

final

FOR k=1 to

SpectrumCount

Intensidad = 0

Guardar nombre archivo datos de análisis en matriz de objetos.

Redimensionar las matrices con el tamaño apropiado calculado en

función de los intervalos

Calcular valor de intensidad absoluta. Obtener valor

intensidad Pico Base. Calcular valor de intensidad relativa.

2. Arquitectura del Software..

92

Figura 2.27. Diagrama de flujo del algoritmo del botón de comando Crear matrices de espectrometría sin

alinear(intensidades relativas).

Cuando la ejecución del programa sale de los bucles las matrices estarán completadas con toda la información. Se habrán creado 3 matrices. Una guardará los valores de las intensidades relativas detectadas por el GCMS para un scan y masa determinados. Otra guardará los nombres de las variables que servirán para indicar el scan y la masa a las que pertenece cada valor de intensidad. Por último, la tercera matriz guardará los nombres de las sustancias (objetos) incluidas en el estudio.

Una vez completadas las matrices aparecerá un cuadro de diálogo con un botón de aceptar informando al usuario que se ha completado la ejecución.

Por último se liberan los objetos de automatización creados para comunicarse con el GCMSSolution .

En este momento las matrices se encuentran en Visual Basic. Para trasladar las matrices a MATLAB se creará un objeto de automatización y se ejecutará el método PutFullMatrix que proporciona la interfaz de automatización que proporciona MATLAB.

1

FIN

Liberar objetos de automatización del GCMSSolutions

Crear objeto de automatización MATLAB.

Escribir matrices en workspace de MATLAB.

Mensaje de aviso: “Matrices de datos

creadas”

2. Arquitectura del Software..

93

2.6.3.4.5 Botón de Comando “Crear matrices de espectrometría alineadas (intensidades absolutas)”.

En el módulo de código del formulario para crear las PCA’s se encuentran las instrucciones ligadas al botón de comando Crear matrices de espectrometría alineadas (intensidades absolutas).... El algoritmo que implementan estas instrucciones se describe en este apartado. En la figura 2.29 se describe este algoritmo mediante un diagrama de flujo.

Este algoritmo está asociado al evento clic del botón de comando. Cuando el usuario pulse el botón se ejecutarán todas las instrucciones que componen el algoritmo.

En primer lugar se declaran las variables de carácter local en relación al procedimiento. Entre estas variables destacan los objetos de automatización creados para comunicarse con la interfaz de automatización que proporciona el GCMSSolutions. También se declaran las variables donde se guardarán los intervalos de datos definidos por el usuario, las variables que guardarán los contadores de los bucles que se utilizan en el algoritmo, las matrices donde se van a guardar los datos de los análisis y que posteriormente se pasarán a un workspace de MATLAB, la matriz de TIC’s y el vector DESPLA que servirán para realizar el alineamiento...

El siguiente paso consiste en comprobar si el usuario ha introducido todos los límites requeridos para definir los datos seleccionados para el estudio. Si existe algún error en los datos introducidos por el usuario aparecerá un cuadro de diálogo en el que se informará al usuario del error.

Si los datos introducidos por el usuario son correctos continuará la ejecución de las instrucciones. Seguidamente se procederá a obtener los valores de desplazamiento de cada sustancia. Para realizar el alineamiento de los datos es necesario, en primer lugar, seleccionar una de las sustancias que servirá como referencia. Todas las demás sustancias se alinearán en función de la sustancia de referencia y se modificarán los datos temporales en función del desplazamiento que tengan.

Para calcular el desplazamiento de cada sustancia se utiliza la matriz con los datos de cromatografía (TIC’s) de todas las sustancias. Una vez construida esta matriz, se crea un objeto de automatización de MATLAB. Se trasladará la matriz de TIC’s al workspace temporal creado junto con la variable que indica cual es la sustancia que el usuario ha seleccionado como referencia. Con estos dos datos se ejecutará la función ObtenerDesplazamiento en el workspace de MATLAB. Esta función se vale de la función crosscorr que provee MATLAB para calcular las correlaciones cruzadas entre dos series temporales. Como resultado de ejecutar la función ObtenerDesplazamiento se obtiene el vector DESPLA. Este vector tendrá tantos elementos como sustancias se hayan incluido en el estudio. Cada uno de los elementos indica el desplazamiento cada sustancia con respecto a la de referencia. Lógicamente, el valor para el elemento que corresponda a la sustancia de referencia será cero. Si, por ejemplo, se han seleccionado 10 sustancias para estudiar el vector DESPLA será un array de 10 elementos. Si se toma como referencia para el alineamiento a la sustancia 7, el elemento que ocupe esta posición en el vector DESPLA tendrá un valor de 0.

Una vez calculado del vector DESPLA en el workspace de MATLAB se trasladará al programa IDAMAT para poder utilizar la información que contiene para realizar el alineamiento.

2. Arquitectura del Software..

94

A continuación se redimensionarán las tres matrices que se han declarado al inicio del procedimiento asignándoles el tamaño que se ha calculado a partir de los intervalos introducidos por el usuario. En estas matrices de datos se guardarán los valores de intensidades absolutas, los nombres de las variables que son strings que indican el scan y la masa a los que pertenece cada valor de intensidad y los nombres de las sustancias que se han incluido en el estudio.

.El siguiente paso consiste en crear los objetos de automatización del GCMSSolution que permitirán la obtención de los datos de los análisis realizados.

La serie de instrucciones siguientes están formadas por una serie de bucles FOR anidados. Concretamente se trata de cuatro bucles FOR anidados. La ejecución de estos bucles tiene por objetivo ir obteniendo uno a uno los datos requeridos por el usuario y guardarlos en la matriz correspondiente. Son necesarios tantos bucles porque cada valor de intensidad depende de varias variables (la sustancia a la que pertenece, el scan en que se ha detectado el valor y la masa a la que pertenece).El primero de los bucles, y el más externo, se ejecuta para el número de sustancias (objetos) del estudio. El segundo bucle FOR se ejecuta para todos los valores de scans incluidos en los intervalos indicados por el usuario. Para cada valor de scan se debe efectuar un barrido con todos los valores de masa. Por este motivo se ejecuta otro bucle FOR en el interior del segundo.Así se obtendrá un valor de intensidad que corresponde a una masa y a un instante de análisis (scan) determinados. Finalmente se ha añadido un bucle más dentro del tercer bucle FOR debido a una imprecisión propia del software GCMSSolution. Cuando se obtienen los datos de las masas detectadas se obtienen valores de masas con decimales. Esto no tiene sentido desde el punto de vista químico ya que las masas en unidades de u.m.a deben ser valores enteros. Para evitar errores en la adquisición de los datos se ha implementado este bucle FOR. El cometido de este bucle consiste en realizar un barrido para un mismo valor de masa y sumar los valores de intensidad obtenidos. Supongamos que se obtienen unos valores de masa 35 y 35.2 a los cuales les corresponden unos valores de intensidad de 10000 y 30000. El cuarto bucle FOR guardará estos valores y los sumará, obteniéndose así un valor total para la masa 35 de 40000. Este valor debería ser el correcto. Normalmente, cuando existen dos valores para una misma masa uno de ellos contiene un valor de intensidad determinado y el otro un valor cero. Pero para evitar problemas, debido a que en los valores de masas obtenidos del GCMSSolution pueden tener decimales, se decidió implementar este cuarto bucle FOR.

La matriz se construirá de forma que en el momento de guardar el valor de la intensidad se tendrá en cuenta el valor de desplazamiento de cada sustancia. Por ejemplo, supongamos que se están guardando los valores para el scan 100 de la sustancia 4. Supongamos que esta sustancia está retrasada con respecto a la de referencia 3 scans. Si no se tuviera en cuenta el desplazamiento se obtendría el valor de TIC para el scan 100 de la sustancia 4 con la instrucción siguiente:

intensidad = DataIntensidad(i)

donde i sería el valor de scan (3). Pero, para realizar el alineamiento, en lugar de coger el valor de scan que corresponde a la iteración del bucle FOR se tiene en cuenta el valor de desplazamiento y se le suma al valor de scan:

d = i + MTRZ_DESPLA_Real(n + 1)

2. Arquitectura del Software..

95

intensidad= DataIntensidad_TIC(d)

La variable “d” contiene el resultado de la suma de scan (100) y el desplazamiento (3) por lo que es estaría guardando el valor de la intensidad para el scan 103. De esta forma se realiza el alineamiento al mismo tiempo que se va construyendo la matriz que contiene los datos de cromatografía (TIC’s).

Una vez ejecutados los cuatro bucles FOR las matrices contienen toda la información solicitada por el usuario.

Cabe destacar la estructura en que se dispone la información para la matriz en la que se guardan las intensidades absolutas obtenidas:

... s100m45 S100m46 ... s101m45 s101m46 ... Objeto1 ... Int_abs(1,1) Int_abs(1,2) ... Int_abs(1,4) Int_abs(1,5) ... Objeto2 ... Int_abs(2,1) Int_abs(2,2) ... Int_abs(2,4) Int_abs(2,5) ... Objeto3 ... Int_abs(3,1) Int_abs(3,2) ... Int_abs(3,4) Int_abs(3,5) ...

Figura 2.28. Estructura de la matriz donde se guardan las intensidades absolutas alineadas.

Se puede observar que los datos constituyen un espacio de 3 dimensiones (tiempo, masa e intensidad) pero se disponen en una matriz de 2 dimensiones. Esta forma de estructurar la información es debido a que posteriormente se aplicará el algoritmo de PCA a los datos y no es posible aplicarlo a una matriz de 3 dimensiones.

Cuando la ejecución del programa sale de los bucles las matrices estarán completadas con toda la información. Se habrán creado 3 matrices. Una guardará los valores de las intensidades absolutas detectadas por el GCMS para un scan y masa determinados. Otra guardará los nombres de las variables que servirán para indicar el scan y la masa a las que pertenece cada valor de intensidad. Por último, la tercera matriz guardará los nombres de las sustancias (objetos) incluidas en el estudio.

Una vez completadas las matrices aparecerá un cuadro de diálogo con un botón de aceptar informando al usuario que se ha completado la ejecución.

Por último se liberan los objetos de automatización creados para comunicarse con el GCMSSolution .

En este momento las matrices se encuentran en Visual Basic. Para trasladar las matrices a MATLAB se creará un objeto de automatización y se ejecutará el método PutFullMatrix que proporciona la interfaz de automatización que proporciona MATLAB.

2. Arquitectura del Software..

96

Figura 2.29. Diagrama de flujo del algoritmo del botón de comando Crear matrices de espectrometría alineadas

(intensidades.absolutas).

T

F

F

T

Declaración de variables locales.

Guardar intervalos introducidos por el usuario

¿Intervalos completos?

Mensaje de aviso al usuario: intervalos

incorrectos

¿Intervalos correctos?

INICIO

Redimensionar la matriz de TIC’s y la matriz del vector de desplazamientos con

el tamaño en función de los intervalos

Obtener valor Count (número de scan final)

Obtener valor TIC para cada scan.

Guardar valor de TIC en matriz de TIC’s.

Guardar valor del objeto de referencia para alinear.

Bucle For desde

sustancia 1 hasta n. Bucle For

desde scan inicial a

scan final

1

Crear objetos de automatización del

GCMSSolutions

2. Arquitectura del Software..

97

Figura 2.29. Diagrama de flujo del algoritmo del botón de comando Crear matrices de espectrometría alineadas (intensidades.absolutas).

Obtener valor ScanCount (número de scan final)

Obtener valor SpectrumCount (número de masas detectadas)

Calcular valor de intensidad para una masa determinada.

Guardar valor intensidad en matriz de intensidades.

Guardar variable en matriz de variables

Bucle FOR desde

sustancia 1 hasta n.

Bucle FOR i desde scan

inicial a scan final

2

Crear objetos de automatización del

GCMSSolutions

FOR j= masa ini to masa

final

FOR k=1 to

SpectrumCount

Intensidad = 0

Guardar nombre archivo datos de análisis en matriz de objetos.

Redimensionar las matrices de datos con el tamaño apropiado calculado en

función de los intervalos

1

Crear objeto de automatización MATLAB.

Trasladar matriz de TIC’s a workspace de MATLAB.

Ejecutar función ObtenerDesplazamiento en el

workspace de MATLAB.

Trasladar vector DESPLA desde MATLAB a programa IDAMAT.

2. Arquitectura del Software..

98

Figura 2.29. Diagrama de flujo del algoritmo del botón de comando Crear matrices de espectrometría alineadas

(intensidades.absolutas).

2

FIN

Liberar objetos de automatización del GCMSSolutions

Crear objeto de automatización MATLAB.

Escribir matrices en workspace de MATLAB.

Mensaje de aviso: “Matrices de datos alineados creadas”

2. Arquitectura del Software..

99

2.6.3.4.6 Botón de Comando “Crear matrices de espectrometría alineadas (intensidades relativas)”.

En el módulo de código del formulario para crear las PCA’s se encuentran las instrucciones ligadas al botón de comando Crear matrices de espectrometría alineadas (intensidades relativas).... El algoritmo que implementan estas instrucciones se describe mediante un diagrama de flujo en la figura 2.31.

Este algoritmo está asociado al evento clic del botón de comando. Cuando el usuario pulse el botón se ejecutarán todas las instrucciones que componen el algoritmo.

En primer lugar se declaran las variables de carácter local en relación al procedimiento. Entre estas variables destacan los objetos de automatización creados para comunicarse con la interfaz de automatización que proporciona el GCMSSolutions. También se declaran las variables donde se guardarán los intervalos de datos definidos por el usuario, , las variables que guardarán los contadores de los bucles que se utilizan en el algoritmo, las matrices donde se van a guardar los datos de los análisis y que posteriormente se pasarán a un workspace de MATLAB, la matriz de TIC’s y el vector DESPLA que servirán para realizar el alineamiento...

El siguiente paso consiste en comprobar si el usuario ha introducido todos los límites requeridos para definir los datos seleccionados para el estudio. Si existe algún error en los datos introducidos por el usuario aparecerá un cuadro de diálogo en el que se informará al usuario del error.

Si los datos introducidos por el usuario son correctos continuará la ejecución de las instrucciones. El siguiente paso del algoritmo consiste en obtener los valores de desplazamiento de cada sustancia. Para realizar el alineamiento de los datos es necesario, en primer lugar, seleccionar una de las sustancias que servirá como referencia. Todas las demás sustancias se alinearán en función de la sustancia de referencia y se modificarán los datos temporales en función del desplazamiento que tengan.

Para calcular el desplazamiento de cada sustancia se utiliza la matriz con los datos de cromatografía (TIC’s) de todas las sustancias. Una vez construida esta matriz, se crea un objeto de automatización de MATLAB. Se trasladará la matriz de TIC’s al workspace temporal creado junto con la variable que indica cual es la sustancia que el usuario ha seleccionado como referencia. Con estos dos datos se ejecutará la función ObtenerDesplazamiento en el workspace de MATLAB. Esta función se vale de la función crosscorr que provee MATLAB para calcular las correlaciones cruzadas entre dos series temporales. Como resultado de ejecutar la función ObtenerDesplazamiento se obtiene el vector DESPLA. Este vector tendrá tantos elementos como sustancias se hayan incluido en el estudio. Cada uno de los elementos indica el desplazamiento cada sustancia con respecto a la de referencia. Lógicamente, el valor para el elemento que corresponda a la sustancia de referencia será cero. Si, por ejemplo, se han seleccionado 10 sustancias para estudiar el vector DESPLA será un array de 10 elementos. Si se toma como referencia para el alineamiento a la sustancia 7, el elemento que ocupe esta posición en el vector DESPLA tendrá un valor de 0.

Una vez calculado del vector DESPLA en el workspace de MATLAB se trasladará al programa IDAMAT para poder utilizar la información que contiene para realizar el alineamiento.

2. Arquitectura del Software..

100

A continuación se redimensionarán las tres matrices que se han declarado al inicio del procedimiento asignándoles el tamaño que se ha calculado a partir de los intervalos introducidos por el usuario. En estas matrices de datos se guardarán los valores de intensidades relativas, los nombres de las variables que son strings que indican el scan y la masa a los que pertenece cada valor de intensidad y los nombres de las sustancias que se han incluido en el estudio.

.El siguiente paso consiste en crear los objetos de automatización del GCMSSolution que permitirán la obtención de los datos de los análisis realizados.

La serie de instrucciones siguientes están formadas por una serie de bucles FOR anidados. Concretamente se trata de cuatro bucles FOR anidados. La ejecución de estos bucles tiene por objetivo ir obteniendo uno a uno los datos requeridos por el usuario y guardarlos en la matriz correspondiente. Son necesarios tantos bucles porque cada valor de intensidad depende de varias variables (la sustancia a la que pertenece, el scan en que se ha detectado el valor y la masa a la que pertenece).El primero de los bucles, y el más externo, se ejecuta para el número de sustancias (objetos) del estudio. El segundo bucle FOR se ejecuta para todos los valores de scans incluidos en los intervalos indicados por el usuario. Para cada valor de scan se debe efectuar un barrido con todos los valores de masa. Por este motivo se ejecuta otro bucle FOR en el interior del segundo.Así se obtendrá un valor de intensidad que corresponde a una masa y a un instante de análisis (scan) determinados. Finalmente se ha añadido un bucle más dentro del tercer bucle FOR debido a una imprecisión propia del software GCMSSolution. Cuando se obtienen los datos de las masas detectadas se obtienen valores de masas con decimales. Esto no tiene sentido desde el punto de vista químico ya que las masas en unidades de u.m.a deben ser valores enteros. Para evitar errores en la adquisición de los datos se ha implementado este bucle FOR. El cometido de este bucle consiste en realizar un barrido para un mismo valor de masa y sumar los valores de intensidad obtenidos. Supongamos que se obtienen unos valores de masa 35 y 35.2 a los cuales les corresponden unos valores de intensidad de 10000 y 30000. El cuarto bucle FOR guardará estos valores y los sumará, obteniéndose así un valor total para la masa 35 de 40000. Este valor debería ser el correcto. Normalmente, cuando existen dos valores para una misma masa uno de ellos contiene un valor de intensidad determinado y el otro un valor cero. Pero para evitar problemas, debido a que en los valores de masas obtenidos del GCMSSolution pueden tener decimales, se decidió implementar este cuarto bucle FOR.

La matriz se construirá de forma que en el momento de guardar el valor de la intensidad se tendrá en cuenta el valor de desplazamiento de cada sustancia. Por ejemplo, supongamos que se están guardando los valores para el scan 100 de la sustancia 4. Supongamos que esta sustancia está retrasada con respecto a la de referencia 3 scans. Si no se tuviera en cuenta el desplazamiento se obtendría el valor de TIC para el scan 100 de la sustancia 4 con la instrucción siguiente:

intensidad = DataIntensidad(i)

donde i sería el valor de scan (3). Pero, para realizar el alineamiento, en lugar de coger el valor de scan que corresponde a la iteración del bucle FOR se tiene en cuenta el valor de desplazamiento y se le suma al valor de scan:

d = i + MTRZ_DESPLA_Real(n + 1)

2. Arquitectura del Software..

101

intensidad= DataIntensidad_TIC(d)

La variable “d” contiene el resultado de la suma de scan (100) y el desplazamiento (3) por lo que es estaría guardando el valor de la intensidad para el scan 103. De esta forma se realiza el alineamiento al mismo tiempo que se va construyendo la matriz que contiene los datos de cromatografía (TIC’s).

En la misma iteración del bucle en que se obtiene el valor de intensidad absoluta para una determinada masa se obtiene el valor de intensidad absoluta del pico base del espectrograma al que pertenece la masa. Con este valor de pico base se podrá calcular el valor de intensidad relativa de la masa. Para ello se multiplica el valor de la intensidad absoluta por 100 y se divide por el valor de intensidad del pico base. En las siguientes líneas de código extraídas del programa IDAMAT se muestra como se realiza este cálculo:

Int_BasePeak = ObjetoMSSpectrum.BasePeakIntensity

IntensidadRelativa = CCur(intensidad * 100 / Int_BasePeak)

En la matriz de intensidades se guardará el valor de la intensidad relativa calculado.

Una vez ejecutados los cuatro bucles FOR las matrices contienen toda la información solicitada por el usuario.

Cabe destacar la estructura en que se dispone la información para la matriz en la que se guardan las intensidades relativas obtenidas:

... s100m45 S100m46 ... s101m45 s101m46 ... Objeto1 ... Int_rel(1,1) Int_rel(1,2) ... Int_rel(1,4) Int_rel(1,5) ... Objeto2 ... Int_rel(2,1) Int_rel(2,2) ... Int_rel(2,4) Int_rel(2,5) ... Objeto3 ... Int_rel(3,1) Int_rel(3,2) ... Int_rel(3,4) Int_rel(3,5) ...

Figura 2.30. Estructura de la matriz donde se guardan las intensidades relativas alineadas.

Se puede observar que los datos constituyen un espacio de 3 dimensiones (tiempo, masa e intensidad) pero se disponen en una matriz de 2 dimensiones. Esta forma de estructurar la información es debido a que posteriormente se aplicará el algoritmo de PCA a los datos y no es posible aplicarlo a una matriz de 3 dimensiones.

2. Arquitectura del Software..

102

Figura 2.31. Diagrama de flujo del algoritmo del botón de comando Crear matrices de espectrometría alineadas

(intensidades relativas).

T

F

F

T

Declaración de variables locales.

Guardar intervalos introducidos por el usuario

¿Intervalos completos?

Mensaje de aviso al usuario: intervalos

incorrectos

¿Intervalos correctos?

INICIO

Redimensionar la matriz de TIC’s y la matriz del vector de desplazamientos con

el tamaño en función de los intervalos

Obtener valor Count (número de scan final)

Obtener valor TIC para cada scan.

Guardar valor de TIC en matriz de TIC’s.

Guardar valor del objeto de referencia para alinear.

Bucle For desde

sustancia 1 hasta n. Bucle For

desde scan inicial a

scan final

1

Crear objetos de automatización del

GCMSSolutions

2. Arquitectura del Software..

103

Figura 2.31. Diagrama de flujo del algoritmo del botón de comando Crear matrices de espectrometría alineadas (intensidades relativas).

Obtener valor ScanCount (número de scan final)

Obtener valor SpectrumCount (número de masas detectadas)

Calcular valor de intensidad absoluta. Obtener valor

intensidad Pico Base. Calcular valor de intensidad relativa.

Guardar valor intensidad en matriz de intensidades.

Guardar variable en matriz de variables

Bucle FOR desde

sustancia 1 hasta n.

Bucle FOR i desde scan

inicial a scan final

2

Crear objetos de automatización del

GCMSSolutions

FOR j= masa ini to masa

final

FOR k=1 to

SpectrumCount

Intensidad = 0

Guardar nombre archivo datos de análisis en matriz de objetos.

Redimensionar las matrices de datos con el tamaño apropiado calculado en

función de los intervalos

1

Crear objeto de automatización MATLAB.

Trasladar matriz de TIC’s a workspace de MATLAB.

Ejecutar función ObtenerDesplazamiento en el

workspace de MATLAB.

Trasladar vector DESPLA desde MATLAB a programa IDAMAT.

2. Arquitectura del Software..

104

Figura 2.31. Diagrama de flujo del algoritmo del botón de comando Crear matrices de espectrometría alineadas

(intensidades relativas).

Cuando la ejecución del programa sale de los bucles las matrices estarán completadas con toda la información. Se habrán creado 3 matrices. Una guardará los valores de las intensidades relativas detectadas por el GCMS para un scan y masa determinados (teniendo en cuenta el desplazamiento de la sustancia con repecto a la de referencia). Otra guardará los nombres de las variables que servirán para indicar el scan y la masa a las que pertenece cada valor de intensidad. Por último, la tercera matriz guardará los nombres de las sustancias (objetos) incluidas en el estudio.

Una vez completadas las matrices aparecerá un cuadro de diálogo con un botón de aceptar informando al usuario que se ha completado la ejecución.

Por último se liberan los objetos de automatización creados para comunicarse con el GCMSSolution .

En este momento las matrices se encuentran en Visual Basic. Para trasladar las matrices a MATLAB se creará un objeto de automatización y se ejecutará el método PutFullMatrix que proporciona la interfaz de automatización que proporciona MATLAB.

2

FIN

Liberar objetos de automatización del GCMSSolutions

Crear objeto de automatización MATLAB.

Escribir matrices en workspace de MATLAB.

Mensaje de aviso: “Matrices de datos alineados creadas”

2. Arquitectura del Software..

105

2.7 Funciones de MATLAB.

2.7.1 Función ObtenerDesplazamiento

Anteriormente se ha hablado acerca de la flexibilidad de la tecnología COM y de cómo se pueden aprovechar las capacidades de varios programas. De esta forma, no es necesario, por ejemplo, desarrollar un complicado algoritmo en Visual Basic si se dispone en MATLAB de la función que lo realiza. Esto es lo que ocurre con la función ObtenerDesplazamiento. Esta función se ha desarrollado en MATLAB para aprovechar una función que de que dispone este programa: crosscorr. Ésta calcula la correlación cruzada entre dos series temporales.

Desde el programa IDAMAT se trasladan las matriz que contiene los TIC’s de todas las sustancias que son objeto de estudio. También se traslada el índice que señala la sustancia que el usuario ha escogido como referencia para el alineamiento. A partir de estos dos datos se obtendrá un vector DESPLA de longitud igual al número de sustancias. Cada elemento del vector indica el desplazamiento de la sustancia correspondiente con respecto a la de referencia. Lógicamente el valor del elemento del vector que corresponde a la sustancia de referencia será cero.

A continuación se muestra el algoritmo que describe los cálculos realizados por la función:

Figura 2.32. Algoritmo que describe la función ObtenerDesplazamiento.

Variables de entrada: matriz de TIC’s sustancia de referencia

INICIO

Calcular función de correlación cruzada (XCF) entre serie de

referencia y serie i

FOR i=1 to número

de filas

FIN

Obtener número de filas de la matriz de TIC’s

Obtener valor máximo de XCF

Guardar valor de desplazamiento para valor máximo de XCF en

vector DESPLA

La función devuelve el vector DESPLA

2. Arquitectura del Software..

106

2.7.2 Función quitaceros

La función quitaceros supone el último tratamiento a los datos antes de aplicarles el algoritmo de PCA. Para poder aplicarlo la matriz sobre la cual se ejecuta debe tener como máximo 2 dimensiones y no deben haber columnas que estén compuestas en tu totalidad por ceros. En este caso se produce un error y es imposible obtener un resultado.

Una vez se han trasladado las matrices de datos al workspace de MATLAB se les aplicará la función quitaceros. De esta forma se eliminan las columnas compuestas por ceros en su totalidad de la matriz de intensidades. Al mismo tiempo se eliminarán las variables que correspondan a estas columnas de la matriz de variables.

Al desarrollar esta función se buscado optimizar al máximo el tiempo de ejecución de la misma. Por ejemplo, se ha utilizado la función break para salir del bucle que rastrea la columna en cuanto se detecte un elemento diferente de cero. De esta forma se evita comparar todos los elementos de la columna ya que no es necesario.

En la siguiente figura se muestra el diagrama de flujo que describe el algoritmo de la función:

Figura 2.33. Algoritmo que describe la función quitaceros.

T

Variables de entrada: matriz de intensidades y matriz de variables

INICIO

Guardar valor variable en variables_sinceros

FOR c=1 to número

de columnas

FIN

Obtener número de filas y columnas de matriz de intensidades

Guardar valor de toda la columna en matriz_sinceros

La función devuelve las matrices:

Matriz_sinceros y variables_sinceros

Matriz(f,c) ~=0? F

FOR f=1 to número

de filas

3. Aplicación ejemplo.

3 Aplicación ejemplo.

En este ejemplo se va a realizar un proceso de análisis completo con las herramientas que proporciona el programa IDAMAT.

Se dispone de 15 muestras que pertenecen a 3 tipos de aceite de oliva. Por cada tipo de aceite hay 5 muestras. Se han asignado las siguientes etiquetas a las muestras:

• 01A

• 01B

• 01C

• 01E

• 01G

• 07A

• 07B

• 07C

• 07D

• 07F

• 11A

• 11B

• 11C

• 11D

• 11E

Se puede observar viendo las muestras que a los tres tipos de aceite de oliva se les han asignado los números: 01, 07 y 11.

El objetivo del estudio es poder diferenciar los tres tipos de aceites. Para ello se aplicará el algoritmo PCA a los datos obtenidos. La obtención de buenos resultados pasa por obtener un gráfico de PCA en el que las muestras de un mismo aceite aparezcan agrupadas en una misma región. Al mismo tiempo, las muestras de diferentes tipos de aceite deben aparecer lo suficientemente dispersas entre sí como para poder diferenciar los aceites entre ellos. Si los resultados son buenos y se consigue diferenciar los aceites se podrían implementar los cálculos, por ejemplo, en un sistema de control de producción o de calidad de una fábrica.

3. Aplicación ejemplo..

108

En primer término se podrían obtener los gráficos en 3D de los datos obtenidos de los análisis de las sustancias que son objeto de estudio. En la figura 3.1. se muestra el gráfico 3D para la primera muestra de aceite de oliva 01A :

Figura 3.1. Gráfico 3D de los datos de espectrometría de la muestra 01A.

En el gráfico obtenido se puede apreciar que toda la información contenida en los datos de los análisis se concentra entre los valores de scans 100 y 600 y los valores de masas 35 a 70. De esta forma, analizando visualmente el gráfico se pueden reducir los datos. En los siguientes ejemplos se obtendrán los gráficos resultantes de aplicar el algoritmo PCA a los datos incluidos en estos intervalos. Se podrá comprobar, en uno de los ejemplos, que el hecho de ajustar más los intervalos a la región donde se encuentran los datos detectados por el GC-MS mejora los resultados del PCA.

En primer lugar se aplicará un PCA a los datos obtenidos de la cromatografía de las sustancias. En este caso los datos no se han alineado. En la siguiente figura 3.2 se muestra el gráfico de la PCA obtenida para estos datos.

3. Aplicación ejemplo..

109

En la figura 3.2 se puede apreciar que la dispersión entre las muestras de aceites diferentes no es lo suficiente alta. Además, la dispersión entre muestras que pertenecen al mismo tipo de aceite es demasiado alta. Por este motivo resulta muy difícil diferenciar los diferentes tipos de aceites en áreas separadas del gráfico.

Se puede concluir que los datos de cromatografía sin alinear no ofrecen un resultado satisfactorio cuando se aplica un algoritmo PCA.

Figura 3.2. PCA para los datos de cromatografía sin alinear.

3. Aplicación ejemplo..

110

En la figura 3.3 se muestra el resultado de aplicar el algorimo de PCA a los datos de cromatografía alineados.

Se puede apreciar que la dispersión de las muestras que pertenecen al mismo tipo de aceite de oliva ha disminuido considerablemente. También, la diferenciación entre las muestras que pertenecen a diferentes tipos de aceite ha aumentado. Ahora se pueden diferenciar las muestras de diferentes aceites ya que aparecen en diferentes regiones de la gráfica que representa el PCA.

Figura 3.3. PCA para los datos de cromatografía alineados.

3. Aplicación ejemplo..

111

En la figura 3.4 se muestra el resultado gráfico obtenido al aplicar un PCA a los datos de espectrometría con valores de intensidades absolutas sin alinear. Se puede apreciar que los resultados han empeorado con respecto a los obtenidos con los datos de cromatografía alineados.

Resulta complicado aislar las muestras pertenecientes a los mismos aceites en regiones diferenciadas del gráfico.

Figura 3.4. PCA para los datos de espectrometría con intensidades absolutas sin alinear.

3. Aplicación ejemplo..

112

En la figura 3.5 se muestran el resultado de calcular un PCA con los datos de espectrometría sin alinear pero con valores de intensidades relativas. Se puede apreciar que la dispersión entre muestras pertenecientes al mismo tipo de aceite ha disminuido considerablemente. Al mismo tiempo la dispersión entre muestras de diferentes aceites ha aumentado. Ahora se pueden diferenciar los aceites en regiones separadas de la gráfica. Se puede deducir, por lo tanto, que los resultados con valores de intensidades relativas mejoran considerablemente.

Figura 3.5. PCA para los datos de espectrometría con intensidades relativas sin alinear.

3. Aplicación ejemplo..

113

En la figura 3.6 se muestra el resultado gráfico obtenido al aplicar el algoritmo de PCA a los datos de espectrometría alineados y con valores de intensidades absolutos. Se puede observar que el alineamiento introduce mejoras considerables en los resultados pudiéndose diferenciar las muestras de diferentes aceites en regiones separadas del gráfico obtenido.

Figura 3.6. PCA para los datos de espectrometría con intensidades absolutas alineadas.

3. Aplicación ejemplo..

114

Finalmente en la figura 3.7 se muestra el PCA obtenido cuando se aplica el algoritmo a los datos de espectrometría alineados y con valores relativos de intensidades. En este caso se suman las mejoras introducidas por los dos tratamientos: el alineamiento y el escalar las intensidades cuando se calculan los valores relativos de estas. Se puede observar que la dispersión entre las muestras de un mismo tipo de aceite es mínima para este caso. La dispersión entre muestras de diferentes tipos de aceites de oliva es máxima. Así, las muestras que pertenecen a la misma sustancia quedan agrupadas en un área muy reducida. Por lo tanto la diferenciación de los aceites entre sí es óptima.

Figura 3.7. PCA para los datos de espectrometría con intensidades relativas alineadas.

En las figuras 3.8 y 3.9 de la página siguiente se muestran los gráficos de unos PCA’s realizados con los mismos tipos de datos (intensidades relativas y con alineamiento). La diferencia entre los 2 PCA’s está en los intervalos escogidos. En el primer gráfico se ha seleccionado un intervalo para los scans de 100 a 600 y para las masas de 35 a 100. En cambio en el segundo PCA se han ajustado mucho más los límites de los intervalos escogidos: 180 a 500 para los scans y 35 a 70 para las masas.

Se puede apreciar como el segundo gráfico presenta unos mejores resultados. De estos ejemplos se puede deducir que el seleccionar un intervalo u otro puede influir en los resultados obtenidos con el PCA de forma apreciable. Al ajustar más los intervalos a las intensidades detectadas se obtienen mejores resultados.

3. Aplicación ejemplo..

115

Figura 3.8. PCA (intensidades relativas y alineamiento) scans (100,600)-masas(35,100)

Figura 3.9. PCA (intensidades relativas y alineamiento) scans (180,500)-masas(35,70)

4. Conclusiones.

4 Conclusiones.

4.1 Evaluación de los objetivos conseguidos.

En principio, los resultados obtenidos, una vez realizado el proyecto, parecen ser satisfactorios. La mejor prueba de ello es que la evaluación del programa por parte del usuario final es muy positiva.

En general, se han superado ampliamente los objetivos planteados en los inicios del proyecto. Éste arranco con un horizonte de posibilidades muy abierto en lo referente a cómo se iba a implementar ya que se tenía un desconocimiento de lo que implicaba. Por esto motivo se llevó a cabo un considerable trabajo de búsqueda de información y de pruebas con el software utilizado. Esto ha permitido que a medida que se iba avanzando en el proyecto se descubriesen nuevas posibilidades y herramientas con las cuales se podía dotar al programa que se estaba desarrollando.

Se ha logrado un programa que resulta cómodo e intuitivo en cuanto a su utilización. Las características que se han añadido al programa, como por ejemplo, la comunicación con MATLAB han supuesto una mejoría y una disminución del tiempo que el usuario debe emplear en el tratamiento de los datos obtenidos.

Unos de los objetivos que se ha perseguido ha sido el de dotar al programa de la máxima flexibilidad posible. Por este motivo se han mantenido todas las herramientas desarrolladas. Por ejemplo, en un principio se pretendía almacenar los datos en ficheros de texto y posteriormente adquirirlos desde MATLAB. Posteriormente se descubrió la posibilidad de trasladar los datos a un workspace directamente. Aunque esta opción es mucho más útil que la de almacenar datos en ficheros de texto, se decidió mantener también la primera opción por si en algún momento pudiera resultar de utilidad.

La herramienta de gráficos 3D también ha aportado un punto de vista nuevo a la hora de percibir y entender la información que aporta el GCMS. En los gráficos 3D se aprecia claramente la situación de la información susceptible de ser incluida en el estudio. El usuario podrá definir unos intervalos que se ajusten lo máximo a la región del espacio 3D donde se encuentran las intensidades detectadas por el GCMS. Esta selección de los datos es muy útil ya que permite reducir el volumen de datos con el que se va a trabajar. El volumen de datos que contiene un fichero *.qgd con la información del análisis realizado con una sustancia es muy grande. Esto provoca problemas de saturación de memoria en programas que se utilizan para el tratamiento de datos. Concretamente se han podido comprobar estos problemas con MATLAB. Éstos se pueden evitar seleccionando intervalos adecuados y eliminando los datos que no aportan información al estudio. Es importante destacar que se ha apreciado en resultados obtenidos que cuanto más se ajustan los intervalos a la información relevante del análisis mejores gráficos de los PCA’s se obtienen.

También es importante destacar que la aportación de este proyecto a la línea de investigación del grupo de investigación de sensores de gases y narices electrónicas es de considerable valor. Se intuye, con los primeros resultados obtenidos, que las previsiones del grupo en su línea de investigación son correctas. Parece ser que el hecho de incluir la

4. Conclusiones.

117

variable tiempo en los datos de espectrometría mejora los resultados obtenidos en la aplicación de algoritmos de tratamiento de datos.

Este proyecto puede abrir camino a otros proyectos para el grupo en lo que a desarrollo de herramientas informáticas se refiere. Se ha comprobado que la tecnología COM puede aportar muchas posibilidades en el desarrollo de aplicaciones. Quizá, en un futuro, se podrían llegar a elaborar aplicaciones que pongan en práctica los conocimientos desarrollados por el grupo de investigación y venderlas a empresas obteniendo así beneficios económicos.

4.2 Posibilidades de mejora.

Al principio, cuando se empezó a desarrollar este proyecto, se tenía claro qué era lo que se quería lograr, qué objetivos se querían conseguir. Lo que se desconocía totalmente era la forma en que se podía conseguir. Por este motivo en una fase previa fue muy importante la investigación, búsqueda de información y la experimentación. Esto provocó que se abrieran caminos, diferentes opciones por las que, al final, por uno u otro motivo, se decidió no seguir.

Por ejemplo, en cuanto a solucionar el problema de comunicación entre los datos del GCMSSolution y el programa MATLAB se plantearon varias soluciones. Al final se optó por la opción de desarrollar una aplicación en la que un programa en Visual Basic cumpliera el papel de controlador de automatización y controlara el GCMSSolution y el MATLAB.

Figura 4.1.IDAMAT cliente y GCMSSolution y MATLAB como servidores.

MATLAB también puede actuar como controlador de automatización. Se intentó aplicar esta opción de forma que fuera MATLAB quien se comunicara directamente con el software del GCMSSolution. Las ventajas de esta opción radicaban en que todo el programa se podría desarrollar en MATLAB que es un lenguaje conocido por el entorno universitario y en concreto por el grupo de investigación de sensores de gases. Finalmente fue imposible conseguir que MATLAB y el GCMSSolution se comunicaran. En un primer

GCMSSolution

(software propio del analizador)

MATLAB (herramientas gráficas y de

cálculo)

IDAMAT

(programa desarrollado en Visual Basic 6.0)

4. Conclusiones.

118

momento se producía un error cuando se quería crear un servidor de automatización del GCMSSolution. Se buscó información en internet y se encontró una página de cómo solucionarlo actualizando unas DLL’s de MATLAB. Se siguieron las instrucciones pero tampoco se logró la comunicación. En la página web se recomendaba ponerse en contacto con el proveedor del servidor de automatización (GCMSSolution en este caso) si de esta forma no se lograba la comunicación. Por este motivo se descartó esta opción. Probablemente MATLAB tenga desarrollada las opciones COM para programas de uso más frecuente como Excel o Access. La tecnología COM todavía está en desarrollo y posiblemente en versiones futuras de MATLAB se puedan implementar esta configuración sin problema. En la figura 4.2 se representa esta configuración.

Figura 4.2. MATLAB cliente y GCMSSolution como servidor.

Otra opción que se planteó fue la de utilizar el MATLAB COM BUILDER para obtener un componente COM. Se trata de una herramienta de MATLAB con la que se pueden crear componentes COM a partir de funciones desarrolladas en MATLAB. Se tenía la intención de aplicarlo para las funciones desarrolladas en MATLAB. Así, en lugar de necesitar tener instalado el MATLAB en el sistema, con instalar unas DLL’s sería suficiente. Se probaron los ejemplos de la ayuda de MATLAB pero no se logró conseguir la comunicación entre componentes COM de prueba y Visual Basic. Por este motivo también se descartó esta opción. Quizá en un futuro, pueda interesar implementar esta opción y algún estudiante podría desarrollarla.

Otro aspecto que podría suponer una mejora sería el cambiar el lenguaje de programación. Durante el desarrollo del proyecto se ha comprobado que existen lenguajes más recientes o potentes que Visual Basic 6.0, como pueden ser Visual Basic .NET o Visual C++. Si se decidiera, en un futuro, asignar a un estudiante la mejora de la aplicación, con la información aportada en este documento podría programar en cualquier lenguaje visual sin problema.

MATLAB

Application

Automation Client Automation Server

GCMSSolution lDispatch

Interface

ANEXO A: Espectrometría de Masas y Cromatografía de Gases

Anexo A: Espectrometría de Masas y Cromatografía de Gases.

121

Anexo A: Espectrometría de Masas y Cromatografía de Gases.

A.1. Espectrometría de masas.

Aunque esté incluida entre las técnicas espectroscópicas la espectrometría de masas no es una de dichas técnicas pues no utiliza ninguna radiación del espectro electromagnético para irradiar la muestra y observar la absorción de dicha radiación.

Al contrario que en aquellas en la EM la muestra es ionizada (y por tanto destruida) usando diversos procedimientos para ello. De todos ellos el más usual y/o utilizado es la técnica denominada de Impacto Electrónico (EM-IE) consistente en el bombardeo de la muestra (previamente vaporizada mediante el uso de alto vacío y una fuente de calor) con una corriente de electrones a alta velocidad.

Ello produce que la sustancia pierda a su vez algunos electrones y se fragmente dando diferentes iones, radicales y moléculas neutras. Los iones (moléculas o fragmentos cargados), y solo ellos, son entonces conducidos mediante un acelerador de iones a un tubo analizador curvado sobre el que existe un fuerte campo magnético y conducidos a un colector/analizador sobre el que se recogen los impactos de dichos iones en función de la relación carga/masa de los mismos, tal y como se indica en el siguiente esquema:

Figura A.1. Esquema de un espectrógrafo de masas

Posteriormente dichos impactos son transformados en un espectro de masas como el que se muestra a continuación:

Anexo A: Espectrometría de Masas y Cromatografía de Gases.

122

Figura A.2. Ejemplo de un espectro de masas

En él que la intensidad de los picos nos indica la cantidad relativa de iones que poseen dicha relación carga/masa. La separación de los diferentes iones se basa en la relación:

(m/e = H2·r2/2) (A.1)

en la que: H es la intensidad del campo magnético; r el radio de deflexión del tubo analizador y V es el potencial de aceleración utilizado. Dicha expresión puede deducirse de las expresiones que relacionan, de una parte la energía cinética de los iones:

(e·V = m·v2/2) (A.2)

y de otra el movimiento de una partícula cargada en un campo magnético:

(m·v = r·H·E) (A.3)

Como curiosidades indicaremos que la velocidad de los iones suele ser de unos 100 Km/s, que el radio de deflexión (r) suele ser de unos 35-50 cm y el tubo analizador suele ser un sector esférico de aproximadamente un metro de longitud.

Anexo A: Espectrometría de Masas y Cromatografía de Gases.

123

A.2. Cromatografía de gases.

Un cromatógrafo de gases esta constituido normalmente por los siguientes componentes:

• Un suministro y una entrada de gas portador

• puerto de inyección

• columna normalmente loalizada en el interior de una cámara termostatizada (horno)

• detector

• sistema computerizado para analizar, registrar e imprimir el cromatograma

Figura A.3. Esquema de un cromatógrafo de gases.

La cromatografía es un método físico de separación en el cual los componentes a separar se distribuyen entre dos fases, una de las cuales constituye la fase estacionaria, de gran área superficial, y la otra es un fluido (fase móvil) que pasa a través o a lo largo de la fase estacionaria.

La fase estacionaria puede ser un sólido o un líquido dispuesto sobre un sólido que actúa como soporte, de gran área superficial. La fase móvil es un fluido (puede ser gas, líquido o fluido supercrítico) que se usa como portador de la mezcla.

En la cromatografía ocurren dos fenómenos muy importantes y que son prácticamente los rectores del proceso de separación: la adsorción y la absorción.

La adsorción es la retención de una especie química en los sitios activos de la superficie de un sólido, quedando delimitado el fenómeno a la superficie que separa las fases o superficie interfacial.Esta retención superficial puede ser física o química. La

Anexo A: Espectrometría de Masas y Cromatografía de Gases.

124

adsorción depende de la naturaleza de la substancia adsorbida, de la temperatura, de la naturaleza y estado de subdivisión del adsorbente, y de la concentración.La absorción es la retención de una especie química por parte de una masa y depende de la tendencia que tiene ésta a formar mezcla o reaccionar químicamente con la misma.

Gas Portador

El gas portador cumple básicamente dos propósitos: Transportar los componentes de la muestra, y crear una matriz adecuada para el detector.

Un gas portador debe reunir ciertas condiciones:

• Debe ser inerte para evitar interacciones (tanto con la muestra como con la fase estacionaria)

• Debe ser capaz de minimizar la difusión gaseosa

• Fácilmente disponible y puro

• Económico

• Adecuado al detector a utilizar

Columna

Es el lugar donde ocurre la separación. Se dice que es el corazón de un cromatógrafo. Los materiales con los cuales generalmente se pueden elaborar las columnas son: cobre, aluminio, acero inoxidable, vidrio ó teflón. El relleno puede ser un sólido, ó un líquido recubriendo un sólido.

Detectores

Un detector es un dispositivo para revelar la presencia de las sustancias eluídas a la salida de la columna cromatográfica. Podemos expresar que el detector son los "ojos" de un cromatógrafo.El Detector es un dispositivo capaz de convertir una propiedad física, no medible directamente, en una señal elaborable y ofrecernos información sobre la naturaleza y magnitud de la propiedad física.En cromatografía un detector funciona comparando una propiedad física entre el gas portador puro y el mismo gas portador llevando cada uno de los componentes que previamente se han separado en la columna, esta acción se traduce en una señal tipo eléctrica, que posteriormente se amplificará mediante un registrador gráfico ó integrador permitiendo indicar el momento que salen de la columna los componentes.

Cromatograma y su Interpretación

Los siguientes términos son los utilizados en un cromatograma típico y recomendados por la IUPAC:

• Line Base

• Pico Cromatográfico

• Base del Pico

• Área del Pico

Anexo A: Espectrometría de Masas y Cromatografía de Gases.

125

• Altura del Pico

• Ancho del Pico

• Ancho del Pico a la mitad de la Altura

Medida de la Altura ó Área de Pico

• Altura del Pico: Medida que se efectua, para cada pico de interés, desde la línea base hasta el máximo del pico.

Los errores de malas mediciones se pueden atribuir a:

o Insuficiente Resolución

o Variaciones en la línea base

o Picos extremadamente pequeños

Las desviaciones en la línea base se pueden compensar por interpolación de ésta entre el prinpio y el final del pico.

• Área del Pico.

Existen varias técnicas para la determinación del Área de un Pico Cromatográfico:

o Integración Manual

§ Métodos Geométricos

§ Triangulación: En esta técnica se trazan líneas tangentes a cada lado del pico. La altura se mide desde la línea base hasta la intersección de las dos tangentes. El ancho se mide tomando la intersección de las dos líneas tangentes con la línea base. Luego se utiliza la fórmula A=1/2*Altura del Pico* Base del Pico. Las limitaciones de esta técnica estan en el trazado de las líneas tangentes, un pequeño error al trazar las tangentes puede afectar la medida de la altura.

§ Altura por ancho a la mitad de la Altura:

§ Métodos Mecánicos

§ Planimétricos

§ Corte y Pesada: Esta técnica requiere recortar el pico del cromatograma, luego pesarlo en una balanza analítica. El recorte y pesada depende mucho de la habilidad del operdor. Pueden introducirse errores por cambios en la humedad del papel, la grasa de las manos del operador, homogeneidad del papel. Generalmente se recomienda utilizar una fotocopia del cromatograma para no destruir el original.

o Integración Automática

§ Electromecánica

Anexo A: Espectrometría de Masas y Cromatografía de Gases.

126

§ Electrónica

Ejemplo de un cromatograma:

Figura A.4. Ejemplo de un cromatograma.

ANEXO B: Listado del programa IDAMAT (desarrollado en Visual

Basic 6.0)

Anexo B: Listado del programa.

B.1. Formularios.

B.1.1. Formulario Form_graficos.

B.1.2. Formulario Form_Inicio.

B.1.3. Formulario Form_pca.

B.1.4. Formulario Form_texto.

B.2. Módulos.

B.2.1. Módulo BuscarCarpeta.

B.2.2. Módulo Graficos.

B.2.3. Módulo Module1.

B.2.4. Módulo PCA.

B.2.5. Módulo Texto.

Anexo B : Listado del programa

131

B.1. Formularios.

B.1.1. Formulario Form_graficos.

'####################################################################

'###### ######

'###### CODIGO RELATIVO AL FORMULARIO DE GRAFICOS 3D ######

'###### ######

'####################################################################

Option Explicit

'--------------------------------------------------------------------

' COMANDO GENERAR GRÁFICO 3D

' En este procedimiento se programa todas las acciones que tienen

' lugar cuando se produce el evento click del botón para realizar

' el gráfico 3D del la sustancia determinada.

' Se crearán 3 matrices.

' 1. intensidades.

' 2. masas

' 3. scans

' Estas matrices se traladarán a un workspace de Matlab y allí

' se generará el gráfico 3D correspondiente con toda la información.

'--------------------------------------------------------------------

Private Sub Cmd_generar_grafico_Click()

Dim Intervalos_completos As Boolean

Dim Intervalos_incorrectos As Boolean

Dim IntensidadesReal() As Double

Dim MasasReal() As Double

Dim ScansReal() As Double

Dim IntensidadesImag() As Double

Dim MasasImag() As Double

Dim ScansImag() As Double

Dim ReadOnly As Integer

Dim i As Integer

Dim j As Integer

Anexo B : Listado del programa

132

Dim k As Integer

Dim masa_ini As Integer

Dim masa_fin As Integer

Dim scan_ini As Integer

Dim scan_fin As Integer

Dim Num_SpectrumCount As Long

Dim intensidad As Long

Dim masa1 As Long

Dim masa2 As Integer

Dim intensidad_max As Long

ReadOnly = 1

masa_ini = Txt_masa_ini.Text

masa_fin = Txt_masa_fin.Text

scan_ini = Txt_scan_ini.Text

scan_fin = Txt_scan_fin.Text

Intervalos_completos = (Txt_scan_ini.Text <> "") And (Txt_scan_fin.Text <> "") And _

(Txt_masa_ini.Text <> "") And (Txt_masa_fin.Text <> "")

Intervalos_incorrectos = (scan_ini > scan_fin) Or (masa_ini > masa_fin)

If Not Intervalos_completos Then

MsgBox "Debes rellenar los límites de intervalos", vbOKOnly, "Atencion"

ElseIf Intervalos_incorrectos Then

MsgBox "El intervalo inicial debe ser menor que el final", vbOKOnly, "Atencion"

Else

ReDim IntensidadesReal(scan_ini To scan_fin, masa_ini To masa_fin) ' Se crean las matriz de intensidades con el tamaño calculado en función del intervalo

ReDim MasasReal(masa_ini To masa_fin) ' Se crea la matriz de Masas con el tamaño calculado en función del intervalo

ReDim ScansReal(scan_ini To scan_fin) ' Se crea la matriz de Scans con el tamaño calculado en función del intervalo

Call CrearObjeto 'Crear el objeto GCMSFileObj.Data

Call CargarDatos(Txt_fichero_seleccionado.Text, ReadOnly) 'Se cargan los datos del fichero seleccionado

Call CargarMS3DData 'Se crea el ObjetoMS3DData que contendrá los datos de intensidades

For i = scan_ini To scan_fin

Num_SpectrumCount = SpectrumCount(i)

For j = masa_ini To masa_fin

intensidad = 0

For k = 1 To Num_SpectrumCount

Anexo B : Listado del programa

133

masa1 = DataMasa(i, k)

masa2 = Int(masa1 / 20 + 0.5)

If masa2 = j Then

intensidad = intensidad + DataIntensidad(i, k)

End If

If masa2 > j Then Exit For

Next k

IntensidadesReal(i, j) = intensidad

'ElseIf Opt_intens_rel.Value Then

' IntensidadesReal(j, i) = intensidad / intensidad_max

If i = scan_ini Then

MasasReal(j) = j

End If

Next j

ScansReal(i) = i

Next i

Call Liberar_objetos

Call CrearMatlabGrafico ' Se crea un objeto COM para comunicarse con Matlab

Call MatlabGrafico.PutFullMatrix("X", "base", MasasReal, MasasImag)

Call MatlabGrafico.PutFullMatrix("Y", "base", ScansReal, ScansImag)

Call MatlabGrafico.PutFullMatrix("Z", "base", IntensidadesReal, IntensidadesImag)

Result = MatlabGrafico.Execute("figure")

Result = MatlabGrafico.Execute("surfc(X,Y,Z)")

Result = MatlabGrafico.Execute("XLABEL('Masas')")

Result = MatlabGrafico.Execute("YLABEL('tiempo')")

Result = MatlabGrafico.Execute("ZLABEL('Intensidad')")

Result = MatlabGrafico.Execute("TITLE('" & List_nombres_qgds.Text & "')")

Txt_Matlab.Text = Result

End If

End Sub

'--------------------------------------------------------------------

' Este procedimiento abre un cuadro de diálogo "Guardar como..." que

' es estándar de windows para que el usuario pueda ubicar cómoda-

' mente el archivo donde guardará los datos generados en el

' workspace temporal de Matlab que se crea.

'--------------------------------------------------------------------

Anexo B : Listado del programa

134

Private Sub Cmd_guardar_workspace_Click()

Dim NombreWorkspace As String

'CancelError es True.

CommonDialog1.CancelError = True

On Error GoTo ErrHandler

'Establece los filtros.

Form_texto.CommonDialog1.Filter = "All Files (*.*)|*.*|Mat_Files (*.mat)|*.mat"

' Especifique el filtro predeterminado.

Form_texto.CommonDialog1.FilterIndex = 2

' Presenta el cuadro de diálogo Abrir.

Form_texto.CommonDialog1.ShowSave

' Se obtiene el nombre seleccionado.

NombreWorkspace = Form_texto.CommonDialog1.FileName

Result = Matlab.Execute("save " & "'" & NombreWorkspace & "'")

Txt_Matlab.Text = Result

Exit Sub

ErrHandler:

'El usuario hizo clic en el botón Cancelar.

Exit Sub

End Sub

Private Sub Cmd_inicio_Click()

Form_Inicio.Show

Hide

End Sub

'----------------------------------------------------------------

'Este es el procedimiento para el evento de pulsar el botón para

'seleccionar el archivo del cual se desea generar el fichero 3D.

'Si hay un archivo de la lista que está seleccionado al pulsar

'el botón quedará registrado en el cuadro de texto correspondien-

'te el path completo del fichero.

'----------------------------------------------------------------

Private Sub Cmd_sel_qgd_Click()

If List_nombres_qgds.Text = "" Then

MsgBox "Debes seleccionar un fichero *.qgd de la lista", vbOKOnly, "Atencion"

Anexo B : Listado del programa

135

Else

Txt_fichero_seleccionado.Text = Form_Inicio.Txt_carpeta_trabajo.Text & "\" & List_nombres_qgds.Text

End If

End Sub

Private Sub ImgTexto_Click()

Form_texto.Show

End Sub

Private Sub ImgPCA_Click()

Form_pca.Show

End Sub

Private Sub List_nombres_qgds_DblClick()

Cmd_sel_qgd.Value = True

End Sub

'Private Sub Txt_carpeta_trabajo_Change()

'Dim Ubicacion_Carpeta As String

'Dim s As String

'Dim n As Integer

'Ubicacion_Carpeta = Txt_carpeta_trabajo.Text

'NumQGDs = ContarFicherosQGD(Ubicacion_Carpeta)

'Lbl_num_qgds.Caption = "Nº total de ficheros de datos GCMS = " & NumQGDs

'If NumQGDs = 0 Then

' MsgBox "Has seleccionado una carpeta que no contiene ningún fichero *.qgd", vbOKOnly, "Atencion"

'Else

' ReDim NombresFicheros(NumQGDs - 1)

' ReDim PathFicheros(NumQGDs - 1)

' AsignarDatosFicheros NumQGDs, Ubicacion_Carpeta

' SortArray NombresFicheros 'ordenar alfabeticamente los nombres

' SortArray PathFicheros ' ordenar alfabeticamente los path

' For n = 0 To NumQGDs - 1

' 's = s & NombresFicheros(n) & vbCrLf

' 'Text2.Text = s

' List_nombres_qgds.AddItem NombresFicheros(n)

' Next

'End If

'End Sub

Anexo B : Listado del programa

136

Private Sub Txt_fichero_seleccionado_Change()

Cmd_generar_grafico.Caption = "Generar grafico 3D para " & List_nombres_qgds.Text

End Sub

Anexo B : Listado del programa

137

B.1.2. Formulario Form_Inicio.

'####################################################################

'###### ######

'###### CODIGO RELATIVO AL FORMULARIO DE INICIO ######

'###### ######

'####################################################################

Option Explicit

'--------------------------------------------------------------------

'Procedimiento que se ejecuta cuando tiene lugar el evento de

'pulsar el botón "Examinar..." se llama al procedimiento que

'abre el cuadro de dialogo de windows "Buscar carpeta..."

'--------------------------------------------------------------------

Private Sub cmd_examinar_carpeta_Click()

Txt_carpeta_trabajo.Text = BrowseForFolder(Me.hWnd, "Selecciona una carpeta")

End Sub

Private Sub Cmd_graficos_Click()

Form_graficos.Show

Hide

End Sub

Private Sub Cmd_PCA_Click()

Form_pca.Show

Hide

End Sub

Private Sub Cmd_texto_Click()

Form_texto.Show

Hide

End Sub

'--------------------------------------------------------------------

'Este procedimiento se ejecuta cuando tiene lugar el evento

'change del cuadro de texto que contiene el path completo de

'la carpeta de trabajo. Cuando se cambia la carpeta de trabajo

'actual por otra se actualizan en todo el programa los textos

Anexo B : Listado del programa

138

'que muestran el path de la carpeta de trabajo. También se

'actualizan todos los cuadros de lista donde están los archivos

'de datos del GCMSSolution que existen en la carpeta.

'--------------------------------------------------------------------

Private Sub Txt_carpeta_trabajo_Change()

Dim Ubicacion_Carpeta As String

Dim s As String

Dim n As Integer

Ubicacion_Carpeta = Txt_carpeta_trabajo.Text

NumQGDs = ContarFicherosQGD(Ubicacion_Carpeta)

Lbl_num_qgds.Caption = "Nº total de ficheros de datos GCMS = " & NumQGDs

If NumQGDs = 0 And Ubicacion_Carpeta <> "" Then

MsgBox "Has seleccionado una carpeta que no contiene ningún fichero *.qgd", vbOKOnly, "Atencion"

ElseIf Ubicacion_Carpeta <> "" Then

Form_graficos.Lbl_carpeta.Caption = Form_graficos.Lbl_carpeta.Caption & Txt_carpeta_trabajo.Text

Form_pca.Lbl_carpeta.Caption = Form_pca.Lbl_carpeta.Caption & Txt_carpeta_trabajo.Text

Form_texto.Lbl_carpeta.Caption = Form_texto.Lbl_carpeta.Caption & Txt_carpeta_trabajo.Text

Form_graficos.Lbl_num_qgds.Caption = "Número de ficheros *.qgd en la lista: " & NumQGDs

Form_pca.Lbl_num_qgds.Caption = "Número de ficheros *.qgd en la lista: " & NumQGDs

Form_texto.Lbl_num_qgds.Caption = "Número de ficheros *.qgd en la lista: " & NumQGDs

ReDim NombresFicheros(NumQGDs - 1)

ReDim PathFicheros(NumQGDs - 1)

AsignarDatosFicheros NumQGDs, Ubicacion_Carpeta

SortArray NombresFicheros 'ordenar alfabeticamente los nombres

SortArray PathFicheros ' ordenar alfabeticamente los path

List_nombres_qgds.Clear

Form_graficos.List_nombres_qgds.Clear

Form_pca.List_nombres_qgds.Clear

Form_texto.List_nombres_qgds.Clear

For n = 0 To NumQGDs - 1

's = s & NombresFicheros(n) & vbCrLf

'Text2.Text = s

List_nombres_qgds.AddItem NombresFicheros(n)

Form_graficos.List_nombres_qgds.AddItem NombresFicheros(n)

Form_pca.List_nombres_qgds.AddItem NombresFicheros(n)

Anexo B : Listado del programa

139

Form_texto.List_nombres_qgds.AddItem NombresFicheros(n)

Next

End If

End Sub

Anexo B : Listado del programa

140

B.1.3. Formulario Form_pca.

'####################################################################

'###### ######

'###### CODIGO RELATIVO AL FORMULARIO DE PCA's ######

'###### ######

'####################################################################

Option Explicit

Public MuestraReferencia As Integer

Public scan_menor As Long

Public scan_mayor As Long

Private Sub ImgTexto_Click()

Form_texto.Show

End Sub

Private Sub ImgGraficos_Click()

Form_graficos.Show

End Sub

Private Sub Cmd_cr_mtrz_alineadas_Click()

'----------------------------------------------------------------

' CREAR MATRICES DE CROMATOGRAFÍA ALINEADAS

'----------------------------------------------------------------

'El codigo que hay en este procedimiento se ejecutará cuando el

'usuario pulse el boton para crear las matrices de cromatografía

'alineadas. Estas matrices contendrán la información relacionada

'con la cromatografía de las sustancias seleccionadas pero ademas

'se habrá realizado un alineamiento previo de los datos.

'De esta forma se eliminan los pequeños errores que se cometen al

'inyectar la muestra en el analizador. Así los resultados obtenidos

'en el posterior tratamiento de los datos (PCA, logica fuzzy...)

'son notablemente mejores.

'El procedimiento consta de una serie de pasos que se detallan a

'continuación:

'

' 1. En primer término se obtienen el valor mínimo y el máximo de

' entre todos los intervalos introducidos por el usuario. Con

' estos límites se construye una matriz con los datos de cro-

Anexo B : Listado del programa

141

' matografía de todas las sustancias para un único intervalo.

' 2. La matriz obtenida se envía al workspace de Matlab y se apli-

' ca la función crosscorr para obtener la correlación cruzada

' de cada uno de los TICs de la matriz con respecto a uno de

' ellos que previamente ha seleccionado el usuario.

' Con los datos proporcionados por esta función se construye

' un array que contiene el desplazamiento de cada uno de los

' TICs con el de referencia.

' 3. Se lleva este vector de desplazamientos de nuevo al visual

' basic. Ahora se contruirá la matriz de cromatografía de nuevo

' teniendo en cuenta los intervalos introducidos por el usuario

' y el desplazamiento del TIC. Por lo tanto, cada vez que se

' quiera obtener el TIC en un determinado scan se tendrá en

' cuenta el desplazamiento:

'

' d = i + MTRZ_DESPLA_Real(n + 1) 'Despla(n) tendrá el valor

' 'de desplazamiento para la

' Dato_intensidad_TIC(d) 'sustancia n. d será el valor

' 'de scan una vez se le ha

' 'sumado el valor de

' 'desplazamiento

'

' También se creará una matriz de variables que contendrá el

' nombre de la variable (scan) a la que corresponde el valor

' de TIC que serán de la forma: s1,s2,s3,s4...

' Finalmente se crea una matriz o array con los nombres de las

' sustancias (objetos), de las cuales se incluyen los TICs.

' La información proporcionada por los tres arrays o matrices

' se utilizará posteriormente en tratamientos matematicos como

' PCA's.

' Estas 3 matrices se relacionan de la siguiente manera:

'

' s1 s2 s3 s4 s5 s6 ...

' sustancia1 TIC1(1) TIC1(2) TIC1(3) ...

' sustancia2 TIC2(1) TIC2(2) TIC2(3) ...

' sustancia3 TIC3(1) TIC3(2) TIC3(3) ...

' sustancia4 TIC4(1) TIC4(2) TIC4(3) ...

' sustancia5 TIC5(1) TIC5(2) TIC5(3) ...

' ...

'

Anexo B : Listado del programa

142

Dim m As Integer

Dim sustancia As Integer

Dim scan As Integer

Dim n As Integer

Dim i As Integer

Dim d As Integer

Dim path As String

Dim ReadOnly As Integer

Dim scan_ini As Integer 'valor minimo de los intervalos de scans

Dim scan_fin As Integer 'valor maximo de los intervalos de scans

Dim count_number As Long

Dim intensidad_TIC As Long

Dim NoIntervaloNumerico As Boolean

Dim NoIntervaloMinimo As Boolean

Dim IntervaloDesordenado As Boolean

Dim DatoEnIntervalos As Boolean

Dim Mtrz_scan_ini(8) As Variant

Dim Mtrz_scan_fin(8) As Variant

Dim nombre_objeto As String

Dim nombre_objeto_ajustado As String

Dim MTRZ_CR_TOTAL_Real() As Double

Dim MTRZ_CR_TOTAL_Imag() As Double

Dim MTRZ_DESPLA_Real() As Double

Dim MTRZ_DESPLA_Imag() As Double

Dim REF As Integer

'Dim REF_Real(0) As Double

'Dim REF_Imag(0) As Double

'Las matrices, para pasarlas a Matlab deben ser tipo Double

'Por eso lo que se hará es pasar las matrices de los nombres

'de las variables y objetos en código ASCII y posteriormente

'en el Matlab se transformaran a caracteres mediante la

'funcion char()

Dim MTRZ_CR_INT_ALIN_Real() As Double

Dim MTRZ_CR_INT_ALIN_Imag() As Double

Dim MTRZ_CR_VAR_ALIN_Real() As Double

Dim MTRZ_CR_VAR_ALIN_Imag() As Double

Dim MTRZ_CR_OBJ_ALIN_Real() As Double

Dim MTRZ_CR_OBJ_ALIN_Imag() As Double

Dim indice_columna As Integer

Dim Num_scans As Integer

Anexo B : Listado del programa

143

Dim NombreVariable As String

Dim s As Integer

Dim t As Integer

Dim longitud As Integer

Dim long_objeto As Integer

Dim NumeroScansTotal As Integer

NoIntervaloNumerico = False

NoIntervaloMinimo = False

IntervaloDesordenado = False

For m = 0 To 8

Mtrz_scan_ini(m) = Txt_scan_ini(m).Text

Mtrz_scan_fin(m) = Txt_scan_fin(m).Text

Next m

NoIntervaloNumerico = No_Intervalo_Numerico(Mtrz_scan_ini(), Mtrz_scan_fin())

NoIntervaloMinimo = No_Intervalo_Minimo(Mtrz_scan_ini(0), Mtrz_scan_fin(0))

IntervaloDesordenado = Intervalo_Desordenado(Mtrz_scan_ini(), Mtrz_scan_fin())

MousePointer = 11 ' poner el puntero en espera

If List_nombres_qgds.ListCount = 0 Then

MsgBox "No hay ficheros de datos en la lista", vbOKOnly, "Atencion"

MousePointer = 0 'puntero predeterminado

ElseIf NoIntervaloNumerico Then

MsgBox "Debe introducir valores numericos en los límites de intervalo", vbOKOnly, "Atencion"

MousePointer = 0 'puntero predeterminado

ElseIf NoIntervaloMinimo Then

MsgBox "Debe introducir como mínimo un intervalo de scans", vbOKOnly, "Atencion"

MousePointer = 0 'puntero predeterminado

ElseIf IntervaloDesordenado Then

MsgBox "El valor inicial debe ser menor que el valor final", vbOKOnly, "Atencion"

MousePointer = 0 'puntero predeterminado

ElseIf Txt_muestra_ref_cr.Text = "" Then

MsgBox "Debe seleccionar un fichero de referencia para alinear", vbOKOnly, "Atencion"

MousePointer = 0 'puntero predeterminado

Else

scan_ini = Minimo(Mtrz_scan_ini())

scan_menor = scan_ini

Anexo B : Listado del programa

144

scan_fin = Maximo(Mtrz_scan_fin())

scan_mayor = scan_fin

'

'A continuación se va a calcular la matriz de cromatografía

'para obtener el vector Despla calculado en Matlab.

'

NumeroScansTotal = scan_fin - scan_ini + 1

ReDim MTRZ_CR_TOTAL_Real(1 To List_nombres_qgds.ListCount, scan_ini To scan_fin)

ReDim MTRZ_DESPLA_Real(1 To List_nombres_qgds.ListCount)

For sustancia = 0 To List_nombres_qgds.ListCount - 1

'path del los archivos *.qgd de las diferentes sustancias

path = Form_Inicio.Txt_carpeta_trabajo & "\" & List_nombres_qgds.List(sustancia)

'Se crea el objeto del tipo GCMSData llamando a la función

'CrearObjeto

Call CrearObjeto

'Cargar en el objeto de datos el objeto msrawdata

Call CargarDatos(path, ReadOnly)

'Cargar el ObjetoMSChromatogram

Call CargarTIC

For scan = scan_ini To scan_fin

MTRZ_CR_TOTAL_Real(sustancia + 1, scan) = Dato_intensidad_TIC(scan)

Next scan

If List_nombres_qgds.List(sustancia) = Txt_muestra_ref_cr.Text Then

REF = sustancia + 1

End If

Next sustancia

'Ahora la matriz MTRZ_CR_TOTAL_Real contiene los TICs de todas

'las sustancia. El siguiente paso será pasarla a Matlab y obtener

'el vector despla.

Call CrearMatlab 'Creamos un objeto COM para comunicar con Matlab

Call Matlab.PutFullMatrix("TIC", "base", MTRZ_CR_TOTAL_Real, MTRZ_CR_TOTAL_Imag)

'Call Matlab.PutFullMatrix("REF", "base", REF_Real, REF_Imag)

Result = Matlab.Execute("REF = " & REF & ";")

Result = Matlab.Execute("[DESPLA] = ObtenerDesplazamiento(TIC,REF);")

Txt_Matlab.Text = Result

Call Matlab.GetFullMatrix("DESPLA", "base", MTRZ_DESPLA_Real, MTRZ_DESPLA_Imag)

Anexo B : Listado del programa

145

'

'Ya hemos obtenido el vector de desplazamientos que nos permitirá

'obtener los datos de TICs de forma que la matriz resultante

'quede alineada.

'

Call Liberar_objetos_textos

Num_scans = Numero_scans(Mtrz_scan_ini(), Mtrz_scan_fin())

ReDim MTRZ_CR_INT_ALIN_Real(1 To List_nombres_qgds.ListCount, 1 To Num_scans)

'matriz que va a contener los nombres de las variables en

'numeros ASCII se reservan 5 caracteres para el nombre de

'la variable, ej.: "s1234"

ReDim MTRZ_CR_VAR_ALIN_Real(1 To Num_scans, 1 To 5)

'matriz que va a contener los nombres de los objetos en

'numeros ASCII se reservan 20 caracteres para el nombre

'del objeto o fichero de datos GCMSsolution

ReDim MTRZ_CR_OBJ_ALIN_Real(1 To List_nombres_qgds.ListCount, 1 To 20)

For n = 0 To List_nombres_qgds.ListCount - 1

path = Form_Inicio.Txt_carpeta_trabajo & "\" & List_nombres_qgds.List(n)

'Crear el objeto GCMSData

Call CrearObjeto

'Cargar en el objeto de datos el objeto msrawdata

Call CargarDatos(path, ReadOnly)

'Cargar el ObjetoMSChromatogram

Call CargarTIC

indice_columna = 1

For i = scan_ini To scan_fin

'intensidad_TIC = Dato_intensidad_TIC(i)

DatoEnIntervalos = Dato_en_intervalos(i, Mtrz_scan_ini(), Mtrz_scan_fin())

If DatoEnIntervalos Then

d = i + MTRZ_DESPLA_Real(n + 1)

'count_number = Count

'If d > 1 And d < count_number Then

intensidad_TIC = Dato_intensidad_TIC(d)

'Else

'intensidad_TIC = 0

'End If

MTRZ_CR_INT_ALIN_Real(n + 1, indice_columna) = intensidad_TIC

Anexo B : Listado del programa

146

'En las siguientes lineas se asigna valores ASCII

'del nombre de la variable Se realizará sólo una

'vez para n=0 ya que será igual para todos los

'objetos

NombreVariable = cr_nombre_variable(i)

If n = 0 Then

For s = 1 To Len(NombreVariable)

longitud = Len(NombreVariable)

MTRZ_CR_VAR_ALIN_Real(indice_columna, s) = Asc(NombreVariable)

NombreVariable = Right(NombreVariable, longitud - 1)

Next s

End If

indice_columna = indice_columna + 1

End If

Next i

'Se pilla el nombre del fichero sin la extension para

'hacer el fichero de texto de objetos

nombre_objeto = Capturar_nombre(path)

nombre_objeto_ajustado = Ajustar_nombre_objeto(nombre_objeto)

'Con el siguiente bucle For rellenamos la matriz con los

'nombres de los objetos pero en formato ASCII

For t = 1 To Len(nombre_objeto_ajustado)

long_objeto = Len(nombre_objeto_ajustado)

MTRZ_CR_OBJ_ALIN_Real(n + 1, t) = Asc(nombre_objeto_ajustado)

nombre_objeto_ajustado = Right(nombre_objeto_ajustado, long_objeto - 1)

Next t

Next n

MousePointer = 0 'puntero predeterminado

Call Liberar_objetos_textos

' Ahora se crea un objeto COM para comunicarse con Matlab

Call CrearMatlab

Call Matlab.PutFullMatrix("CROMATOGRAFIA_ALINEADA", "base", MTRZ_CR_INT_ALIN_Real, MTRZ_CR_INT_ALIN_Imag)

Call Matlab.PutFullMatrix("TIEMPO_RET_ALINEADO", "base", MTRZ_CR_VAR_ALIN_Real, MTRZ_CR_VAR_ALIN_Imag)

Call Matlab.PutFullMatrix("OBJETOS_CR_ALIN", "base", MTRZ_CR_OBJ_ALIN_Real, MTRZ_CR_OBJ_ALIN_Imag)

Result = Matlab.Execute("TIEMPO_RET_ALINEADO = char(TIEMPO_RET_ALINEADO);")

Txt_Matlab.Text = Result

Anexo B : Listado del programa

147

Result = Matlab.Execute("OBJETOS_CR_ALIN = char(OBJETOS_CR_ALIN);")

Txt_Matlab.Text = Result

Result = Matlab.Execute("[CROMATOGRAFIA_ALINEADA_SINCEROS,TIEMPO_RET_ALINEADO_SINCEROS]= quitaceros(CROMATOGRAFIA_ALINEADA,TIEMPO_RET_ALINEADO);")

Txt_Matlab.Text = Result

MsgBox "Matrices de TICs,variables y objetos alineadas creadas", vbOKOnly, "Matrices alineadas creadas"

End If

End Sub

Private Sub Cmd_cr_mtrz_sinalinear_Click()

'--------------------------------------------------------------------

' CREAR MATRICES DE CROMATOGRAFÍA SIN ALINEAR

'--------------------------------------------------------------------

'El codigo que hay en este procedimiento se ejecutará cuando el usuario

'pulse el boton para crear las matrices "sin alinear". Estas matrices

'contendrán la información relacionada con la cromatografía de las sus-

'tancias seleccionadas. En este procedimiento se creará la matriz de

'TICs, o lo que es lo mismo la cromatografía. También se creará una

'matriz de variables que contendrá el nombre de la variable (scan) a la

'que corresponde el valor de TIC que serán de la forma: s1,s2,s3,s4...

'Finalmente se crea una matriz o array con los nombres de las sustan-

'cias (objetos), de las cuales se incluyen los TICs.

'La información proporcionada por los tres arrays o matrices se utili-

'zará posteriormente en tratamientos matematicos como PCA's.

'Estas 3 matrices se relacionan de la siguiente manera:

'

' s1 s2 s3 s4 s5 s6 s7...

' sustancia1 TIC1(1) TIC1(2) TIC1(3) ...

' sustancia2 TIC2(1) TIC2(2) TIC2(3) ...

' sustancia3 TIC3(1) TIC3(2) TIC3(3) ...

' sustancia4 TIC4(1) TIC4(2) TIC4(3) ...

' sustancia5 TIC5(1) TIC5(2) TIC5(3) ...

' ...

'

Dim m As Integer

Dim n As Integer

Dim i As Integer

Dim path As String

Dim ReadOnly As Integer

Anexo B : Listado del programa

148

Dim scan_ini As Integer 'valor minimo de los intervalos de scans

Dim scan_fin As Integer 'valor maximo de los intervalos de scans

Dim count_number As Long

Dim intensidad_TIC As Long

Dim NoIntervaloNumerico As Boolean

Dim NoIntervaloMinimo As Boolean

Dim IntervaloDesordenado As Boolean

Dim DatoEnIntervalos As Boolean

Dim Mtrz_scan_ini(8) As Variant

Dim Mtrz_scan_fin(8) As Variant

Dim nombre_objeto As String

Dim nombre_objeto_ajustado As String

'Las matrices, para pasarlas a Matlab deben ser tipo Double

'Por eso lo que se hará es pasar las matrices de los nombres

'de las variables y objetos en código ASCII y posteriormente

'en el Matlab se transformaran a caracteres mediante la

'funcion char()

Dim MTRZ_CR_INT_Real() As Double

Dim MTRZ_CR_INT_Imag() As Double

Dim MTRZ_CR_VAR_Real() As Double

Dim MTRZ_CR_VAR_Imag() As Double

Dim MTRZ_CR_OBJ_Real() As Double

Dim MTRZ_CR_OBJ_Imag() As Double

Dim indice_columna As Integer

Dim Num_scans As Integer

Dim NombreVariable As String

Dim s As Integer

Dim t As Integer

Dim longitud As Integer

Dim long_objeto As Integer

NoIntervaloNumerico = False

NoIntervaloMinimo = False

IntervaloDesordenado = False

For m = 0 To 8

Mtrz_scan_ini(m) = Txt_scan_ini(m).Text

Mtrz_scan_fin(m) = Txt_scan_fin(m).Text

Next m

NoIntervaloNumerico = No_Intervalo_Numerico(Mtrz_scan_ini(), Mtrz_scan_fin())

NoIntervaloMinimo = No_Intervalo_Minimo(Mtrz_scan_ini(0), Mtrz_scan_fin(0))

Anexo B : Listado del programa

149

IntervaloDesordenado = Intervalo_Desordenado(Mtrz_scan_ini(), Mtrz_scan_fin())

MousePointer = 11 ' poner el puntero en espera

If List_nombres_qgds.ListCount = 0 Then

MsgBox "No hay ficheros de datos en la lista", vbOKOnly, "Atencion"

MousePointer = 0 'puntero predeterminado

ElseIf NoIntervaloNumerico Then

MsgBox "Debe introducir valores numericos en los límites de intervalo", vbOKOnly, "Atencion"

MousePointer = 0 'puntero predeterminado

ElseIf NoIntervaloMinimo Then

MsgBox "Debe introducir como mínimo un intervalo de scans", vbOKOnly, "Atencion"

MousePointer = 0 'puntero predeterminado

ElseIf IntervaloDesordenado Then

MsgBox "El valor inicial debe ser menor que el valor final", vbOKOnly, "Atencion"

MousePointer = 0 'puntero predeterminado

Else

scan_ini = Minimo(Mtrz_scan_ini())

scan_menor = scan_ini

scan_fin = Maximo(Mtrz_scan_fin())

scan_mayor = scan_fin

Num_scans = Numero_scans(Mtrz_scan_ini(), Mtrz_scan_fin())

ReDim MTRZ_CR_INT_Real(1 To List_nombres_qgds.ListCount, 1 To Num_scans)

'matriz que va a contener los nombres de las variables en

'numeros ASCII se reservan 5 caracteres para el nombre de

'la variable, ej.: "s1234"

ReDim MTRZ_CR_VAR_Real(1 To Num_scans, 1 To 5)

'matriz que va a contener los nombres de los objetos en

'numeros ASCII se reservan 20 caracteres para el nombre

'del objeto o fichero de datos GCMSsolution

ReDim MTRZ_CR_OBJ_Real(1 To List_nombres_qgds.ListCount, 1 To 20)

For n = 0 To List_nombres_qgds.ListCount - 1

path = Form_Inicio.Txt_carpeta_trabajo & "\" & List_nombres_qgds.List(n)

'Crear el objeto GCMSData

Call CrearObjeto

'Cargar en el objeto de datos el objeto msrawdata

Call CargarDatos(path, ReadOnly)

'Cargar el ObjetoMSChromatogram

Anexo B : Listado del programa

150

Call CargarTIC

indice_columna = 1

For i = scan_ini To scan_fin

'intensidad_TIC = Dato_intensidad_TIC(i)

DatoEnIntervalos = Dato_en_intervalos(i, Mtrz_scan_ini(), Mtrz_scan_fin())

If DatoEnIntervalos Then

intensidad_TIC = Dato_intensidad_TIC(i)

MTRZ_CR_INT_Real(n + 1, indice_columna) = intensidad_TIC

'En las siguientes lineas se asigna valores

'ASCII del nombre de la variable. Se realizará sólo

'una vez para n=0 ya que será igual para todos los

'objetos

NombreVariable = cr_nombre_variable(i)

If n = 0 Then

For s = 1 To Len(NombreVariable)

longitud = Len(NombreVariable)

MTRZ_CR_VAR_Real(indice_columna, s) = Asc(NombreVariable)

NombreVariable = Right(NombreVariable, longitud - 1)

Next s

End If

indice_columna = indice_columna + 1

End If

Next i

'Se pilla el nombre del fichero sin la extension para

'hacer el fichero de texto de objetos

nombre_objeto = Capturar_nombre(path)

nombre_objeto_ajustado = Ajustar_nombre_objeto(nombre_objeto)

'Con el siguiente bucle For rellenamos la matriz con los

'nombres de los objetos pero en formato ASCII

For t = 1 To Len(nombre_objeto_ajustado)

long_objeto = Len(nombre_objeto_ajustado)

MTRZ_CR_OBJ_Real(n + 1, t) = Asc(nombre_objeto_ajustado)

nombre_objeto_ajustado = Right(nombre_objeto_ajustado, long_objeto - 1)

Next t

Next n

MousePointer = 0 'puntero predeterminado

Call Liberar_objetos_textos

'Ahora se crea un objeto COM para comunicarse con Matlab

Anexo B : Listado del programa

151

Call CrearMatlab

Call Matlab.PutFullMatrix("CROMATOGRAFIA", "base", MTRZ_CR_INT_Real, MTRZ_CR_INT_Imag)

Call Matlab.PutFullMatrix("TIEMPO_RET", "base", MTRZ_CR_VAR_Real, MTRZ_CR_VAR_Imag)

Call Matlab.PutFullMatrix("OBJETOS_CR", "base", MTRZ_CR_OBJ_Real, MTRZ_CR_OBJ_Imag)

Result = Matlab.Execute("TIEMPO_RET = char(TIEMPO_RET);")

Txt_Matlab.Text = Result

Result = Matlab.Execute("OBJETOS_CR = char(OBJETOS_CR);")

Txt_Matlab.Text = Result

Result = Matlab.Execute("[CROMATOGRAFIA_SINCEROS,TIEMPO_RET_SINCEROS]= quitaceros(CROMATOGRAFIA,TIEMPO_RET);")

Txt_Matlab.Text = Result

MsgBox "Matrices de TICs,variables y objetos creadas", vbOKOnly, "Matrices creadas"

End If

End Sub

'Este procedimiento se ejecuta cuando se pulsa el botón de eliminar

'un fichero del cuadro de lista de los archivos. En ese momento

'se llama al método RemoveItem del control y se elimina el archivo

'de la lista.

Private Sub Cmd_elm_qgd_Click()

If List_nombres_qgds.Text = "" Then

MsgBox "Debes seleccionar un fichero de la lista", vbOKOnly, "Atencion"

Else

List_nombres_qgds.RemoveItem List_nombres_qgds.ListIndex

Lbl_num_qgds.Caption = "Número de ficheros *.qgd en la lista: " & List_nombres_qgds.ListCount

End If

End Sub

Private Sub Cmd_esp_mtrz_alineadas_Click()

'----------------------------------------------------------------------

' PROCEDIMIENTO PARA CREAR MATRICES DE ESPECTROMETRÍA ALINEADAS

' (CON VALORES DE INTENSIDADES ABSOLUTAS)

'----------------------------------------------------------------------

' El codigo que hay en este procedimiento se ejecutará cuando el usua-

' rio pulse el boton para crear las matrices de espectrometría alinea-

' das. Estas matrices contendrán la información relacionada con la

Anexo B : Listado del programa

152

' espectrometría de las sustancias seleccionadas pero ademas se habrá

' realizado un alineamiento previo de los datos. De esta forma se eli-

' minan los pequeños errores que se cometen al inyectar la muestra en

' el analizador. Así los resultados obtenidos en el posterior trata-

' miento de los datos (PCA, logica fuzzy...) son notablemente mejores.

' El procedimiento consta de una serie de pasos que se detallan a

' continuación:

'

' 1. En primer término se obtienen el valor mínimo y el máximo de

' entre todos los intervalos introducidos por el usuario. Con estos

' límites se construye una matriz con los TICs de todas las sustan-

' cias para un único intervalo.

' 2. La matriz obtenida se envía al workspace de Matlab y se aplica la

' función crosscorr para obtener la correlación cruzada de cada uno

' de los TICs de la matriz con respecto a uno de ellos que previa-

' mente ha seleccionado el usuario. Con los datos proporcionados

' por esta función se construye un array que contiene el desplaza-

' miento de cada uno de los TICs con el de referencia.

' 3. Se lleva este vector de desplazamientos de nuevo al visual basic.

' Ahora se contruirá la matriz de ESPECTROMETRIA (MAT2PCA) de nuevo

' teniendo en cuenta los intervalos introducidos por el usuario

' y el desplazamiento del TIC. Por lo tanto, cada vez que se quiera

' obtener la intensidad en un determinado scan se tendrá en cuenta

' el desplazamiento y se "ajustará" el valor de scan al valor que

' le corresponde para que el dato esté alineado:

'

' d = i + MTRZ_DESPLA_Real(n + 1)

' intensidad = intensidad + DataIntensidad(d, k)

'

' Despla(n) tendrá el valor de desplazamiento

' para la sustancia n. d será el valor de scan

' una vez se le ha sumado el valor de desplazamiento

' donde:

' i es el valor de scan

' d es el valor de scan que se debe utilizar teniendo en

' cuenta el desplazamiento

' k es el valor de masa

' DataIntensidad es la función que devuelve

'

' También se creará una matriz de variables que contendrá el nombre

Anexo B : Listado del programa

153

' de la variable a la que corresponde el valor de intensidad. En

' este nombre de variable se indica el scan y la masa a la que

' corresponden.

' Finalmente se crea una matriz o array con los nombres de las

' sustancias (objetos), de las cuales se incluyen los TICs.

' La información proporcionada por los tres arrays o matrices se

' utilizará posteriormente en tratamientos matematicos como PCA's.

' Estas 3 matrices se relacionan de la siguiente manera:

'

' s10m40 s10m41 s10m42 ... s11m40 s11m41 s11m42...

' sustancia1 inten. inten. inten. ... inten. inten. inten....

' sustancia2 inten. inten. inten. ... inten. inten. inten....

' sustancia3 inten. inten. inten. ... inten. inten. inten....

' sustancia4 inten. inten. inten. ... inten. inten. inten....

' ...

'

Dim m As Integer

Dim sustancia As Integer

Dim scan As Integer

Dim n As Integer

Dim i As Integer

Dim d As Integer

Dim j As Integer

Dim k As Integer

Dim s As Integer

Dim t As Integer

Dim masa1 As Long

Dim masa2 As Integer

Dim path As String

Dim ReadOnly As Integer

Dim scan_ini As Integer 'valor minimo de los intervalos de scans

Dim scan_fin As Integer 'valor maximo de los intervalos de scans

Dim masa_ini As Integer 'valor minimo de los intervalos de scans

Dim masa_fin As Integer 'valor maximo de los intervalos de scans

Dim intensidad As Long

Dim NombreVariable As String

'(de momento no se usa)Dim NoIntervaloNumerico As Boolean

Dim NoIntervaloMinimo As Boolean

Dim IntervaloDesordenado As Boolean

Anexo B : Listado del programa

154

Dim DatoEnIntervalos As Boolean

Dim Mtrz_scan_ini(8) As Variant

Dim Mtrz_scan_fin(8) As Variant

Dim Mtrz_masa_ini(8) As Variant

Dim Mtrz_masa_fin(8) As Variant

Dim nombre_objeto As String

Dim nombre_objeto_ajustado As String

Dim MTRZ_CR_TOTAL_Real() As Double

Dim MTRZ_CR_TOTAL_Imag() As Double

Dim MTRZ_DESPLA_Real() As Double

Dim MTRZ_DESPLA_Imag() As Double

Dim REF As Integer

'Las matrices, para pasarlas a Matlab deben ser tipo Double

'Por eso lo que se hará es pasar las matrices de los nombres

'de las variables y objetos en código ASCII y posteriormente

'en el Matlab se transformaran a caracteres mediante la

'funcion char()

Dim MTRZ_ESP_INT_ALIN_Real() As Double

Dim MTRZ_ESP_INT_ALIN_Imag() As Double

Dim MTRZ_ESP_VAR_ALIN_Real() As Double

Dim MTRZ_ESP_VAR_ALIN_Imag() As Double

Dim MTRZ_ESP_OBJ_ALIN_Real() As Double

Dim MTRZ_ESP_OBJ_ALIN_Imag() As Double

Dim NumVariables As Long

Dim indice_columna As Long

Dim longitud As Integer

Dim long_objeto As Integer

Dim NumeroScansTotal As Integer

ReadOnly = 1

For m = 0 To 8

Mtrz_scan_ini(m) = Txt_scan_ini(m).Text

Mtrz_scan_fin(m) = Txt_scan_fin(m).Text

Mtrz_masa_ini(m) = Txt_mas_ini(m).Text

Mtrz_masa_fin(m) = Txt_mas_fin(m).Text

Next m

'NoIntervaloNumerico = False

NoIntervaloMinimo = False

IntervaloDesordenado = False

'NoIntervaloNumerico = No_Intervalo_Numerico_esp(Mtrz_scan_ini(), Mtrz_scan_fin(), Mtrz_masa_ini(), Matriz_masa_fin())

Anexo B : Listado del programa

155

NoIntervaloMinimo = No_Intervalo_Minimo_esp(Mtrz_scan_ini(0), Mtrz_scan_fin(0), Mtrz_masa_ini(0), Mtrz_masa_fin(0))

IntervaloDesordenado = Intervalo_Desordenado_esp(Mtrz_scan_ini(), Mtrz_scan_fin(), Mtrz_masa_ini(), Mtrz_masa_fin())

MousePointer = 11 ' poner el puntero en espera

If List_nombres_qgds.ListCount = 0 Then

MsgBox "No hay ficheros de datos en la lista", vbOKOnly, "Atencion"

MousePointer = 0 'puntero predeterminado

'ElseIf NoIntervaloNumerico Then

' MsgBox "Debe introducir valores numericos en los límites de intervalo", vbOKOnly, "Atencion"

ElseIf NoIntervaloMinimo Then

MsgBox "Debe introducir como mínimo un intervalo de scans", vbOKOnly, "Atencion"

MousePointer = 0 'puntero predeterminado

ElseIf IntervaloDesordenado Then

MsgBox "El valor inicial debe ser menor que el valor final", vbOKOnly, "Atencion"

MousePointer = 0 'puntero predeterminado

ElseIf Txt_muestra_ref_esp.Text = "" Then

MsgBox "Debe seleccionar un fichero de referencia para alinear", vbOKOnly, "Atencion"

MousePointer = 0 'puntero predeterminado

Else

scan_ini = Minimo(Mtrz_scan_ini())

scan_fin = Maximo(Mtrz_scan_fin())

masa_ini = Minimo(Mtrz_masa_ini())

masa_fin = Maximo(Mtrz_masa_fin())

' A continuación se va a calcular la matriz de cromatografía para obtener el vector

' Despla calculado en Matlab.

'

NumeroScansTotal = scan_fin - scan_ini + 1

ReDim MTRZ_CR_TOTAL_Real(1 To List_nombres_qgds.ListCount, scan_ini To scan_fin)

ReDim MTRZ_DESPLA_Real(1 To List_nombres_qgds.ListCount)

For sustancia = 0 To List_nombres_qgds.ListCount - 1

'path del los archivos *.qgd de las diferentes sustancias

path = Form_Inicio.Txt_carpeta_trabajo & "\" & List_nombres_qgds.List(sustancia)

'Se crea el objeto del tipo GCMSData llamando a la función CrearObjeto

Call CrearObjeto

Anexo B : Listado del programa

156

'Cargar en el objeto de datos el objeto msrawdata

Call CargarDatos(path, ReadOnly)

'Cargar el ObjetoMSChromatogram

Call CargarTIC

For scan = scan_ini To scan_fin

MTRZ_CR_TOTAL_Real(sustancia + 1, scan) = Dato_intensidad_TIC(scan)

Next scan

If List_nombres_qgds.List(sustancia) = Txt_muestra_ref_esp.Text Then

REF = sustancia + 1

End If

Next sustancia

'Ahora la matriz MTRZ_CR_TOTAL_Real contiene los TICs de todas

'las sustancias. El siguiente paso será pasarla a Matlab y

'obtener el vector despla.

Call CrearMatlab 'Creamos un objeto COM para comunicar con Matlab

Call Matlab.PutFullMatrix("TIC", "base", MTRZ_CR_TOTAL_Real, MTRZ_CR_TOTAL_Imag)

'Call Matlab.PutFullMatrix("REF", "base", REF_Real, REF_Imag)

Result = Matlab.Execute("REF = " & REF & ";")

Result = Matlab.Execute("[DESPLA] = ObtenerDesplazamiento(TIC,REF);")

Txt_Matlab.Text = Result

Call Matlab.GetFullMatrix("DESPLA", "base", MTRZ_DESPLA_Real, MTRZ_DESPLA_Imag)

'Ya hemos obtenido el vector de desplazamientos que nos permitirá

'obtener los datos de TICs de forma que la matriz resultante

'quede alineada.

'

Call Liberar_objetos_textos

'Aquí ha terminado la obtención del vector DESPLA y empieza la

'obtención de las matrices de intensidades, objetos y variables.

'La unica diferencia es que ahora al obtener la intensidad

'correspondiente a una masa y scan se tendrá en cuenta el

'desplazamiento que tiene la sustancia para que al final los

'valores de intensidades queden alineados.

NumVariables = Numero_variables(Mtrz_scan_ini(), Mtrz_scan_fin(), Mtrz_masa_ini(), Mtrz_masa_fin())

ReDim MTRZ_ESP_INT_ALIN_Real(1 To List_nombres_qgds.ListCount, 1 To NumVariables)

Anexo B : Listado del programa

157

'matriz que va a contener los nombres de las variables en numeros ASCII

'se reservan 9 caracteres para el nombre de la variable, ej: "s1234m135"

ReDim MTRZ_ESP_VAR_ALIN_Real(1 To NumVariables, 1 To 9)

'matriz que va a contener los nombres de los objetos en numeros

'ASCII se reservan 20 caracteres para el nombre del objeto o

'fichero de datos GCMSsolution

ReDim MTRZ_ESP_OBJ_ALIN_Real(1 To List_nombres_qgds.ListCount, 1 To 20)

For n = 0 To List_nombres_qgds.ListCount - 1

path = Form_Inicio.Txt_carpeta_trabajo & "\" & List_nombres_qgds.List(n)

'Crear el objeto

Call CrearObjeto

'cargar al objeto datos y el objeto msrawdata

Call CargarDatos(path, ReadOnly)

'cargar el ObjetoMS3DData con "CargarMS3DData"

Call CargarMS3DData

Proj_ScanCount = ScanCount

indice_columna = 1

If scan_ini < 1 Then scan_ini = 1

If scan_fin > Proj_ScanCount Then scan_fin = ScanCount

For i = scan_ini To scan_fin

Proj_SpectrumCount = SpectrumCount(i)

For j = masa_ini To masa_fin

intensidad = 0

For k = 1 To Proj_SpectrumCount

d = i + MTRZ_DESPLA_Real(n + 1)

masa1 = DataMasa(d, k)

masa2 = Int(masa1 / 20 + 0.5)

If masa2 = j Then

intensidad = intensidad + DataIntensidad(d, k)

End If

If masa2 > j Then Exit For

Next k

DatoEnIntervalos = Dato_en_intervalos_esp(i, j, Mtrz_scan_ini(), Mtrz_scan_fin(), Mtrz_masa_ini(), Mtrz_masa_fin())

Anexo B : Listado del programa

158

If DatoEnIntervalos Then

MTRZ_ESP_INT_ALIN_Real(n + 1, indice_columna) = intensidad

'En las siguientes lineas se asigna valores ASCII

'del nombre de la variable. Se realizará sólo una

'vez para n=0 ya que será igual para todos los objetos

If n = 0 Then

NombreVariable = esp_nombre_variable(i, j)

For s = 1 To Len(NombreVariable)

longitud = Len(NombreVariable)

MTRZ_ESP_VAR_ALIN_Real(indice_columna, s) = Asc(NombreVariable)

NombreVariable = Right(NombreVariable, longitud - 1)

Next s

End If

indice_columna = indice_columna + 1

End If

Next j

Next i

'Se guarda el nombre del fichero sin la extension para

'hacer el fichero de texto de objetos

nombre_objeto = Capturar_nombre(path)

nombre_objeto_ajustado = Ajustar_nombre_objeto(nombre_objeto)

'Con el siguiente bucle For rellenamos la matriz con los nombres

'de los objetos pero en formato ASCII

For t = 1 To Len(nombre_objeto_ajustado)

long_objeto = Len(nombre_objeto_ajustado)

MTRZ_ESP_OBJ_ALIN_Real(n + 1, t) = Asc(nombre_objeto_ajustado)

nombre_objeto_ajustado = Right(nombre_objeto_ajustado, long_objeto - 1)

Next t

Next n

MousePointer = 0 ' puntero predeterminado

Call Liberar_objetos

' se crea un objeto COM para comunicarse con Matlab

Call CrearMatlab

Anexo B : Listado del programa

159

Call Matlab.PutFullMatrix("MAT2PCA_ALINEADA", "base", MTRZ_ESP_INT_ALIN_Real, MTRZ_ESP_INT_ALIN_Imag)

Call Matlab.PutFullMatrix("VARIABLES_ALINEADA", "base", MTRZ_ESP_VAR_ALIN_Real, MTRZ_ESP_VAR_ALIN_Imag)

Call Matlab.PutFullMatrix("OBJETOS_ESP_ALIN", "base", MTRZ_ESP_OBJ_ALIN_Real, MTRZ_ESP_OBJ_ALIN_Imag)

Result = Matlab.Execute("VARIABLES_ALINEADA = char(VARIABLES_ALINEADA);")

Txt_Matlab.Text = Result

Result = Matlab.Execute("OBJETOS_ESP_ALIN = char(OBJETOS_ESP_ALIN);")

Txt_Matlab.Text = Result

Result = Matlab.Execute("[MAT2PCA_ALINEADA_SINCEROS,VARIABLES_ALINEADA_SINCEROS]= quitaceros(MAT2PCA_ALINEADA,VARIABLES_ALINEADA);")

Txt_Matlab.Text = Result

MsgBox "Matrices de espectrometría intensidades,variables y objetos creadas", vbOKOnly, "Matrices creadas"

End If

End Sub

Private Sub Cmd_esp_mtrz_alineadas_rel_Click()

'-----------------------------------------------------------------------

' PROCEDIMIENTO PARA CREAR LAS MATRICES ALINEADAS DE ESPECTROMETRÍA

' (CON VALORES DE INTENSIDADES RELATIVAS)

'-----------------------------------------------------------------------

' El codigo que hay en este procedimiento se ejecutará cuando el

' usuario pulse el boton para crear las matrices de espectrometría

' alineadas. Estas matrices contendrán la información relacionada

' con la espectrometría de las sustancias seleccionadas (intensidad

' relativa) pero ademas se habrá realizado un alineamiento previo de

' los datos. De esta forma se eliminan los pequeños errores que se

' cometen al inyectar la muestra en el analizador. Así los resultados

' obtenidos en el posterior tratamiento de los datos (PCA, logica

' fuzzy...) son notablemente mejores.

' El procedimiento consta de una serie de pasos que se detallan a

' continuación:

'

' 1. En primer término se obtienen el valor mínimo y el máximo de entre

' todos los intervalos introducidos por el usuario. Con estos

' límites se construye una matriz con los TICs de todas las sustan-

' cias para un único intervalo.

' 2. La matriz obtenida se envía al workspace de Matlab y se aplica la

Anexo B : Listado del programa

160

' función crosscorr para obtener la correlación cruzada de cada uno

' de los TICs de la matriz con respecto a uno de ellos que

' previamente ha seleccionado el usuario.

' Con los datos proporcionados por esta función se construye un

' array que contiene el desplazamiento de cada uno de los TICs con

' el de referencia.

' 3. Se lleva este vector de desplazamientos de nuevo al visual basic.

' Ahora se contruirá la matriz de ESPECTROMETRIA (MAT2PCA) de nuevo

' teniendo en cuenta los intervalos introducidos por el usuario y el

' desplazamiento del TIC. Por lo tanto, cada vez que se quiera

' obtener la intensidad en un determinado scan se tendrá en cuenta

' el desplazamiento y se "ajustará" el valor de scan al valor que le

' corresponde para que el dato esté alineado:

'

' d = i + MTRZ_DESPLA_Real(n + 1)

' intensidad = intensidad + DataIntensidad(d, k)

'

' Despla(n) tendrá el valor de desplazamiento

' para la sustancia n. d será el valor de scan

' una vez se le ha sumado el valor de desplazamiento

'

' donde:

' i es el valor de scan

' d es el valor de scan que se debe utilizar teniendo en

' cuenta el desplazamiento

' k es el valor de masa

' DataIntensidad es la función que devuelve el valor de la

' intensidad para un determinado instante de tiempo (scan) y para

' una masa determinada. Después de obtener el valor de intensidad

' absoluta se calcula la intensidad relativa en función de la

' intensidad del pico base para cada scan.

' También se creará una matriz de variables que contendrá el nombre

' de la variable a la que corresponde el valor de intensidad.

' En este nombre de variable se indica el scan y la masa a la que

' corresponden. Finalmente se crea una matriz o array con los

' nombres de las sustancias (objetos), de las cuales se incluyen los

' TICs. La información proporcionada por los tres arrays o matrices

' se utilizará posteriormente en tratamientos matematicos como PCA's.

' Estas 3 matrices se relacionan de la siguiente manera:

'

Anexo B : Listado del programa

161

' s10m40 s10m41 s10m42 ... s11m40 s11m41 s11m42 ...

' sustancia1 int_rel int_rel int_rel ...int_rel int_rel int_rel ...

' sustancia2 int_rel int_rel int_rel ...int_rel int_rel int_rel ...

' sustancia3 int_rel int_rel int_rel ...int_rel int_rel int_rel ...

' sustancia4 int_rel int_rel int_rel ...int_rel int_rel int_rel ...

' ...

'

Dim m As Integer

Dim sustancia As Integer

Dim scan As Integer

Dim n As Integer

Dim i As Integer

Dim d As Integer

Dim j As Integer

Dim k As Integer

Dim s As Integer

Dim t As Integer

Dim masa1 As Long

Dim masa2 As Integer

Dim path As String

Dim ReadOnly As Integer

Dim scan_ini As Integer 'valor minimo de los intervalos de scans

Dim scan_fin As Integer 'valor maximo de los intervalos de scans

Dim masa_ini As Integer 'valor minimo de los intervalos de scans

Dim masa_fin As Integer 'valor maximo de los intervalos de scans

Dim intensidad As Long

Dim NombreVariable As String

'(de momento no se usa)Dim NoIntervaloNumerico As Boolean

Dim NoIntervaloMinimo As Boolean

Dim IntervaloDesordenado As Boolean

Dim DatoEnIntervalos As Boolean

Dim Mtrz_scan_ini(8) As Variant

Dim Mtrz_scan_fin(8) As Variant

Dim Mtrz_masa_ini(8) As Variant

Dim Mtrz_masa_fin(8) As Variant

Dim nombre_objeto As String

Dim nombre_objeto_ajustado As String

Dim MTRZ_CR_TOTAL_Real() As Double

Dim MTRZ_CR_TOTAL_Imag() As Double

Anexo B : Listado del programa

162

Dim MTRZ_DESPLA_Real() As Double

Dim MTRZ_DESPLA_Imag() As Double

Dim REF As Integer

'Las matrices, para pasarlas a Matlab deben ser tipo Double

'Por eso lo que se hará es pasar las matrices de los nombres

'de las variables y objetos en código ASCII y posteriormente

'en el Matlab se transformaran a caracteres mediante la

'funcion char()

Dim MTRZ_ESP_INT_REL_ALIN_Real() As Double

Dim MTRZ_ESP_INT_REL_ALIN_Imag() As Double

Dim MTRZ_ESP_VAR_ALIN_Real() As Double

Dim MTRZ_ESP_VAR_ALIN_Imag() As Double

Dim MTRZ_ESP_OBJ_ALIN_Real() As Double

Dim MTRZ_ESP_OBJ_ALIN_Imag() As Double

Dim NumVariables As Long

Dim indice_columna As Long

Dim longitud As Integer

Dim long_objeto As Integer

Dim NumeroScansTotal As Integer

Dim Intervalo As Long

Dim RT As Long

Dim IntensidadRelativa As Currency

Dim Int_BasePeak As Long

ReadOnly = 1

'NoIntervaloNumerico = False

NoIntervaloMinimo = False

IntervaloDesordenado = False

For m = 0 To 8

Mtrz_scan_ini(m) = Txt_scan_ini(m).Text

Mtrz_scan_fin(m) = Txt_scan_fin(m).Text

Mtrz_masa_ini(m) = Txt_mas_ini(m).Text

Mtrz_masa_fin(m) = Txt_mas_fin(m).Text

Next m

'NoIntervaloNumerico = No_Intervalo_Numerico_esp(Mtrz_scan_ini(), Mtrz_scan_fin(), Mtrz_masa_ini(), Matriz_masa_fin())

NoIntervaloMinimo = No_Intervalo_Minimo_esp(Mtrz_scan_ini(0), Mtrz_scan_fin(0), Mtrz_masa_ini(0), Mtrz_masa_fin(0))

IntervaloDesordenado = Intervalo_Desordenado_esp(Mtrz_scan_ini(), Mtrz_scan_fin(), Mtrz_masa_ini(), Mtrz_masa_fin())

MousePointer = 11 ' poner el puntero en espera

Anexo B : Listado del programa

163

If List_nombres_qgds.ListCount = 0 Then

MsgBox "No hay ficheros de datos en la lista", vbOKOnly, "Atencion"

MousePointer = 0 'puntero predeterminado

'ElseIf NoIntervaloNumerico Then

' MsgBox "Debe introducir valores numericos en los límites de intervalo", vbOKOnly, "Atencion"

ElseIf NoIntervaloMinimo Then

MsgBox "Debe introducir como mínimo un intervalo de scans", vbOKOnly, "Atencion"

MousePointer = 0 'puntero predeterminado

ElseIf IntervaloDesordenado Then

MsgBox "El valor inicial debe ser menor que el valor final", vbOKOnly, "Atencion"

MousePointer = 0 'puntero predeterminado

ElseIf Txt_muestra_ref_esp.Text = "" Then

MsgBox "Debe seleccionar un fichero de referencia para alinear", vbOKOnly, "Atencion"

MousePointer = 0 'puntero predeterminado

Else

scan_ini = Minimo(Mtrz_scan_ini())

scan_fin = Maximo(Mtrz_scan_fin())

masa_ini = Minimo(Mtrz_masa_ini())

masa_fin = Maximo(Mtrz_masa_fin())

'

' A continuación se va a calcular la matriz de cromatografía

' para obtener el vector Despla calculado en Matlab.

'

NumeroScansTotal = scan_fin - scan_ini + 1

ReDim MTRZ_CR_TOTAL_Real(1 To List_nombres_qgds.ListCount, scan_ini To scan_fin)

ReDim MTRZ_DESPLA_Real(1 To List_nombres_qgds.ListCount)

For sustancia = 0 To List_nombres_qgds.ListCount - 1

'path del los archivos *.qgd de las diferentes sustancias

path = Form_Inicio.Txt_carpeta_trabajo & "\" & List_nombres_qgds.List(sustancia)

'Se crea el objeto del tipo GCMSData llamando a la función

'CrearObjeto

Call CrearObjeto

'Cargar en el objeto de datos el objeto msrawdata

Call CargarDatos(path, ReadOnly)

'Cargar el ObjetoMSChromatogram

Call CargarTIC

Anexo B : Listado del programa

164

For scan = scan_ini To scan_fin

MTRZ_CR_TOTAL_Real(sustancia + 1, scan) = Dato_intensidad_TIC(scan)

Next scan

If List_nombres_qgds.List(sustancia) = Txt_muestra_ref_esp.Text Then

REF = sustancia + 1

End If

Next sustancia

'Ahora la matriz MTRZ_CR_TOTAL_Real contiene los TICs de todas

'las sustancias.

'El siguiente paso será pasarla a Matlab y obtener el

'vector despla.

Call CrearMatlab 'Creamos un objeto COM para comunicar con Matlab

Call Matlab.PutFullMatrix("TIC", "base", MTRZ_CR_TOTAL_Real, MTRZ_CR_TOTAL_Imag)

'Call Matlab.PutFullMatrix("REF", "base", REF_Real, REF_Imag)

Result = Matlab.Execute("REF = " & REF & ";")

Result = Matlab.Execute("[DESPLA] = ObtenerDesplazamiento(TIC,REF);")

Txt_Matlab.Text = Result

Call Matlab.GetFullMatrix("DESPLA", "base", MTRZ_DESPLA_Real, MTRZ_DESPLA_Imag)

'Ya hemos obtenido el vector de desplazamientos que nos permitirá

'obtenerlos datos de TICs de forma que la matriz resultante quede

'alineada.

Call Liberar_objetos_textos

'Aquí ha terminado la obtención del vector DESPLA y empieza la

'obtención de las matrices de intensidades, objetos y variables.

'La unica diferencia es que ahora al obtener la intensidad

'correspondiente a una masa y scan se tendrá en cuenta el

'desplazamiento que tiene la sustancia para que al final

'los valores de intensidades queden alineados.

NumVariables = Numero_variables(Mtrz_scan_ini(), Mtrz_scan_fin(), Mtrz_masa_ini(), Mtrz_masa_fin())

ReDim MTRZ_ESP_INT_REL_ALIN_Real(1 To List_nombres_qgds.ListCount, 1 To NumVariables)

'matriz que va a contener los nombres de las variables en numeros

Anexo B : Listado del programa

165

'ASCII se reservan 9 caracteres para el nombre de la variable,

'ej: "s1234m135"

ReDim MTRZ_ESP_VAR_ALIN_Real(1 To NumVariables, 1 To 9)

'matriz que va a contener los nombres de los objetos en numeros

'ASCII se reservan 20 caracteres para el nombre del objeto o

'fichero de datos GCMSsolution

ReDim MTRZ_ESP_OBJ_ALIN_Real(1 To List_nombres_qgds.ListCount, 1 To 20)

For n = 0 To List_nombres_qgds.ListCount - 1

path = Form_Inicio.Txt_carpeta_trabajo & "\" & List_nombres_qgds.List(n)

'Crear el objeto

Call CrearObjeto

'cargar al objeto datos y el objeto msrawdata

Call CargarDatos(path, ReadOnly)

'cargar el ObjetoMS3DData con "CargarMS3DData"

Call CargarMS3DData

Proj_ScanCount = ScanCount

Intervalo = ObjetoMS3DData.Interval

indice_columna = 1

If scan_ini < 1 Then scan_ini = 1

If scan_fin > Proj_ScanCount Then scan_fin = ScanCount

For i = scan_ini To scan_fin

Proj_SpectrumCount = SpectrumCount(i)

For j = masa_ini To masa_fin

intensidad = 0

For k = 1 To Proj_SpectrumCount

d = i + MTRZ_DESPLA_Real(n + 1)

masa1 = DataMasa(d, k)

masa2 = Int(masa1 / 20 + 0.5)

If masa2 = j Then

intensidad = intensidad + DataIntensidad(d, k)

End If

If masa2 > j Then Exit For

Next k

DatoEnIntervalos = Dato_en_intervalos_esp(i, j, Mtrz_scan_ini(), Mtrz_scan_fin(), Mtrz_masa_ini(), Mtrz_masa_fin())

If DatoEnIntervalos Then

Anexo B : Listado del programa

166

RT = Intervalo * d

Call CargarMSSpectrum(RT, 0)

Int_BasePeak = ObjetoMSSpectrum.BasePeakIntensity

Call LiberarMSSpectrum

IntensidadRelativa = CCur(intensidad * 100 / Int_BasePeak)

MTRZ_ESP_INT_REL_ALIN_Real(n + 1, indice_columna) = Round(IntensidadRelativa, 2)

'En las siguientes lineas se asigna valores ASCII del nombre de la variable

'Se realizará sólo una vez para n=0 ya que será igual para todos los objetos

If n = 0 Then

NombreVariable = esp_nombre_variable(i, j)

For s = 1 To Len(NombreVariable)

longitud = Len(NombreVariable)

MTRZ_ESP_VAR_ALIN_Real(indice_columna, s) = Asc(NombreVariable)

NombreVariable = Right(NombreVariable, longitud - 1)

Next s

End If

indice_columna = indice_columna + 1

End If

Next j

Next i

'Se pilla el nombre del fichero sin la extension para

'hacer el fichero de texto de objetos

nombre_objeto = Capturar_nombre(path)

nombre_objeto_ajustado = Ajustar_nombre_objeto(nombre_objeto)

'Con el siguiente bucle For rellenamos la matriz con los nombres

'de los objetos pero en formato ASCII

For t = 1 To Len(nombre_objeto_ajustado)

long_objeto = Len(nombre_objeto_ajustado)

MTRZ_ESP_OBJ_ALIN_Real(n + 1, t) = Asc(nombre_objeto_ajustado)

nombre_objeto_ajustado = Right(nombre_objeto_ajustado, long_objeto - 1)

Next t

Next n

MousePointer = 0 ' puntero predeterminado

Call Liberar_objetos

Anexo B : Listado del programa

167

' se crea un objeto COM para comunicarse con Matlab

Call CrearMatlab

Call Matlab.PutFullMatrix("MAT2PCA_REL_ALINEADA", "base", MTRZ_ESP_INT_REL_ALIN_Real, MTRZ_ESP_INT_REL_ALIN_Imag)

Call Matlab.PutFullMatrix("VARIABLES_ALINEADA", "base", MTRZ_ESP_VAR_ALIN_Real, MTRZ_ESP_VAR_ALIN_Imag)

Call Matlab.PutFullMatrix("OBJETOS_ESP_ALIN", "base", MTRZ_ESP_OBJ_ALIN_Real, MTRZ_ESP_OBJ_ALIN_Imag)

Result = Matlab.Execute("VARIABLES_ALINEADA = char(VARIABLES_ALINEADA);")

Txt_Matlab.Text = Result

Result = Matlab.Execute("OBJETOS_ESP_ALIN = char(OBJETOS_ESP_ALIN);")

Txt_Matlab.Text = Result

Result = Matlab.Execute("[MAT2PCA_REL_ALINEADA_SINCEROS,VARIABLES_ALINEADA_SINCEROS]= quitaceros(MAT2PCA_REL_ALINEADA,VARIABLES_ALINEADA);")

Txt_Matlab.Text = Result

MsgBox "Matrices de espectrometría intensidades,variables y objetos creadas", vbOKOnly, "Matrices creadas"

End If

End Sub

Private Sub Cmd_esp_mtrz_sinalinear_Click()

'----------------------------------------------------------------------

' CREAR MATRICES DE ESPECTROMETRIA (MAT2PCA) SIN ALINEAR

' CON VALORES ABSOLUTOS DE INTENSIDAD

'----------------------------------------------------------------------

' El codigo que hay en este procedimiento se ejecutará cuando el

' usuario pulse el boton para crear las matrices "sin alinear" . Estas

' matrices contendrán la información relacionada con la espectrometría

' de las sustancias

' seleccionadas. En este procedimiento se creará la matriz de intensi-

' dades que incluirá todos los espectros de los intervalos de tiempo

' seleccionados.

' También se creará una matriz de variables que contendrá el nombre

' de la variable a la que corresponde el valor de intensidad. En este

' nombre de variable se indica el scan y la masa a la que corresponden.

' Finalmente se crea una matriz o array con los nombres de las

' sustancias (objetos), de las cuales se incluyen los TICs. La

' información proporcionada por los tres arrays o

' matrices se utilizará posteriormente en tratamientos matematicos

' como PCA's.

Anexo B : Listado del programa

168

'

' Estas 3 matrices se relacionan de la siguiente manera:

'

' s10m40 s10m41 s10m42 ... s11m40 s11m41 s11m42 ...

' sustancia1 inten. inten. inten. ... inten. inten. inten. ...

' sustancia2 inten. inten. inten. ... inten. inten. inten. ...

' sustancia3 inten. inten. inten. ... inten. inten. inten. ...

' sustancia4 inten. inten. inten. ... inten. inten. inten. ...

' ...

'

Dim m As Integer

Dim n As Integer

Dim i As Integer

Dim j As Integer

Dim k As Integer

Dim s As Integer

Dim t As Integer

Dim masa1 As Long

Dim masa2 As Integer

Dim path As String

Dim ReadOnly As Integer

Dim scan_ini As Integer 'valor minimo de los intervalos de scans

Dim scan_fin As Integer 'valor maximo de los intervalos de scans

Dim masa_ini As Integer 'valor minimo de los intervalos de scans

Dim masa_fin As Integer 'valor maximo de los intervalos de scans

Dim intensidad As Long

Dim NombreVariable As String

'(de momento no se usa)Dim NoIntervaloNumerico As Boolean

Dim NoIntervaloMinimo As Boolean

Dim IntervaloDesordenado As Boolean

Dim DatoEnIntervalos As Boolean

Dim Mtrz_scan_ini(8) As Variant

Dim Mtrz_scan_fin(8) As Variant

Dim Mtrz_masa_ini(8) As Variant

Dim Mtrz_masa_fin(8) As Variant

Dim nombre_objeto As String

Dim nombre_objeto_ajustado As String

'Las matrices, para pasarlas a Matlab deben ser tipo Double

'Por eso lo que se hará es pasar las matrices de los nombres

'de las variables y objetos en código ASCII y posteriormente

Anexo B : Listado del programa

169

'en el Matlab se transformaran a caracteres mediante la funcion

'char()

Dim MTRZ_ESP_INT_Real() As Double

Dim MTRZ_ESP_INT_Imag() As Double

Dim MTRZ_ESP_VAR_Real() As Double

Dim MTRZ_ESP_VAR_Imag() As Double

Dim MTRZ_ESP_OBJ_Real() As Double

Dim MTRZ_ESP_OBJ_Imag() As Double

Dim NumVariables As Long

Dim indice_columna As Long

Dim longitud As Integer

Dim long_objeto As Integer

ReadOnly = 1

For m = 0 To 8

If IsNumeric(Txt_scan_ini(m).Text) Then

Mtrz_scan_ini(m) = Txt_scan_ini(m).Text

Mtrz_scan_fin(m) = Txt_scan_fin(m).Text

Mtrz_masa_ini(m) = Txt_mas_ini(m).Text

Mtrz_masa_fin(m) = Txt_mas_fin(m).Text

Else

Mtrz_scan_ini(m) = 0

Mtrz_scan_fin(m) = 0

Mtrz_masa_ini(m) = 0

Mtrz_masa_fin(m) = 0

End If

Next m

'NoIntervaloNumerico = False

NoIntervaloMinimo = False

IntervaloDesordenado = False

'NoIntervaloNumerico = No_Intervalo_Numerico_esp(Mtrz_scan_ini(), Mtrz_scan_fin(), Mtrz_masa_ini(), Matriz_masa_fin())

NoIntervaloMinimo = No_Intervalo_Minimo_esp(Mtrz_scan_ini(0), Mtrz_scan_fin(0), Mtrz_masa_ini(0), Mtrz_masa_fin(0))

IntervaloDesordenado = Intervalo_Desordenado_esp(Mtrz_scan_ini(), Mtrz_scan_fin(), Mtrz_masa_ini(), Mtrz_masa_fin())

MousePointer = 11 ' poner el puntero en espera

If List_nombres_qgds.ListCount = 0 Then

MsgBox "No hay ficheros de datos en la lista", vbOKOnly, "Atencion"

MousePointer = 0 'puntero predeterminado

'ElseIf NoIntervaloNumerico Then

Anexo B : Listado del programa

170

' MsgBox "Debe introducir valores numericos en los límites de intervalo", vbOKOnly, "Atencion"

ElseIf NoIntervaloMinimo Then

MsgBox "Debe introducir como mínimo un intervalo de scans", vbOKOnly, "Atencion"

MousePointer = 0 'puntero predeterminado

ElseIf IntervaloDesordenado Then

MsgBox "El valor inicial debe ser menor que el valor final", vbOKOnly, "Atencion"

MousePointer = 0 'puntero predeterminado

Else

scan_ini = Minimo(Mtrz_scan_ini())

scan_fin = Maximo(Mtrz_scan_fin())

masa_ini = Minimo(Mtrz_masa_ini())

masa_fin = Maximo(Mtrz_masa_fin())

NumVariables = Numero_variables(Mtrz_scan_ini(), Mtrz_scan_fin(), Mtrz_masa_ini(), Mtrz_masa_fin())

ReDim MTRZ_ESP_INT_Real(1 To List_nombres_qgds.ListCount, 1 To NumVariables)

'matriz que va a contener los nombres de las variables en

'numeros ASCII, se reservan 9 caracteres para el nombre de

'la variable, ej: "s1234m135"

ReDim MTRZ_ESP_VAR_Real(1 To NumVariables, 1 To 9)

'matriz que va a contener los nombres de los objetos en numeros

'ASCII, se reservan 20 caracteres para el nombre del objeto o

'fichero de datos GCMSsolution

ReDim MTRZ_ESP_OBJ_Real(1 To List_nombres_qgds.ListCount, 1 To 20)

For n = 0 To List_nombres_qgds.ListCount - 1

path = Form_Inicio.Txt_carpeta_trabajo & "\" & List_nombres_qgds.List(n)

'Crear el objeto

Call CrearObjeto

'cargar al objeto datos y el objeto msrawdata

Call CargarDatos(path, ReadOnly)

'cargar el ObjetoMS3DData con "CargarMS3DData"

Call CargarMS3DData

Proj_ScanCount = ScanCount

indice_columna = 1

If scan_ini < 1 Then scan_ini = 1

If scan_fin > Proj_ScanCount Then scan_fin = ScanCount

For i = scan_ini To scan_fin

Proj_SpectrumCount = SpectrumCount(i)

Anexo B : Listado del programa

171

For j = masa_ini To masa_fin

intensidad = 0

For k = 1 To Proj_SpectrumCount

masa1 = DataMasa(i, k)

masa2 = Int(masa1 / 20 + 0.5)

If masa2 = j Then

intensidad = intensidad + DataIntensidad(i, k)

End If

If masa2 > j Then Exit For

Next k

DatoEnIntervalos = Dato_en_intervalos_esp(i, j, Mtrz_scan_ini(), Mtrz_scan_fin(), Mtrz_masa_ini(), Mtrz_masa_fin())

If DatoEnIntervalos Then

MTRZ_ESP_INT_Real(n + 1, indice_columna) = intensidad

'En las siguientes lineas se asigna valores ASCII

'del nombre de la variable.

'Se realizará sólo una vez para n=0 ya que será

'igual para todos los objetos

If n = 0 Then

NombreVariable = esp_nombre_variable(i, j)

For s = 1 To Len(NombreVariable)

longitud = Len(NombreVariable)

MTRZ_ESP_VAR_Real(indice_columna, s) = Asc(NombreVariable)

NombreVariable = Right(NombreVariable, longitud - 1)

Next s

End If

indice_columna = indice_columna + 1

End If

Next j

Next i

'Se pilla el nombre del fichero sin la extension para

'hacer el fichero de texto de objetos

nombre_objeto = Capturar_nombre(path)

nombre_objeto_ajustado = Ajustar_nombre_objeto(nombre_objeto)

'Con el siguiente bucle For rellenamos la matriz con los nombres

'de los objetos pero en formato ASCII

For t = 1 To Len(nombre_objeto_ajustado)

Anexo B : Listado del programa

172

long_objeto = Len(nombre_objeto_ajustado)

MTRZ_ESP_OBJ_Real(n + 1, t) = Asc(nombre_objeto_ajustado)

nombre_objeto_ajustado = Right(nombre_objeto_ajustado, long_objeto - 1)

Next t

Next n

MousePointer = 0 ' puntero predeterminado

Call Liberar_objetos

' se crea un objeto COM para comunicarse con Matlab

Call CrearMatlab

Call Matlab.PutFullMatrix("MAT2PCA_SIN_ALINEAR", "base", MTRZ_ESP_INT_Real, MTRZ_ESP_INT_Imag)

Call Matlab.PutFullMatrix("VARIABLES_SIN_ALINEAR", "base", MTRZ_ESP_VAR_Real, MTRZ_ESP_VAR_Imag)

Call Matlab.PutFullMatrix("OBJETOS_ESP", "base", MTRZ_ESP_OBJ_Real, MTRZ_ESP_OBJ_Imag)

Result = Matlab.Execute("VARIABLES_SIN_ALINEAR = char(VARIABLES_SIN_ALINEAR);")

Txt_Matlab.Text = Result

Result = Matlab.Execute("OBJETOS_ESP = char(OBJETOS_ESP);")

Txt_Matlab.Text = Result

Result = Matlab.Execute("[MAT2PCA_SIN_ALINEAR_SINCEROS,VARIABLES_SIN_ALINEAR_SINCEROS]= quitaceros(MAT2PCA_SIN_ALINEAR,VARIABLES_SIN_ALINEAR);")

Txt_Matlab.Text = Result

MsgBox "Matrices de espectrometría intensidades,variables y objetos creadas", vbOKOnly, "Matrices creadas"

End If

End Sub

Private Sub Cmd_esp_mtrz_sinalinear_rel_Click()

'----------------------------------------------------------------------

' CREAR MATRICES DE ESPECTROMETRIA (MAT2PCA) SIN ALINEAR

' CON VALORES RELATIVOS DE INTENSIDAD

'----------------------------------------------------------------------

' El codigo que hay en este procedimiento se ejecutará cuando el

' usuario pulse el boton para crear las matrices "sin alinear" con

' valores relativos de intensidad. Estas matrices contendrán la

' información relacionada con la espectrometría de las sustancias

' seleccionadas. En este procedimiento se creará la matriz de

' intensidades relativas que incluirá todos los espectros de los

' intervalos de tiempo seleccionados.

' Las intensidades relativas se calculan en función del valor de la

Anexo B : Listado del programa

173

' intensidad del pico base. El pico base es el pico que presenta la

' intensidad mayor para un espectro de masas. A este pico se le da el

' valor de 100 y todos los demás picos del espectro tendrán un valor

' relativo a 100 y lógicamente inferior.

' También se creará una matriz de variables que contendrá el nombre

' de la variable a la que corresponde el valor de intensidad.

' En este nombre de variable se indica el scan y la masa a la que

' corresponden.

' Finalmente se crea una matriz o array con los nombres de las

' sustancias (objetos), de las cuales se incluyen los TICs. La

' información proporcionada por los tres arrays o matrices se utilizará

' posteriormente en tratamientos matematicos como PCA's.

'

' Estas 3 matrices se relacionan de la siguiente manera:

'

' s10m40 s10m41 s10m42 ... s11m40 s11m41 s11m42 ...

' sustancia1 int_rel int_rel int_rel ...int_rel int_rel int_rel ...

' sustancia2 int_rel int_rel int_rel ...int_rel int_rel int_rel ...

' sustancia3 int_rel int_rel int_rel ...int_rel int_rel int_rel ...

' sustancia4 int_rel int_rel int_rel ...int_rel int_rel int_rel ...

' ...

'

Dim m As Integer

Dim n As Integer

Dim i As Integer

Dim j As Integer

Dim k As Integer

Dim s As Integer

Dim t As Integer

Dim masa1 As Long

Dim masa2 As Integer

Dim path As String

Dim ReadOnly As Integer

Dim scan_ini As Integer 'valor minimo de los intervalos de scans

Dim scan_fin As Integer 'valor maximo de los intervalos de scans

Dim masa_ini As Integer 'valor minimo de los intervalos de scans

Dim masa_fin As Integer 'valor maximo de los intervalos de scans

Dim intensidad As Long

Dim NombreVariable As String

'(de momento no se usa)Dim NoIntervaloNumerico As Boolean

Anexo B : Listado del programa

174

Dim NoIntervaloMinimo As Boolean

Dim IntervaloDesordenado As Boolean

Dim DatoEnIntervalos As Boolean

Dim Mtrz_scan_ini(8) As Variant

Dim Mtrz_scan_fin(8) As Variant

Dim Mtrz_masa_ini(8) As Variant

Dim Mtrz_masa_fin(8) As Variant

Dim nombre_objeto As String

Dim nombre_objeto_ajustado As String

'Las matrices, para pasarlas a Matlab deben ser tipo Double

'Por eso lo que se hará es pasar las matrices de los nombres

'de las variables y objetos en código ASCII y posteriormente

'en el Matlab se transformaran a caracteres mediante la funcion

'char()

Dim MTRZ_ESP_INT_REL_Real() As Double

Dim MTRZ_ESP_INT_REL_Imag() As Double

Dim MTRZ_ESP_VAR_Real() As Double

Dim MTRZ_ESP_VAR_Imag() As Double

Dim MTRZ_ESP_OBJ_Real() As Double

Dim MTRZ_ESP_OBJ_Imag() As Double

Dim NumVariables As Long

Dim indice_columna As Long

Dim longitud As Integer

Dim long_objeto As Integer

Dim Intervalo As Long

Dim RT As Long

Dim IntensidadRelativa As Currency

Dim Int_BasePeak As Long

ReadOnly = 1

For m = 0 To 8

Mtrz_scan_ini(m) = Txt_scan_ini(m).Text

Mtrz_scan_fin(m) = Txt_scan_fin(m).Text

Mtrz_masa_ini(m) = Txt_mas_ini(m).Text

Mtrz_masa_fin(m) = Txt_mas_fin(m).Text

Next m

'NoIntervaloNumerico = False

NoIntervaloMinimo = False

IntervaloDesordenado = False

'NoIntervaloNumerico = No_Intervalo_Numerico_esp(Mtrz_scan_ini(), Mtrz_scan_fin(), Mtrz_masa_ini(), Matriz_masa_fin())

Anexo B : Listado del programa

175

NoIntervaloMinimo = No_Intervalo_Minimo_esp(Mtrz_scan_ini(0), Mtrz_scan_fin(0), Mtrz_masa_ini(0), Mtrz_masa_fin(0))

IntervaloDesordenado = Intervalo_Desordenado_esp(Mtrz_scan_ini(), Mtrz_scan_fin(), Mtrz_masa_ini(), Mtrz_masa_fin())

MousePointer = 11 ' poner el puntero en espera

If List_nombres_qgds.ListCount = 0 Then

MsgBox "No hay ficheros de datos en la lista", vbOKOnly, "Atencion"

MousePointer = 0 'puntero predeterminado

'ElseIf NoIntervaloNumerico Then

' MsgBox "Debe introducir valores numericos en los límites de intervalo", vbOKOnly, "Atencion"

ElseIf NoIntervaloMinimo Then

MsgBox "Debe introducir como mínimo un intervalo de scans", vbOKOnly, "Atencion"

MousePointer = 0 'puntero predeterminado

ElseIf IntervaloDesordenado Then

MsgBox "El valor inicial debe ser menor que el valor final", vbOKOnly, "Atencion"

MousePointer = 0 'puntero predeterminado

Else

scan_ini = Minimo(Mtrz_scan_ini())

scan_fin = Maximo(Mtrz_scan_fin())

masa_ini = Minimo(Mtrz_masa_ini())

masa_fin = Maximo(Mtrz_masa_fin())

NumVariables = Numero_variables(Mtrz_scan_ini(), Mtrz_scan_fin(), Mtrz_masa_ini(), Mtrz_masa_fin())

ReDim MTRZ_ESP_INT_REL_Real(1 To List_nombres_qgds.ListCount, 1 To NumVariables)

'matriz que va a contener los nombres de las variables en numeros

'ASCII se reservan 9 caracteres para el nombre de la variable,

'ej: "s1234m135"

ReDim MTRZ_ESP_VAR_Real(1 To NumVariables, 1 To 9)

'matriz que va a contener los nombres de los objetos en numeros

'ASCII se reservan 20 caracteres para el nombre del objeto o

'fichero de datos GCMSsolution

ReDim MTRZ_ESP_OBJ_Real(1 To List_nombres_qgds.ListCount, 1 To 20)

For n = 0 To List_nombres_qgds.ListCount - 1

path = Form_Inicio.Txt_carpeta_trabajo & "\" & List_nombres_qgds.List(n)

'Crear el objeto

Call CrearObjeto

'cargar al objeto datos y el objeto msrawdata

Anexo B : Listado del programa

176

Call CargarDatos(path, ReadOnly)

'cargar el ObjetoMS3DData con "CargarMS3DData"

Call CargarMS3DData

Proj_ScanCount = ScanCount

Intervalo = ObjetoMS3DData.Interval

indice_columna = 1

If scan_ini < 1 Then scan_ini = 1

If scan_fin > Proj_ScanCount Then scan_fin = ScanCount

For i = scan_ini To scan_fin

Proj_SpectrumCount = SpectrumCount(i)

For j = masa_ini To masa_fin

intensidad = 0

For k = 1 To Proj_SpectrumCount

masa1 = DataMasa(i, k)

masa2 = Int(masa1 / 20 + 0.5)

If masa2 = j Then

intensidad = intensidad + DataIntensidad(i, k)

End If

If masa2 > j Then Exit For

Next k

DatoEnIntervalos = Dato_en_intervalos_esp(i, j, Mtrz_scan_ini(), Mtrz_scan_fin(), Mtrz_masa_ini(), Mtrz_masa_fin())

If DatoEnIntervalos Then

RT = Intervalo * i

Call CargarMSSpectrum(RT, 0)

Int_BasePeak = ObjetoMSSpectrum.BasePeakIntensity

Call LiberarMSSpectrum

IntensidadRelativa = CCur(intensidad * 100 / Int_BasePeak)

MTRZ_ESP_INT_REL_Real(n + 1, indice_columna) = Round(IntensidadRelativa, 2)

'En las siguientes lineas se asigna valores ASCII

'del nombre de la variable.

'Se realizará sólo una vez para n=0 ya que será

'igual para todos los objetos

If n = 0 Then

NombreVariable = esp_nombre_variable(i, j)

For s = 1 To Len(NombreVariable)

longitud = Len(NombreVariable)

MTRZ_ESP_VAR_Real(indice_columna, s) = Asc(NombreVariable)

Anexo B : Listado del programa

177

NombreVariable = Right(NombreVariable, longitud - 1)

Next s

End If

indice_columna = indice_columna + 1

End If

Next j

Next i

'Se pilla el nombre del fichero sin la extension para

'hacer el fichero de texto de objetos

nombre_objeto = Capturar_nombre(path)

nombre_objeto_ajustado = Ajustar_nombre_objeto(nombre_objeto)

'Con el siguiente bucle For rellenamos la matriz con los nombres de los

'objetos pero en formato ASCII

For t = 1 To Len(nombre_objeto_ajustado)

long_objeto = Len(nombre_objeto_ajustado)

MTRZ_ESP_OBJ_Real(n + 1, t) = Asc(nombre_objeto_ajustado)

nombre_objeto_ajustado = Right(nombre_objeto_ajustado, long_objeto - 1)

Next t

Next n

MousePointer = 0 ' puntero predeterminado

Call Liberar_objetos

' se crea un objeto COM para comunicarse con Matlab

Call CrearMatlab

Call Matlab.PutFullMatrix("MAT2PCA_REL_SIN_ALINEAR", "base", MTRZ_ESP_INT_REL_Real, MTRZ_ESP_INT_REL_Imag)

Call Matlab.PutFullMatrix("VARIABLES_SIN_ALINEAR", "base", MTRZ_ESP_VAR_Real, MTRZ_ESP_VAR_Imag)

Call Matlab.PutFullMatrix("OBJETOS_ESP", "base", MTRZ_ESP_OBJ_Real, MTRZ_ESP_OBJ_Imag)

Result = Matlab.Execute("VARIABLES_SIN_ALINEAR = char(VARIABLES_SIN_ALINEAR);")

Txt_Matlab.Text = Result

Result = Matlab.Execute("OBJETOS_ESP = char(OBJETOS_ESP);")

Txt_Matlab.Text = Result

Result = Matlab.Execute("[MAT2PCA_REL_SIN_ALINEAR_SINCEROS,VARIABLES_SIN_ALINEAR_SINCEROS]= quitaceros(MAT2PCA_REL_SIN_ALINEAR,VARIABLES_SIN_ALINEAR);")

Txt_Matlab.Text = Result

Anexo B : Listado del programa

178

MsgBox "Matrices de espectrometría intensidades,variables y objetos creadas", vbOKOnly, "Matrices creadas"

End If

End Sub

'El siguiente procedimiento se ejecuta cuando se pulsa el botón para

'guardar el workspace. Se llama al cuadro de dialogo estándar de

'windows "Guardar como...". Y el usuario tendrá que introducir el

'nombre con el que desea guardar el workspace.

Private Sub Cmd_guardar_workspace_Click()

Dim NombreWorkspace As String

'CancelError es True.

CommonDialog1.CancelError = True

On Error GoTo ErrHandler

'Establece los filtros.

Form_texto.CommonDialog1.Filter = "All Files (*.*)|*.*|Mat_Files (*.mat)|*.mat"

' Especifique el filtro predeterminado.

Form_texto.CommonDialog1.FilterIndex = 2

' Presenta el cuadro de diálogo Abrir.

Form_texto.CommonDialog1.ShowSave

' Se obtiene el nombre seleccionado.

NombreWorkspace = Form_texto.CommonDialog1.FileName

Result = Matlab.Execute("save " & "'" & NombreWorkspace & "'")

Txt_Matlab.Text = Result

Exit Sub

ErrHandler:

'El usuario hizo clic en el botón Cancelar.

Exit Sub

End Sub

'Con este procedimiento se arranca la herramienta pcagui del matlab

'cuando se pulsa el botón para ese cometido.

Private Sub Cmd_iniciar_PCAGUI_Click()

Call CrearMatlab

Result = Matlab.Execute("PCAGUI")

End Sub

Anexo B : Listado del programa

179

Private Sub Cmd_inicio_Click()

Form_Inicio.Show

Hide

End Sub

Private Sub Cmd_list_Click()

Dim n As Integer

List_nombres_qgds.Clear

For n = 0 To NumQGDs - 1

List_nombres_qgds.AddItem NombresFicheros(n)

Next

Lbl_num_qgds.Caption = "Número de ficheros *.qgd en la lista: " & List_nombres_qgds.ListCount

End Sub

'En este procedimiento se ejecuta la orden plot en el workspace

'temporal de Matlab con el objetivo de dibujar las curvas

'correspondientes a la cromatografía de las sustancias

'analizadas. (Con los datos alineados)

Private Sub Cmd_plot_mtrz_alineadas_Click()

Call CrearMatlab

Result = Matlab.Execute("figure")

Result = Matlab.Execute("plot(" & scan_menor & ":" & scan_mayor & ",CROMATOGRAFIA_ALINEADA)")

Result = Matlab.Execute("TITLE('TICs alineados')")

Result = Matlab.Execute("LEGEND(OBJETOS_CR_ALIN,-1)")

End Sub

'En este procedimiento se ejecuta la orden plot en el workspace

'temporal de Matlab con el objetivo de dibujar las curvas

'correspondientes a la cromatografía de las sustancias

'analizadas. (Con los datos sin alinear)

Private Sub Cmd_plot_mtrz_sinalinear_Click()

Call CrearMatlab

Result = Matlab.Execute("figure")

Result = Matlab.Execute("plot(" & scan_menor & ":" & scan_mayor & ",CROMATOGRAFIA)")

Txt_Matlab.Text = Result

Anexo B : Listado del programa

180

Result = Matlab.Execute("TITLE('TICs sin alinear')")

Result = Matlab.Execute("LEGEND(OBJETOS_CR,-1)")

End Sub

'Con este procedimiento se captura el path completo

'de la sustancia seleccionada como referencia para

'realizar el alineamiento de los datos.

Private Sub List_nombres_qgds_DblClick()

If Opt_cromatografia = True Then

Txt_muestra_ref_cr.Text = List_nombres_qgds.Text

ElseIf Opt_espectrometria = True Then

Txt_muestra_ref_esp.Text = List_nombres_qgds.Text

End If

MuestraReferencia = List_nombres_qgds.ListIndex + 1

End Sub

' Comando de opción de cromatografía. Cuando se selecciona

' se vuelven visibles los comandos relacionados con la

' cromatografía

'

Private Sub Opt_cromatografia_Click()

Dim n As Integer

For n = 0 To 8

Txt_mas_ini(n).Visible = False

Txt_mas_fin(n).Visible = False

Next n

Cmd_esp_mtrz_sinalinear.Visible = False

Cmd_esp_mtrz_alineadas.Visible = False

Frm_Espectrometria.Visible = False

Lbl_masa_ini.Visible = False

Lbl_masa_fin.Visible = False

Frm_Cromatografia.Visible = True

End Sub

' Comando de opción de espectrometría. Cuando se selecciona

' se vuelven visibles los comandos relacionados con la

' espectrometría.

'

Private Sub Opt_espectrometria_Click()

Anexo B : Listado del programa

181

Dim n As Integer

For n = 0 To 8

Txt_mas_ini(n).Visible = True

Txt_mas_fin(n).Visible = True

Next n

Cmd_esp_mtrz_sinalinear.Visible = True

Cmd_esp_mtrz_alineadas.Visible = True

Frm_Espectrometria.Visible = True

Lbl_masa_ini.Visible = True

Lbl_masa_fin.Visible = True

Frm_Cromatografia.Visible = False

End Sub

Anexo B : Listado del programa

182

B.1.4. Formulario Form_texto.

'####################################################################

'###### ######

'###### CODIGO RELATIVO AL FORMULARIO DE FICHEROS DE TEXTO ######

'###### ######

'####################################################################

Option Explicit

' En el siguiente procedimiento se llama al cuadro de dialogo

' estándar de windows "Guardar como..." para escribir el nombre del

' fichero de texto donde se guardarán los objetos para

' los datos de cromatografía.

Private Sub Cmd_cr_objetos_Click()

Txt_cr_objetos.Text = GuardarNombreFichero

End Sub

Private Sub Cmd_Cromatografia_Click()

'-----------------------------------------------------------------------

' El código que hay en este procedimiento se ejecutará cuando el usuario

' pulse el botón de crear los ficheros de texto con los datos de cro-

' matografía. El usuario debe haber introducido previamente los nombres

' de los ficheros de texto que se van a crear:

' 1. Fichero de texto de TICs, o lo que es lo mismo la cromatografía.

' 2. Fichero de texto con el nombre de la variable (scan) a la

' que corresponde el valor de TIC que serán de la forma: s1,s2,...

' 3. Finalmente se crea un fichero de texto con los nombres de las

' sustancias (objetos), de las cuales se incluyen los TICs.

'

' La información proporcionada por los tres arrays o matrices se utili-

' zará posteriormente en tratamientos matematicos como PCA's.

' Estas 3 matrices se relacionan de la siguiente manera:

'

' s1 s2 s3 s4 s5 s6 s7...

' sustancia1 TIC1(1) TIC1(2) TIC1(3) ...

' sustancia2 TIC2(1) TIC2(2) TIC2(3) ...

' sustancia3 TIC3(1) TIC3(2) TIC3(3) ...

' sustancia4 TIC4(1) TIC4(2) TIC4(3) ...

' sustancia5 TIC5(1) TIC5(2) TIC5(3) ...

Anexo B : Listado del programa

183

' ...

'-----------------------------------------------------------------------

Dim m As Integer

Dim n As Integer

Dim i As Integer

Dim path As String

Dim ReadOnly As Integer

Dim scan_ini As Integer 'valor minimo de los intervalos de scans

Dim scan_fin As Integer 'valor maximo de los intervalos de scans

Dim count_number As Long

Dim intensidad_TIC As Long

Dim Obj_TICs As Object

Dim Obj_txt_TICs As Object

Dim Obj_txt_cr_scans As Object

Dim Obj_txt_cr_objetos As Object

Dim NoIntervaloNumerico As Boolean

Dim NoIntervaloMinimo As Boolean

Dim IntervaloDesordenado As Boolean

Dim DatoEnIntervalos As Boolean

Dim Mtrz_scan_ini(8) As Integer

Dim Mtrz_scan_fin(8) As Integer

Dim nombre_objeto As String

Dim nombre_objeto_ajustado As String

Dim NombreVariable As String

ReadOnly = 1

For m = 0 To 8

If IsNumeric(Txt_scan_ini(m).Text) Then

Mtrz_scan_ini(m) = Txt_scan_ini(m).Text

Mtrz_scan_fin(m) = Txt_scan_fin(m).Text

Else

Mtrz_scan_ini(m) = 0

Mtrz_scan_fin(m) = 0

End If

Next m

NoIntervaloNumerico = False

NoIntervaloMinimo = False

IntervaloDesordenado = False

NoIntervaloNumerico = No_Intervalo_Numerico(Mtrz_scan_ini(), Mtrz_scan_fin())

Anexo B : Listado del programa

184

NoIntervaloMinimo = No_Intervalo_Minimo(Mtrz_scan_ini(0), Mtrz_scan_fin(0))

IntervaloDesordenado = Intervalo_Desordenado(Mtrz_scan_ini(), Mtrz_scan_fin())

Set Obj_TICs = CreateObject("Scripting.FileSystemObject")

Set Obj_txt_TICs = Obj_TICs.CreateTextFile(Txt_TICs.Text, True)

Set Obj_txt_cr_scans = Obj_TICs.CreateTextFile(Txt_cr_scans.Text, True)

Set Obj_txt_cr_objetos = Obj_TICs.CreateTextFile(Txt_cr_objetos.Text, True)

MousePointer = 11 ' poner el puntero en espera

If List_nombres_qgds.ListCount = 0 Then

MsgBox "No hay ficheros de datos en la lista", vbOKOnly, "Atencion"

ElseIf NoIntervaloNumerico Then

MsgBox "Debe introducir valores numericos en los límites de intervalo", vbOKOnly, "Atencion"

ElseIf NoIntervaloMinimo Then

MsgBox "Debe introducir como mínimo un intervalo de scans", vbOKOnly, "Atencion"

ElseIf IntervaloDesordenado Then

MsgBox "El valor inicial debe ser menor que el valor final", vbOKOnly, "Atencion"

Else

For n = 0 To List_nombres_qgds.ListCount - 1

path = Form_Inicio.Txt_carpeta_trabajo & "\" & List_nombres_qgds.List(n)

'Crear el objeto

Call CrearObjeto

'cargar al objeto datos y el objeto msrawdata

Call CargarDatos(path, ReadOnly)

'cargar el ObjetoMSChromatogram

Call CargarTIC

scan_ini = Minimo(Mtrz_scan_ini())

scan_fin = Maximo(Mtrz_scan_fin())

count_number = Count

If scan_ini < 1 Then scan_ini = 1

If scan_fin > count_number Then scan_fin = Count

'Txt_cr_objetos.Text = "prueba"

For i = scan_ini To scan_fin

intensidad_TIC = Dato_intensidad_TIC(i)

DatoEnIntervalos = Dato_en_intervalos(i, Mtrz_scan_ini(), Mtrz_scan_fin())

If DatoEnIntervalos Then

Anexo B : Listado del programa

185

If i = scan_fin Then

Obj_txt_TICs.writeline (intensidad_TIC)

'Escribimos el scan de la intensidad en variables

Else

Obj_txt_TICs.write (intensidad_TIC & " ")

End If

If n = 0 Then

NombreVariable = cr_nombre_variable(i)

Obj_txt_cr_scans.writeline (NombreVariable)

End If

End If

Next i

'Se pilla el nombre del fichero sin la extension para

'hacer el fichero de texto de objetos

nombre_objeto = Capturar_nombre(path)

nombre_objeto_ajustado = Ajustar_nombre_objeto(nombre_objeto)

Obj_txt_cr_objetos.writeline (nombre_objeto_ajustado)

Next n

MousePointer = 0 ' puntero predeterminado

MsgBox "Ficheros de datos creados", vbOKOnly, "Ficheros creados"

Obj_txt_TICs.Close

Obj_txt_cr_scans.Close

Obj_txt_cr_objetos.Close

Call Liberar_objetos_textos

'Liberar objetos de texto

If Not Obj_txt_TICs Is Nothing Then Set Obj_txt_TICs = Nothing

If Not Obj_txt_cr_scans Is Nothing Then Set Obj_txt_cr_scans = Nothing

If Not Obj_txt_cr_objetos Is Nothing Then Set Obj_txt_cr_objetos = Nothing

If Not Obj_TICs Is Nothing Then Set Obj_TICs = Nothing

End If

End Sub

'----------------------------------------------------------------------

' El siguiente procedimiento se ejecuta cuando se pulsa el botón para

' eliminar algun archivo del cuadro de lista del formulario. Para eli-

' minar un archivo de la lista se llama al método RemoveItem del con-

' trol cuadro de lista.

'----------------------------------------------------------------------

Anexo B : Listado del programa

186

Private Sub Cmd_elm_qgd_Click()

If List_nombres_qgds.Text = "" Then

MsgBox "Debes seleccionar un fichero de la lista", vbOKOnly, "Atencion"

Else

List_nombres_qgds.RemoveItem List_nombres_qgds.ListIndex

Lbl_num_qgds.Caption = "Número de ficheros *.qgd en la lista: " & List_nombres_qgds.ListCount

End If

End Sub

'----------------------------------------------------------------------

' En el siguiente procedimiento se llama al cuadro de dialogo

' estándar de windows "Guardar como..." para escribir el nombre del

' fichero de texto donde se guardarán las intensidades de espectro-

' metría.

'----------------------------------------------------------------------

Private Sub Cmd_esp_intensidades_Click()

Txt_esp_intensidades.Text = GuardarNombreFichero

End Sub

'----------------------------------------------------------------------

' En el siguiente procedimiento se llama al cuadro de dialogo

' estándar de windows "Guardar como..." para escribir el nombre del

' fichero de texto donde se guardarán los nombres de los objetos

' a los cuales pertenecen los datos de espectrometría.

'----------------------------------------------------------------------

Private Sub Cmd_esp_objetos_Click()

Txt_esp_objetos.Text = GuardarNombreFichero

End Sub

'----------------------------------------------------------------------

' En el siguiente procedimiento se llama al cuadro de dialogo

' estándar de windows "Guardar como..." para escribir el nombre del

' fichero de texto donde se guardarán los nombres de las variables

' a los cuales pertenecen los datos de espectrometría.

'----------------------------------------------------------------------

Private Sub Cmd_esp_variables_Click()

Anexo B : Listado del programa

187

Txt_esp_variables.Text = GuardarNombreFichero

End Sub

Private Sub Cmd_Espectrometria_Click()

'-----------------------------------------------------------------------

' El código que hay en este procedimiento se ejecutará cuando el usuario

' pulse el botón de crear los ficheros de texto con los datos de espec-

' trometría. El usuario debe haber introducido previamente los nombres

' de los ficheros de texto que se van a crear:

' 1. Fichero de texto de intensidades absolutas, o lo que es lo mismo

' la espectrometría para cada instante de análisis (scan).

' 2. Fichero de texto con el nombre de la variable (scan+masa) a la

' que corresponde el valor de intensidad que serán de la forma:

' s1m45,s1m46,...,s2m45,s2m46

' 3. Finalmente se crea un fichero de texto con los nombres de las

' sustancias (objetos), de las cuales se incluyen los datos de

' espectrometría.

'

' La información proporcionada por los tres ficheros se utilizará

' posteriormente en tratamientos matemáticos como PCA's.

' Estas 3 matrices se relacionan de la siguiente manera:

'

'

' s10m40 s10m41 s10m42 ... s11m40 s11m41 s11m42...

' sustancia1 inten. inten. inten. ... inten. inten. inten....

' sustancia2 inten. inten. inten. ... inten. inten. inten....

' sustancia3 inten. inten. inten. ... inten. inten. inten....

' sustancia4 inten. inten. inten. ... inten. inten. inten....

' ...

'-----------------------------------------------------------------------

Dim m As Integer

Dim n As Integer

Dim i As Integer

Dim j As Integer

Dim k As Integer

Dim masa1 As Long

Dim masa2 As Integer

Dim path As String

Dim ReadOnly As Integer

Anexo B : Listado del programa

188

Dim scan_ini As Integer 'valor minimo de los intervalos de scans

Dim scan_fin As Integer 'valor maximo de los intervalos de scans

Dim masa_ini As Integer 'valor minimo de los intervalos de scans

Dim masa_fin As Integer 'valor maximo de los intervalos de scans

Dim intensidad As Long

Dim Obj_ESP As Object

Dim Obj_txt_esp_int As Object

Dim Obj_txt_esp_variables As Object

Dim Obj_txt_esp_objetos As Object

Dim NombreVariable As String

'(de momento no se usa)Dim NoIntervaloNumerico As Boolean

Dim NoIntervaloMinimo As Boolean

Dim IntervaloDesordenado As Boolean

Dim DatoEnIntervalos As Boolean

Dim Mtrz_scan_ini(8) As Integer

Dim Mtrz_scan_fin(8) As Integer

Dim Mtrz_masa_ini(8) As Integer

Dim Mtrz_masa_fin(8) As Integer

Dim nombre_objeto As String

Dim nombre_objeto_ajustado As String

ReadOnly = 1

For m = 0 To 8

If IsNumeric(Txt_scan_ini(m).Text) Then

Mtrz_scan_ini(m) = Txt_scan_ini(m).Text

Mtrz_scan_fin(m) = Txt_scan_fin(m).Text

Mtrz_masa_ini(m) = Txt_mas_ini(m).Text

Mtrz_masa_fin(m) = Txt_mas_fin(m).Text

Else

Mtrz_scan_ini(m) = 0

Mtrz_scan_fin(m) = 0

Mtrz_masa_ini(m) = 0

Mtrz_masa_fin(m) = 0

End If

Next m

'NoIntervaloNumerico = False

NoIntervaloMinimo = False

IntervaloDesordenado = False

'NoIntervaloNumerico = No_Intervalo_Numerico_esp(Mtrz_scan_ini(), Mtrz_scan_fin(), Mtrz_masa_ini(), Matriz_masa_fin())

NoIntervaloMinimo = No_Intervalo_Minimo_esp(Mtrz_scan_ini(0), Mtrz_scan_fin(0), Mtrz_masa_ini(0), Mtrz_masa_fin(0))

Anexo B : Listado del programa

189

IntervaloDesordenado = Intervalo_Desordenado_esp(Mtrz_scan_ini(), Mtrz_scan_fin(), Mtrz_masa_ini(), Mtrz_masa_fin())

Set Obj_ESP = CreateObject("Scripting.FileSystemObject")

Set Obj_txt_esp_int = Obj_ESP.CreateTextFile(Txt_esp_intensidades.Text, True)

Set Obj_txt_esp_variables = Obj_ESP.CreateTextFile(Txt_esp_variables.Text, True)

Set Obj_txt_esp_objetos = Obj_ESP.CreateTextFile(Txt_esp_objetos.Text, True)

MousePointer = 11 ' poner el puntero en espera

If List_nombres_qgds.ListCount = 0 Then

MsgBox "No hay ficheros de datos en la lista", vbOKOnly, "Atencion"

'ElseIf NoIntervaloNumerico Then

' MsgBox "Debe introducir valores numericos en los límites de intervalo", vbOKOnly, "Atencion"

ElseIf NoIntervaloMinimo Then

MsgBox "Debe introducir como mínimo un intervalo de scans", vbOKOnly, "Atencion"

ElseIf IntervaloDesordenado Then

MsgBox "El valor inicial debe ser menor que el valor final", vbOKOnly, "Atencion"

Else

For n = 0 To List_nombres_qgds.ListCount - 1

path = Form_Inicio.Txt_carpeta_trabajo & "\" & List_nombres_qgds.List(n)

'Crear el objeto

Call CrearObjeto

'cargar al objeto datos y el objeto msrawdata

Call CargarDatos(path, ReadOnly)

'cargar el ObjetoMS3DData con "CargarMS3DData"

Call CargarMS3DData

scan_ini = Minimo(Mtrz_scan_ini())

scan_fin = Maximo(Mtrz_scan_fin())

masa_ini = Minimo(Mtrz_masa_ini())

masa_fin = Maximo(Mtrz_masa_fin())

Proj_ScanCount = ScanCount

If scan_ini < 1 Then scan_ini = 1

If scan_fin > Proj_ScanCount Then scan_fin = ScanCount

For i = scan_ini To scan_fin

Proj_SpectrumCount = SpectrumCount(i)

For j = masa_ini To masa_fin

Anexo B : Listado del programa

190

intensidad = 0

For k = 1 To Proj_SpectrumCount

masa1 = DataMasa(i, k)

masa2 = Int(masa1 / 20 + 0.5)

If masa2 = j Then

intensidad = intensidad + DataIntensidad(i, k)

End If

If masa2 > j Then Exit For

Next k

DatoEnIntervalos = Dato_en_intervalos_esp(i, j, Mtrz_scan_ini(), Mtrz_scan_fin(), Mtrz_masa_ini(), Mtrz_masa_fin())

If DatoEnIntervalos Then

If j = masa_fin And i = scan_fin Then

Obj_txt_esp_int.writeline (intensidad)

'Escribimos el scan de la intensidad en variables

Else

Obj_txt_esp_int.write (intensidad & " ")

End If

If n = 0 Then

NombreVariable = esp_nombre_variable(i, j)

Obj_txt_esp_variables.writeline (NombreVariable)

End If

End If

Next j

Next i

'Se pilla el nombre del fichero sin la extension para

'hacer el fichero de texto de objetos

nombre_objeto = Capturar_nombre(path)

nombre_objeto_ajustado = Ajustar_nombre_objeto(nombre_objeto)

Obj_txt_esp_objetos.writeline (nombre_objeto_ajustado)

Next n

MousePointer = 0 ' puntero predeterminado

MsgBox "Ficheros de datos creados", vbOKOnly, "Ficheros creados"

Obj_txt_esp_int.Close

Obj_txt_esp_variables.Close

Obj_txt_esp_objetos.Close

Call Liberar_objetos

'Liberar objetos de texto

If Not Obj_txt_esp_int Is Nothing Then Set Obj_txt_esp_int = Nothing

Anexo B : Listado del programa

191

If Not Obj_txt_esp_variables Is Nothing Then Set Obj_txt_esp_variables = Nothing

If Not Obj_txt_esp_objetos Is Nothing Then Set Obj_txt_esp_objetos = Nothing

If Not Obj_ESP Is Nothing Then Set Obj_ESP = Nothing

End If

End Sub

Private Sub Cmd_Espectrometría_rel_Click()

'-----------------------------------------------------------------------

' El código que hay en este procedimiento se ejecutará cuando el usuario

' pulse el botón de crear los ficheros de texto con los datos de espec-

' trometría. El usuario debe haber introducido previamente los nombres

' de los ficheros de texto que se van a crear:

' 1. Fichero de texto de intensidades relativas, o lo que es lo mismo

' la espectrometría para cada instante de análisis (scan).

' 2. Fichero de texto con el nombre de la variable (scan+masa) a la

' que corresponde el valor de intensidad que serán de la forma:

' s1m45,s1m46,...,s2m45,s2m46

' 3. Finalmente se crea un fichero de texto con los nombres de las

' sustancias (objetos), de las cuales se incluyen los datos de

' espectrometría.

'

' La información proporcionada por los tres ficheros se utilizará

' posteriormente en tratamientos matemáticos como PCA's.

' Estas 3 matrices se relacionan de la siguiente manera:

'

'

' s10m40 s10m41 s10m42 ... s11m40 s11m41 s11m42...

' sustancia1 inten. inten. inten. ... inten. inten. inten....

' sustancia2 inten. inten. inten. ... inten. inten. inten....

' sustancia3 inten. inten. inten. ... inten. inten. inten....

' sustancia4 inten. inten. inten. ... inten. inten. inten....

' ...

'-----------------------------------------------------------------------

Dim m As Integer

Dim n As Integer

Dim i As Integer

Dim j As Integer

Dim k As Integer

Dim masa1 As Long

Anexo B : Listado del programa

192

Dim masa2 As Integer

Dim path As String

Dim ReadOnly As Integer

Dim scan_ini As Integer 'valor minimo de los intervalos de scans

Dim scan_fin As Integer 'valor maximo de los intervalos de scans

Dim masa_ini As Integer 'valor minimo de los intervalos de scans

Dim masa_fin As Integer 'valor maximo de los intervalos de scans

Dim intensidad As Long

Dim Obj_ESP As Object

Dim Obj_txt_esp_int As Object

Dim Obj_txt_esp_variables As Object

Dim Obj_txt_esp_objetos As Object

Dim NombreVariable As String

'(de momento no se usa)Dim NoIntervaloNumerico As Boolean

Dim NoIntervaloMinimo As Boolean

Dim IntervaloDesordenado As Boolean

Dim DatoEnIntervalos As Boolean

Dim Mtrz_scan_ini(8) As Variant

Dim Mtrz_scan_fin(8) As Variant

Dim Mtrz_masa_ini(8) As Variant

Dim Mtrz_masa_fin(8) As Variant

Dim nombre_objeto As String

Dim nombre_objeto_ajustado As String

Dim Intervalo As Long

Dim RT As Long

Dim IntensidadRelativa As Currency

Dim Int_BasePeak As Long

ReadOnly = 1

For m = 0 To 8

Mtrz_scan_ini(m) = Txt_scan_ini(m).Text

Mtrz_scan_fin(m) = Txt_scan_fin(m).Text

Mtrz_masa_ini(m) = Txt_mas_ini(m).Text

Mtrz_masa_fin(m) = Txt_mas_fin(m).Text

Next m

'NoIntervaloNumerico = False

NoIntervaloMinimo = False

IntervaloDesordenado = False

'NoIntervaloNumerico = No_Intervalo_Numerico_esp(Mtrz_scan_ini(), Mtrz_scan_fin(), Mtrz_masa_ini(), Matriz_masa_fin())

NoIntervaloMinimo = No_Intervalo_Minimo_esp(Mtrz_scan_ini(0), Mtrz_scan_fin(0), Mtrz_masa_ini(0), Mtrz_masa_fin(0))

Anexo B : Listado del programa

193

IntervaloDesordenado = Intervalo_Desordenado_esp(Mtrz_scan_ini(), Mtrz_scan_fin(), Mtrz_masa_ini(), Mtrz_masa_fin())

Set Obj_ESP = CreateObject("Scripting.FileSystemObject")

Set Obj_txt_esp_int = Obj_ESP.CreateTextFile(Txt_esp_intensidades.Text, True)

Set Obj_txt_esp_variables = Obj_ESP.CreateTextFile(Txt_esp_variables.Text, True)

Set Obj_txt_esp_objetos = Obj_ESP.CreateTextFile(Txt_esp_objetos.Text, True)

MousePointer = 11 ' poner el puntero en espera

If List_nombres_qgds.ListCount = 0 Then

MsgBox "No hay ficheros de datos en la lista", vbOKOnly, "Atencion"

'ElseIf NoIntervaloNumerico Then

' MsgBox "Debe introducir valores numericos en los límites de intervalo", vbOKOnly, "Atencion"

ElseIf NoIntervaloMinimo Then

MsgBox "Debe introducir como mínimo un intervalo de scans", vbOKOnly, "Atencion"

ElseIf IntervaloDesordenado Then

MsgBox "El valor inicial debe ser menor que el valor final", vbOKOnly, "Atencion"

Else

For n = 0 To List_nombres_qgds.ListCount - 1

path = Form_Inicio.Txt_carpeta_trabajo & "\" & List_nombres_qgds.List(n)

'Crear el objeto

Call CrearObjeto

'cargar al objeto datos y el objeto msrawdata

Call CargarDatos(path, ReadOnly)

'cargar el ObjetoMS3DData con "CargarMS3DData"

Call CargarMS3DData

scan_ini = Minimo(Mtrz_scan_ini())

scan_fin = Maximo(Mtrz_scan_fin())

masa_ini = Minimo(Mtrz_masa_ini())

masa_fin = Maximo(Mtrz_masa_fin())

Proj_ScanCount = ScanCount

Intervalo = ObjetoMS3DData.Interval

If scan_ini < 1 Then scan_ini = 1

If scan_fin > Proj_ScanCount Then scan_fin = ScanCount

For i = scan_ini To scan_fin

Proj_SpectrumCount = SpectrumCount(i)

Anexo B : Listado del programa

194

For j = masa_ini To masa_fin

intensidad = 0

For k = 1 To Proj_SpectrumCount

masa1 = DataMasa(i, k)

masa2 = Int(masa1 / 20 + 0.5)

If masa2 = j Then

intensidad = intensidad + DataIntensidad(i, k)

End If

If masa2 > j Then Exit For

Next k

DatoEnIntervalos = Dato_en_intervalos_esp(i, j, Mtrz_scan_ini(), Mtrz_scan_fin(), Mtrz_masa_ini(), Mtrz_masa_fin())

If DatoEnIntervalos Then

RT = Intervalo * i

Call CargarMSSpectrum(RT, 0)

Int_BasePeak = ObjetoMSSpectrum.BasePeakIntensity

Call LiberarMSSpectrum

IntensidadRelativa = CCur(intensidad * 100 / Int_BasePeak)

If j = masa_fin And i = scan_fin Then

Obj_txt_esp_int.writeline (Round(IntensidadRelativa, 2))

'Escribimos el scan de la intensidad en variables

Else

Obj_txt_esp_int.write (Round(IntensidadRelativa, 2) & " ")

End If

If n = 0 Then

NombreVariable = esp_nombre_variable(i, j)

Obj_txt_esp_variables.writeline (NombreVariable)

End If

End If

Next j

Next i

'Se pilla el nombre del fichero sin la extension para

'hacer el fichero de texto de objetos

nombre_objeto = Capturar_nombre(path)

nombre_objeto_ajustado = Ajustar_nombre_objeto(nombre_objeto)

Obj_txt_esp_objetos.writeline (nombre_objeto_ajustado)

Next n

MousePointer = 0 ' puntero predeterminado

MsgBox "Ficheros de datos creados", vbOKOnly, "Ficheros creados"

Obj_txt_esp_int.Close

Anexo B : Listado del programa

195

Obj_txt_esp_variables.Close

Obj_txt_esp_objetos.Close

Call Liberar_objetos

'Liberar objetos de texto

If Not Obj_txt_esp_int Is Nothing Then Set Obj_txt_esp_int = Nothing

If Not Obj_txt_esp_variables Is Nothing Then Set Obj_txt_esp_variables = Nothing

If Not Obj_txt_esp_objetos Is Nothing Then Set Obj_txt_esp_objetos = Nothing

If Not Obj_ESP Is Nothing Then Set Obj_ESP = Nothing

End If

End Sub

Private Sub Cmd_inicio_Click()

Form_Inicio.Show

Hide

End Sub

'--------------------------------------------------------------------

' El siguiento procedimiento sirve para hacer visibles

' los controles relativos a la cromatografía en el caso

' de que se seleccione esta opción. Los controles rela-

' tivos a la espectrometría se ocultarán.

'--------------------------------------------------------------------

Private Sub Opt_cromatografia_Click()

Dim n As Integer

For n = 0 To 8

Txt_mas_ini(n).Visible = False

Txt_mas_fin(n).Visible = False

Next n

Cmd_Espectrometria.Visible = False

Frm_Espectrometria.Visible = False

Lbl_intensidades.Visible = False

Txt_esp_intensidades.Visible = False

Lbl_esp_variables.Visible = False

Txt_esp_variables.Visible = False

Lbl_esp_objetos.Visible = False

Txt_esp_objetos.Visible = False

Lbl_masa_ini.Visible = False

Lbl_masa_fin.Visible = False

Anexo B : Listado del programa

196

Frm_Cromatografia.Visible = True

End Sub

'---------------------------------------------------------------------

' El siguiento procedimiento sirve para hacer visibles

' los controles relativos a la espectrometría en el caso

' de que se seleccione esta opción. Los controles rela-

' tivos a la cromatografía se ocultarán.

'---------------------------------------------------------------------

Private Sub Opt_espectrometria_Click()

Dim n As Integer

For n = 0 To 8

Txt_mas_ini(n).Visible = True

Txt_mas_fin(n).Visible = True

Next n

Cmd_Espectrometria.Visible = True

Frm_Espectrometria.Visible = True

Lbl_intensidades.Visible = True

Txt_esp_intensidades.Visible = True

Lbl_esp_variables.Visible = True

Txt_esp_variables.Visible = True

Lbl_esp_objetos.Visible = True

Txt_esp_objetos.Visible = True

Lbl_masa_ini.Visible = True

Lbl_masa_fin.Visible = True

Frm_Cromatografia.Visible = False

End Sub

'--------------------------------------------------------------------

' Este procedimiento tiene lugar cuando se pulsa el botón

' de mostrar todos los ficheros de la carpeta de trabajo.

' Si se han eliminado archivos de la lista que no se quería

' eliminar se volverán a listar todos de nuevo.

'--------------------------------------------------------------------

Private Sub Cmd_list_Click()

Dim n As Integer

Anexo B : Listado del programa

197

List_nombres_qgds.Clear

For n = 0 To NumQGDs - 1

List_nombres_qgds.AddItem NombresFicheros(n)

Next

Lbl_num_qgds.Caption = "Número de ficheros *.qgd en la lista: " & List_nombres_qgds.ListCount

End Sub

'--------------------------------------------------------------------

' En el siguiente procedimiento se llama al cuadro de dialogo

' estándar de windows "Guardar como..." para escribir el nombre del

' fichero de texto donde se guardarán los datos de TIC.

'--------------------------------------------------------------------

Private Sub Cmd_TICs_Click()

Txt_TICs.Text = GuardarNombreFichero

End Sub

'--------------------------------------------------------------------

' En el siguiente procedimiento se llama al cuadro de dialogo

' estándar de windows "Guardar como..." para escribir el nombre del

' fichero de texto donde se guardarán los nombres de las variables

' a los cuales pertenecen los datos de espectrometría.

'--------------------------------------------------------------------

Private Sub Cmd_scan_Click()

Txt_cr_scans.Text = GuardarNombreFichero

End Sub

Anexo B : Listado del programa

198

B.2. Módulos.

B.2.1. Módulo BuscarCarpeta.

'####################################################################

'###### ######

'###### MODULO ESTANDAR EN EL QUE SE INCLUYE EL CODIGO ######

'###### DE UNA LLAMADA A UNA API DE WINDOWS ######

'###### ######

'####################################################################

'En este módulo se llama a una API de windows para

'que cuando el usuario pulse el botón de Examinar...

'aparezca el cuadro de dialogo de windows de seleccionar

'carpeta. De esta forma es más fácil para el usuario la

'selección de la carpeta de trabajo donde tiene los

'ficheros del GCMSsolution con los datos de la cromato-

'grafía o espectrometria realizada.

'Se programa la función BrowseForFolder que posterior-

'mente será llamada cuando el usuario pulse el botón de

'Examinar...

'####################################################################

Option Explicit

'

Const MAX_PATH = 255

Public Enum eBIF

BIF_RETURNONLYFSDIRS = &H1 'Sólo directorios del sistema

BIF_DONTGOBELOWDOMAIN = &H2 'No incluir carpetas de red

BIF_STATUSTEXT = &H4

BIF_RETURNFSANCESTORS = &H8

BIF_BROWSEFORCOMPUTER = &H1000 'Buscar PCs

BIF_BROWSEFORPRINTER = &H2000 'Buscar impresoras

End Enum

Public Type BrowseInfo

hwndOwner As Long

pIDLRoot As Long 'Especifica dónde se empezará a mostrar

Anexo B : Listado del programa

199

pszDisplayName As Long

lpszTitle As Long

ulFlags As Long

lpfnCallback As Long

lParam As Long

iImage As Long

End Type

Private Declare Function SHBrowseForFolder Lib "shell32.dll" _

(lpbi As BrowseInfo) As Long

Private Declare Sub CoTaskMemFree Lib "ole32.dll" _

(ByVal hMem As Long)

Private Declare Function lstrcat Lib "kernel32.dll" Alias "lstrcatA" _

(ByVal lpString1 As String, ByVal lpString2 As String) As Long

Private Declare Function SHGetPathFromIDList Lib "shell32.dll" _

(ByVal pidList As Long, ByVal lpBuffer As String) As Long

'Si se quiere usar en un form, cambiar el public por private

Public Function BrowseForFolder(ByVal hwndOwner As Long, ByVal sPrompt As String, Optional ByVal vFlags As eBIF) As String

Dim iNull As Integer

Dim lpIDList As Long

Dim lResult As Long

Dim sPath As String

Dim udtBI As BrowseInfo

Dim lFlags As Long

If Not IsMissing(vFlags) Then

lFlags = CInt(vFlags)

End If

With udtBI

.hwndOwner = hwndOwner

.lpszTitle = lstrcat(sPrompt, "")

.ulFlags = lFlags Or BIF_RETURNONLYFSDIRS

End With

Anexo B : Listado del programa

200

lpIDList = SHBrowseForFolder(udtBI)

If lpIDList Then

sPath = String$(MAX_PATH, 0)

lResult = SHGetPathFromIDList(lpIDList, sPath)

Call CoTaskMemFree(lpIDList)

iNull = InStr(sPath, vbNullChar)

If iNull Then

sPath = Left$(sPath, iNull - 1)

End If

Else

'Se ha pulsado en cancelar

sPath = ""

End If

BrowseForFolder = sPath

End Function

Anexo B : Listado del programa

201

B.2.2. Módulo Graficos.

'####################################################################

'###### ######

'###### MODULO ESTANDAR EN EL QUE SE INCLUYE CODIGO ######

'###### RELACIONADO CON LOS GRÁFICOS 3D ######

'###### ######

'####################################################################

Option Explicit

Public Matlab As Object

Public MatlabGrafico As Object

Public Result As String

' Este procedimiento sirve para crear el objeto de Matlab

' que servirá de interfaz de comunicación de este programa

' con Matlab. Este objeto se utilizará con las matrices.

Public Sub CrearMatlab()

If Matlab Is Nothing Then

Set Matlab = CreateObject("Matlab.Application")

End If

End Sub

' Este procedimiento sirve para crear el objeto de Matlab

' que servirá de interfaz de comunicación de este programa

' con Matlab. Este objeto se utilizará con los gráficos 3D.

Public Sub CrearMatlabGrafico()

If MatlabGrafico Is Nothing Then

Set MatlabGrafico = CreateObject("Matlab.Application")

End If

End Sub

Anexo B : Listado del programa

202

B.2.3. Módulo Module1.

'####################################################################

'###### ######

'###### MODULO ESTANDAR EN EL QUE SE INCLUYEN ######

'###### PROCEDIMIENTOS GLOBALES QUE SE UTILIZAN ######

'###### EN CUALQUIER PARTE DEL PROGRAMA ######

'###### ######

'####################################################################

Option Explicit

Option Compare Text

Public Proj_ScanCount As Long

Public Proj_SpectrumCount As Long

Public ObjetoDatos As GCMSDataFile

Public ObjetoMSRawData As MSRawData

Public ObjetoMS3DData As MS3DData

Public ObjetoMSChromatogram As MSChromatogram

Public ObjetoMSSpectrum As MSSpectrum

Public NombresFicheros() As String

Public PathFicheros() As String

Public NumQGDs As Integer

Public Type DatosTiempo

StartRT As Long

EndRT As Long

Interval As Long

End Type

'Public Function AbrirFichero() As String

' CancelError es True.

' On Error GoTo ErrHandler

' Establece los filtros.

' Form_graficos.CommonDialog1.Filter = "All Files (*.*)|*.*|Text_Files (*.txt)|*.txt|CGMS Data Files (*.qgd)|*.qgd"

' Especifique el filtro predeterminado.

' Form_graficos.CommonDialog1.FilterIndex = 3

' Presenta el cuadro de diálogo Abrir.

Anexo B : Listado del programa

203

' Form_graficos.CommonDialog1.ShowOpen

' Se obtiene el nom.

' AbrirFichero = Form1.CommonDialog1.FileName

' Exit Function

'ErrHandler:

' El usuario hizo clic en el botón Cancelar.

' Exit Function

'End Function

'Public Function GuardarFichero() As String

'CancelError es True.

' On Error GoTo ErrHandler

'Establece los filtros.

' CommonDialog1.Filter = "All Files (*.*)|*.*|Text_Files (*.txt)|*.txt|CGMS Data Files (*.qgd)|*.qgd|Matlab Files (*.m)|*.m"

' Especifique el filtro predeterminado.

'CommonDialog1.FilterIndex = 2

' Presenta el cuadro de diálogo Abrir.

'CommonDialog1.ShowSave

' Se obtiene el nombre seleccionado.

'GuardarFichero = CommonDialog1.FileName

'Exit Function

'ErrHandler:

'El usuario hizo clic en el botón Cancelar.

' Exit Function

'End Function

'----------------------------------------------------------

' Este procedimiento crea un objeto de datos del

' GCMSSolution. Es el objeto que muestra la interfaz

' de automatización del GCMSSolution.

'----------------------------------------------------------

Public Sub CrearObjeto()

If Not ObjetoDatos Is Nothing Then

Set ObjetoDatos = Nothing

End If

Anexo B : Listado del programa

204

If Not ObjetoMSRawData Is Nothing Then

Set ObjetoMSRawData = Nothing

End If

Set ObjetoDatos = CreateObject("GCMSFileObj.Data")

End Sub

'-----------------------------------------------------------

' Este procedimiento carga los datos contenidos en el

' objeto MSRawData de la interfaz de automatización.

'-----------------------------------------------------------

Public Sub CargarDatos(NombreFichero As String, IsReadOnly As Integer)

Dim hr As Long

hr = 0

If Not ObjetoDatos Is Nothing Then

Call ObjetoDatos.LoadFile(NombreFichero, IsReadOnly)

Set ObjetoMSRawData = ObjetoDatos.MSRawData

End If

End Sub

'-----------------------------------------------------------

' Este procedimiento carga los datos contenidos en el

' objeto MS3DData de la interfaz de automatización.

'-----------------------------------------------------------

Public Function CargarMS3DData() As Boolean

Dim lGroup As Long

Dim Datos_ok As Boolean

lGroup = 1

Datos_ok = True

If Not ObjetoMS3DData Is Nothing Then

Set ObjetoMS3DData = Nothing

End If

If Not ObjetoMSRawData Is Nothing Then

Set ObjetoMS3DData = ObjetoMSRawData.GetMS3DData(lGroup)

End If

CargarMS3DData = Datos_ok

End Function

Anexo B : Listado del programa

205

'-----------------------------------------------------------

' Este procedimiento ejecuta el método con el que se

' obtienen datos relativos a la cromatografía de la

' sustancia analizada.

'-----------------------------------------------------------

Public Function CargarTIC() As Boolean

Dim lGroup As Long

Dim Datos_ok As Boolean

lGroup = 1

Datos_ok = True

If Not ObjetoMSChromatogram Is Nothing Then

Set ObjetoMSChromatogram = Nothing

End If

If Not ObjetoMSRawData Is Nothing Then

Set ObjetoMSChromatogram = ObjetoMSRawData.GetTIC(lGroup)

End If

CargarTIC = Datos_ok

End Function

'----------------------------------------------------------

' Con este procedimiento se obtiene el número de scans que

' componen el análisis de la sustancia analizada.

'----------------------------------------------------------

Public Function ScanCount() As Long

ScanCount = ObjetoMS3DData.ScanCount

End Function

'----------------------------------------------------------

' Con este procedimiento se obtiene el número de cuentas que

' componen el análisis de la sustancia analizada.

'----------------------------------------------------------

Public Function Count() As Long

Count = ObjetoMSChromatogram.Count

End Function

'----------------------------------------------------------

Anexo B : Listado del programa

206

' Con este procedimiento se obtiene el valor del TIC

' para un instante de análisis determinado.

'----------------------------------------------------------

Public Function Dato_intensidad_TIC(i As Integer) As Long

Dato_intensidad_TIC = ObjetoMSChromatogram.Intensity(i)

End Function

'----------------------------------------------------------

' Con este procedimiento se obtiene el valor de impactos

' registrados por el analizador para todo el espectro de

' masas en un instante de tiempo determinado.

'----------------------------------------------------------

Public Function SpectrumCount(i As Integer) As Long

SpectrumCount = ObjetoMS3DData.SpectrumCount(i)

End Function

'----------------------------------------------------------

' Con este procedimiento se obtiene el valor de la masa

' para un instante de analisis determinado y un número

' de cuenta. El número de cuenta es el número

' que indica las masas en las cuales se registra impacto

' para todo el espectro de masas.

'----------------------------------------------------------

Public Function DataMasa(i As Integer, k As Integer) As Long

DataMasa = ObjetoMS3DData.Mz(i, k)

End Function

'----------------------------------------------------------

' Con este procedimiento se obtiene el valor de la

' intensidad para un instante de analisis determinado y un

' número de cuenta. El número de cuenta es el número

' que indica las masas en las cuales se registra impacto

' para todo el espectro de masas.

'----------------------------------------------------------

Public Function DataIntensidad(i As Integer, k As Integer) As Long

DataIntensidad = ObjetoMS3DData.Intensity(i, k)

Anexo B : Listado del programa

207

End Function

'----------------------------------------------------------

' Con este procedimiento se obtiene el valor de la masa

' para un instante de analisis determinado y un número

' de cuenta. El número de cuenta es el número

' que indica las masas en las cuales se registra impacto

' para todo el espectro de masas.

'----------------------------------------------------------

Public Function Get3DMz(ByVal lScan As Long, ByVal lIndex As Long) As Long

Dim lMz As Long

lMz = 0

If Not ObjetoMS3DData Is Nothing Then

lMz = ObjetoMS3DData.Mz(lScan, lIndex)

End If

Get3DMz = lMz

End Function

'----------------------------------------------------------

' Con este procedimiento se cargan los datos relativos

' a la espectrometría de la sustancia analizada.

'----------------------------------------------------------

Public Function CargarMSSpectrum(RT As Long, BackRT As Long) As Boolean

Dim Datos_ok As Boolean

Datos_ok = True

If Not ObjetoMSSpectrum Is Nothing Then

Set ObjetoMSSpectrum = Nothing

End If

If Not ObjetoMSRawData Is Nothing Then

Set ObjetoMSSpectrum = ObjetoMSRawData.GetSpectrum(RT, BackRT)

End If

CargarMSSpectrum = Datos_ok

End Function

'----------------------------------------------------------

' Este procedimiento sirve para liberar todos los objetos

' que se hayan creado durante la ejecución del programa

'----------------------------------------------------------

Anexo B : Listado del programa

208

Public Sub Liberar_objetos()

If Not ObjetoDatos Is Nothing Then

Set ObjetoDatos = Nothing

End If

If Not ObjetoMSRawData Is Nothing Then

Set ObjetoMSRawData = Nothing

End If

If Not ObjetoMS3DData Is Nothing Then

Set ObjetoMS3DData = Nothing

End If

End Sub

'----------------------------------------------------------

' Este procedimiento sirve para liberar el objeto

' MSSpectrum que se utiliza para obtener la intensidad

' del pico base y poder obtener así los valores de

' intensidad relativa.

'----------------------------------------------------------

Public Sub LiberarMSSpectrum()

If Not ObjetoMSSpectrum Is Nothing Then

Set ObjetoMSSpectrum = Nothing

End If

End Sub

'----------------------------------------------------------

' Este procedimiento sirve para contar los ficheros de

' datos del programa GCMSSolution que existen en la

' carpeta que se haya seleccionado como carpeta de trabajo.

'----------------------------------------------------------

Public Function ContarFicherosQGD(especificaciondecarpeta) As Integer

Dim fso, f, f1, fc, s, p

'If Not fso Is Nothing Then

'Set fso = Nothing

Anexo B : Listado del programa

209

'End If

'If Not f Is Nothing Then

'Set f = Nothing

'End If

'If Not fc Is Nothing Then

'Set fc = Nothing

'End If

If especificaciondecarpeta = "" Then

MsgBox "No has seleccionado ninguna carpeta", vbOKOnly, "Atencion"

Else

Set fso = CreateObject("Scripting.FileSystemObject")

Set f = fso.GetFolder(especificaciondecarpeta)

Set fc = f.Files

s = 0

For Each f1 In fc

p = Right(f1.Name, 3)

If p = "QGD" Or p = "qgd" Then

s = s + 1

End If

Next

Set fso = Nothing

Set f = Nothing

Set fc = Nothing

ContarFicherosQGD = s

End If

End Function

'----------------------------------------------------------

' Este procedimiento sirve para obtener datos de los

' archivos que contiene la carpeta de trabajo tales como

' el path, el nombre del fichero...

'----------------------------------------------------------

Public Sub AsignarDatosFicheros(numQGD As Integer, especificaciondecarpeta As String)

Dim fso, f, f1, fc, s, p

Dim numero As Integer

Set fso = CreateObject("Scripting.FileSystemObject")

Set f = fso.GetFolder(especificaciondecarpeta)

Set fc = f.Files

numero = 0

Anexo B : Listado del programa

210

For Each f1 In fc

p = Right(f1.Name, 3)

If p = "QGD" Or p = "qgd" Then

NombresFicheros(numero) = f1.Name

PathFicheros(numero) = f1.path

numero = numero + 1

End If

If numero = NumQGDs Then Exit For

Next

End Sub

'--------------------------------------------------------

' Este procedimiento sirve para ordenar alfabéticamente

' los datos como por ejemplo la lista de archivos de

' datos del GCMSSolution

'--------------------------------------------------------

Public Function SortArray(ByRef TheArray As Variant)

Dim Sorted As Boolean

Dim Temp As Variant

Dim x As Integer

Sorted = False

Do While Not Sorted

Sorted = True

For x = 0 To UBound(TheArray) - 1

If TheArray(x) > TheArray(x + 1) Then

Temp = TheArray(x + 1)

TheArray(x + 1) = TheArray(x)

TheArray(x) = Temp

Sorted = False

End If

Next x

Loop

End Function

'----------------------------------------------------------

' Este procedimiento sirve para crear el fichero de texto

' con el nombre de las variables. Los nombres de estas

' variables indican el scan y la masa a las que corres-

Anexo B : Listado del programa

211

' ponde una intensidad determinada.

'----------------------------------------------------------

Public Sub CrearFicheroVariables()

Dim i As Integer

Dim j As Integer

Dim objetotextovariables As Object

Dim textovariables As Object

Dim Inicio_rango_masas As Integer

Dim Fin_rango_masas As Integer

Dim Inicio_rango_scans As Integer

Dim Fin_rango_scans As Integer

Dim Tiempo As DatosTiempo

Dim RT

Dim RT_redondeado

Dim Letras

Dim Variable, Espacios, NumEspacios

Dim nombre_masa As String

'Inicio_rango_masas = Form1.Text17.Text

'Fin_rango_masas = Form1.Text18.Text

'Inicio_rango_scans = Form1.Text19.Text

'Fin_rango_scans = Form1.Text20.Text

'If Not objetotextovariables Is Nothing Then

'Set objetotextovariables = Nothing

'End If

'If Not textovariables Is Nothing Then

'Set textovariables = Nothing

'End If

'Set objetotextovariables = CreateObject("Scripting.FileSystemObject")

'Set textovariables = objetotextovariables.CreateTextFile(Form1.Text15.Text, True)

Tiempo = datos_tiempo()

For j = Inicio_rango_scans To Fin_rango_scans

RT = (Tiempo.StartRT + (Tiempo.Interval * (j - 1))) / 60000

RT_redondeado = Round(RT, 3)

'Letras = Len(RT_redondeado)

'Text2.Text = Letras & vbCrLf

'If Letras = 2 Then

Anexo B : Listado del programa

212

' RT_redondeado = RT_redondeado & "000"

'ElseIf Letras = 3 Then

' RT_redondeado = RT_redondeado & "00"

'ElseIf Letras = 4 Then

' RT_redondeado = RT_redondeado & "0"

'End If

For i = Inicio_rango_masas To Fin_rango_masas

Variable = RT_redondeado & "m" & i

NumEspacios = 15 - Len(Variable)

Espacios = String(NumEspacios, " ")

textovariables.writeline (Variable & Espacios)

Next i

Next j

textovariables.Close

'MsgBox "Fichero VARIABLES creado", vbOKOnly, "Fichero creado"

End Sub

'----------------------------------------------------------

' Con esta función se obtienen los datos relativos al

' tiempo de análisis de la sustancia.

'----------------------------------------------------------

Public Function datos_tiempo() As DatosTiempo

Dim Tiempo As DatosTiempo

If Not ObjetoMS3DData Is Nothing Then

Tiempo.StartRT = ObjetoMS3DData.StartRT

Tiempo.EndRT = ObjetoMS3DData.EndRT

Tiempo.Interval = ObjetoMS3DData.Interval

End If

datos_tiempo = Tiempo

End Function

'Public Sub CrearFicheroObjetos()

'Dim nStartDelim As Long

'Dim nEndDelim As Long

'Dim nStartDelim1 As Long

'Dim i As Integer

'Dim objetotextobj As Object

'Dim textobj As Object

'Dim nombreobj() As String

'ReDim nombreobj(0 To NumQGDs - 1)

Anexo B : Listado del programa

213

'Bucle para escribir los nombres de objetos en el fichero

'If Not objetotextobj Is Nothing Then

'Set objetotextobj = Nothing

'End If

'If Not textobj Is Nothing Then

'Set textobj = Nothing

'End If

'Set objetotextobj = CreateObject("Scripting.FileSystemObject")

'Set textobj = objetotextobj.CreateTextFile(Form1.Text16.Text, True)

'For i = 0 To NumQGDs - 1

'nStartDelim = InStrRev(PathFicheros(i), "\")

'nStartDelim = nStartDelim + Len("\")

'nEndDelim = InStr(nStartDelim, PathFicheros(i), ".")

'nombreobj(i) = Mid$(PathFicheros(i), nStartDelim, nEndDelim - nStartDelim)

'textobj.writeline (nombreobj(i))

'Next i

'textobj.Close

''MsgBox "Fichero OBJETOS creado", vbOKOnly, "Fichero creado"

'End Sub

Anexo B : Listado del programa

214

B.2.4. Módulo PCA.

'####################################################################

'###### ######

'###### MODULO ESTANDAR EN EL QUE SE INCLUYEN ######

'###### PROCEDIMIENTOS GLOBALES QUE SE UTILIZAN ######

'###### EN CALCULOS RELACIONADOS EL FORMULARIO ######

'###### DE LAS PCAs. ######

'###### ######

'####################################################################

Option Explicit

'----------------------------------------------------------------------

' La siguiente función calcula el número de scans que tendrá la matriz

' de cromatografía a partir de los intervalos introducidos por el

' usuario. De esta forma se puede redimensionar el tamaño de la matriz

' y darle el tamaño que va a tener.

'----------------------------------------------------------------------

Public Function Numero_scans(Lim_scan_ini() As Variant, Lim_scan_fin() As Variant) As Integer

Dim n As Integer

Dim scans As Integer

scans = 0

For n = 0 To 8

If IsNumeric(Lim_scan_ini(n)) And IsNumeric(Lim_scan_fin(n)) Then

scans = Lim_scan_fin(n) - Lim_scan_ini(n) + 1 + scans

End If

Next n

Numero_scans = scans

End Function

'-----------------------------------------------------------------------

' La siguiente función calcula el número de variables que va a contener

' una matriz de intensidades. Para ello se tiene en cuenta los limites

' de intervalos introducidos por el usuario.

'-----------------------------------------------------------------------

Anexo B : Listado del programa

215

Public Function Numero_variables(Lim_scan_ini() As Variant, Lim_scan_fin() As Variant, Lim_mas_ini() As Variant, Lim_mas_fin() As Variant) As Long

Dim n As Integer

Dim variables As Long

variables = 0

For n = 0 To 8

If IsNumeric(Lim_scan_ini(n)) And IsNumeric(Lim_scan_fin(n)) And IsNumeric(Lim_mas_ini(n)) And IsNumeric(Lim_mas_fin(n)) Then

variables = CLng((Lim_scan_fin(n) - Lim_scan_ini(n) + 1)) * (Lim_mas_fin(n) - Lim_mas_ini(n) + 1) + variables

End If

Next n

Numero_variables = variables

End Function

'--------------------------------------------------------------------

' Esta función sirve para construir el nombre de las variables

' para la cromatografía. Estos nombres indican el instante de

' de tiempo en que se ha adquirido el valor de intensidad. En

' posteriores tratamientos de los datos como PCA's se podrán

' utilizar a modo de etiquetas en gráficos.

'--------------------------------------------------------------------

Public Function cr_nombre_variable(i As Integer) As String

Dim x As String

x = i

If Len(x) = 1 Then

cr_nombre_variable = "s" & "000" & i

ElseIf Len(x) = 2 Then

cr_nombre_variable = "s" & "00" & i

ElseIf Len(x) = 3 Then

cr_nombre_variable = "s" & "0" & i

Else

cr_nombre_variable = "s" & i

End If

End Function

'--------------------------------------------------------------------

' Esta función sirve para construir el nombre de las variables

' para la cromatografía. Estos nombres indican el instante de

' de tiempo en que se ha adquirido el valor de intensidad, así

Anexo B : Listado del programa

216

' como la masa a la que pertenece ese valor.

' En posteriores tratamientos de los datos como PCA's se podrán

' utilizar a modo de etiquetas en gráficos.

'--------------------------------------------------------------------

Public Function esp_nombre_variable(i As Integer, j As Integer) As String

Dim x As String

Dim y As String

Dim scan As String

Dim masa As String

x = i

y = j

If Len(x) = 1 Then

scan = "s" & "000" & i

ElseIf Len(x) = 2 Then

scan = "s" & "00" & i

ElseIf Len(x) = 3 Then

scan = "s" & "0" & i

Else

scan = "s" & i

End If

If Len(y) = 1 Then

masa = "m" & "00" & j

ElseIf Len(y) = 2 Then

masa = "m" & "0" & j

Else

masa = "m" & j

End If

esp_nombre_variable = scan & masa

End Function

'--------------------------------------------------------------------

'La siguiente funcion recibe como argumento un nombre y devuelve el

'mismo nombre añadiéndole espacios hasta 20 caracteres en total.

'De esta forma todos los nombres de objetos tendrán una longitud

'de 20 caracteres.

'--------------------------------------------------------------------

Public Function Ajustar_nombre_objeto(nombre As String) As String

Dim m As Integer

Anexo B : Listado del programa

217

m = Len(nombre)

Ajustar_nombre_objeto = nombre & String(20 - m, " ")

End Function

Anexo B : Listado del programa

218

B.2.5. Módulo Texto.

'####################################################################

'###### ######

'###### MODULO ESTANDAR EN EL QUE SE INCLUYEN ######

'###### PROCEDIMIENTOS GLOBALES QUE SE UTILIZAN ######

'###### EN CALCULOS RELACIONADOS EL FORMULARIO ######

'###### DE EN QUE SE GENERAN LOS FICHEROS DE TEXTO. ######

'###### ######

'####################################################################

Option Explicit

'--------------------------------------------------------------------

' Esta función abre el cuadro de dialogo estándar de windows

' "Guardar como...". De esta forma es más cómodo para el usuario

' ubicar el fichero que quiere guardar o crear y escribir

' su nombre.

'--------------------------------------------------------------------

Public Function GuardarNombreFichero() As String

'CancelError es True.

On Error GoTo ErrHandler

'Establece los filtros.

Form_texto.CommonDialog1.Filter = "All Files (*.*)|*.*|Text_Files (*.txt)|*.txt|CGMS Data Files (*.qgd)|*.qgd|Matlab Files (*.m)|*.m"

' Especifique el filtro predeterminado.

Form_texto.CommonDialog1.FilterIndex = 2

' Presenta el cuadro de diálogo Abrir.

Form_texto.CommonDialog1.ShowSave

' Se obtiene el nombre seleccionado.

GuardarNombreFichero = Form_texto.CommonDialog1.FileName

Exit Function

ErrHandler:

'El usuario hizo clic en el botón Cancelar.

Exit Function

Anexo B : Listado del programa

219

End Function

'--------------------------------------------------------------------

' Esta función calcula el valor mínimo de entre todos los límites

' introducidos por el usuario para definir los intervalos que

' delimitan los datos que desea obtener.

'--------------------------------------------------------------------

Public Function Minimo(Limites() As Variant) As Integer

Dim n As Integer

Dim Min As Integer

Min = 32767

For n = 0 To 8

If Limites(n) <> 0 Then

If Limites(n) < Min Then

Min = Limites(n)

End If

End If

Next n

Minimo = Min

End Function

'--------------------------------------------------------------------

' Esta función calcula el valor máximo de entre todos los límites

' introducidos por el usuario para definir los intervalos que

' delimitan los datos que desea obtener.

'--------------------------------------------------------------------

Public Function Maximo(Limites() As Variant) As Integer

Dim n As Integer

Dim Max As Integer

Max = 0

For n = 0 To 8

If IsNumeric(Limites(n)) <> 0 Then

If Limites(n) > Max Then

Max = CInt(Limites(n))

End If

End If

Next n

Maximo = Max

Anexo B : Listado del programa

220

End Function

'--------------------------------------------------------------------

' Esta función se utiliza para detectar un posible error cometido

' por el usuario en el momento de definir los limites de los inter-

' valos. Si se detecta un caracter no numérico como limite de

' un intervalo aparecerá un mensaje de aviso para el usuario.

'--------------------------------------------------------------------

Public Function No_Intervalo_Numerico(Lim_scan_ini() As Variant, Lim_scan_fin() As Variant) As Boolean

Dim NoCorrecto As Boolean

Dim n As Integer

NoCorrecto = False

For n = 0 To 8

If Lim_scan_ini(n) <> "" Or Lim_scan_fin(n) <> "" Then

If Not IsNumeric(Lim_scan_ini(n)) Or Not IsNumeric(Lim_scan_fin(n)) Then

NoCorrecto = True

End If

End If

Next n

No_Intervalo_Numerico = NoCorrecto

End Function

'--------------------------------------------------------------------

' Esta función se utiliza para detectar un posible error cometido

' por el usuario. Si se detecta que el usuario ha pulsado el botón

' de crear una matriz pero no hay ningún intervalo definido

' aparecerá un mensaje de aviso para el usuario.

'--------------------------------------------------------------------

Public Function No_Intervalo_Minimo(Inicio As Variant, Fin As Variant) As Boolean

Dim NoCorrecto As Boolean

NoCorrecto = False

If Inicio = "" And Fin = "" Then

NoCorrecto = True

End If

No_Intervalo_Minimo = NoCorrecto

End Function

Anexo B : Listado del programa

221

'--------------------------------------------------------------------

' Esta función se utiliza para detectar un posible error cometido

' por el usuario. Si se detecta que el usuario ha introducido valores

' incorrectos debido a que el limite inferior es mayor que el supe-

' rior aparecerá un mensaje de aviso para el usuario.

'--------------------------------------------------------------------

Public Function Intervalo_Desordenado(Lim_scan_ini() As Variant, Lim_scan_fin() As Variant) As Boolean

Dim NoCorrecto As Boolean

Dim n As Integer

NoCorrecto = False

For n = 0 To 8

If Lim_scan_ini(n) <> 0 Or Lim_scan_fin(n) <> 0 Then

If Lim_scan_ini(n) > Lim_scan_fin(n) Then

NoCorrecto = True

End If

End If

Next n

Intervalo_Desordenado = NoCorrecto

End Function

'--------------------------------------------------------------------

' Esta función sirve para detectar que el dato tratado pertenece

' a los intervalos definidos por el usuario. Por lo tanto este dato

' debe ser guardado en el fichero de texto correspondiente.

' Esta función es específica para datos de cromatografía por lo

' que a la hora de definir los intervalos sólo se tiene en cuenta la

' variable tiempo.

'--------------------------------------------------------------------

Public Function Dato_en_intervalos(i As Integer, Lim_scan_ini() As Variant, Lim_scan_fin() As Variant) As Boolean

Dim Dato_ok As Boolean

Dim n As Integer

Dato_ok = False

For n = 0 To 8

If Lim_scan_ini(n) <> 0 And Lim_scan_fin(n) <> 0 Then

If i >= Lim_scan_ini(n) And i <= Lim_scan_fin(n) Then

Anexo B : Listado del programa

222

Dato_ok = True

End If

End If

Next n

Dato_en_intervalos = Dato_ok

End Function

'--------------------------------------------------------------------

' Este procedimiento sirve para liberar los objetos que se han

' creado durante la ejecución del programa.

'--------------------------------------------------------------------

Public Sub Liberar_objetos_textos()

If Not ObjetoDatos Is Nothing Then

Set ObjetoDatos = Nothing

End If

If Not ObjetoMSRawData Is Nothing Then

Set ObjetoMSRawData = Nothing

End If

If Not ObjetoMSChromatogram Is Nothing Then

Set ObjetoMSChromatogram = Nothing

End If

End Sub

'--------------------------------------------------------------------

' Esta función sirve para obtener el nombre de un archivo

' a partir del path completo de éste.

'--------------------------------------------------------------------

Public Function Capturar_nombre(PathFichero As String) As String

Dim nStartDelim As Long

Dim nEndDelim As Long

Dim nStartDelim1 As Long

nStartDelim = InStrRev(PathFichero, "\")

nStartDelim = nStartDelim + Len("\")

nEndDelim = InStr(nStartDelim, PathFichero, ".")

Capturar_nombre = Mid$(PathFichero, nStartDelim, nEndDelim - nStartDelim)

End Function

Anexo B : Listado del programa

223

'El siguiente procedimiento lo dejo con comentarios por si acaso luego se reutiliza pero

'de momento no hace falta porque al pasar los datos a una matriz ya se pone 0 si el dato

'no es numerico por lo que el error que pretende detectar este procedimiento no se dará

'nunca. De momento lo dejamos así y luego la asignación de las matrices se puede retocar

'para detectar ese error.

'

'Public Function No_Intervalo_Numerico_esp(Lim_scan_ini() As Integer, Lim_scan_fin() As Integer, Lim_mas_ini() As Integer, Lim_mas_fin() As Integer) As Boolean

' Dim NoCorrecto As Boolean

' Dim n As Integer

' NoCorrecto = False

' For n = 0 To 8

' If Lim_scan_ini(n) <> 0 Or Lim_scan_fin(n) <> 0 Then

' If Not IsNumeric(Lim_scan_ini(n)) Or Not IsNumeric(Lim_scan_fin(n)) Then

' NoCorrecto = True

' End If

' End If

' Next n

' No_Intervalo_Numerico = NoCorrecto

'End Function

'--------------------------------------------------------------------

' Esta función se utiliza para detectar un posible error cometido

' por el usuario. Si se detecta que el usuario ha pulsado el botón

' de crear una matriz pero no hay algún límite del primer intervalo

' que no ha sido introducido aparecerá un mensaje de aviso.

'--------------------------------------------------------------------

Public Function No_Intervalo_Minimo_esp(scan_ini As Variant, scan_fin As Variant, masa_ini As Variant, masa_fin As Variant) As Boolean

Dim NoCorrecto As Boolean

NoCorrecto = False

If Not IsNumeric(scan_ini) Or Not IsNumeric(scan_fin) Or Not IsNumeric(masa_ini) Or Not IsNumeric(masa_fin) Then

NoCorrecto = True

Anexo B : Listado del programa

224

End If

No_Intervalo_Minimo_esp = NoCorrecto

End Function

'--------------------------------------------------------------------

' Esta función se utiliza para detectar un posible error cometido

' por el usuario. Si se detecta que el usuario ha introducido valores

' incorrectos debido a que el limite inferior es mayor que el supe-

' rior aparecerá un mensaje de aviso para el usuario. Esta función es

' específica para datos de espectrometría por lo que en los

' intervalos se tiene en cuenta tanto las masas como el tiempo (scans)

'--------------------------------------------------------------------

Public Function Intervalo_Desordenado_esp(Lim_scan_ini() As Variant, Lim_scan_fin() As Variant, Lim_mas_ini() As Variant, Lim_mas_fin() As Variant) As Boolean

Dim NoCorrecto As Boolean

Dim n As Integer

NoCorrecto = False

For n = 0 To 8

If IsNumeric(Lim_scan_ini(n)) Or IsNumeric(Lim_scan_fin(n)) Or IsNumeric(Lim_mas_ini(n)) Or IsNumeric(Lim_mas_fin(n)) Then

If Lim_scan_ini(n) > Lim_scan_fin(n) Or Lim_mas_ini(n) > Lim_mas_fin(n) Then

NoCorrecto = True

End If

End If

Next n

Intervalo_Desordenado_esp = NoCorrecto

End Function

'--------------------------------------------------------------------

' Esta función sirve para detectar que el dato tratado pertenece

' a los intervalos definidos por el usuario. Por lo tanto este dato

' debe ser guardado en el fichero de texto correspondiente.

' Esta función es específica para datos de cromatografía por lo

' que a la hora de definir los intervalos sólo se tiene en cuenta la

' variable tiempo.

'--------------------------------------------------------------------

Anexo B : Listado del programa

225

Public Function Dato_en_intervalos_esp(i As Integer, j As Integer, Lim_scan_ini() As Variant, Lim_scan_fin() As Variant, Lim_masa_ini() As Variant, Lim_masa_fin() As Variant) As Boolean

Dim Dato_ok As Boolean

Dim n As Integer

Dato_ok = False

For n = 0 To 8

If Lim_scan_ini(n) <> 0 And Lim_scan_fin(n) <> 0 And Lim_masa_ini(n) <> 0 And Lim_masa_fin(n) <> 0 Then

If i >= Lim_scan_ini(n) And i <= Lim_scan_fin(n) And j >= Lim_masa_ini(n) And j <= Lim_masa_fin(n) Then

Dato_ok = True

End If

End If

Next n

Dato_en_intervalos_esp = Dato_ok

End Function

ANEXO C: Comunicación COM y Matlab.

Anexo C: Comunicación COM y Matlab

229

Anexo C: Comunicación COM y MATLAB.

C.1. ¿Qué es COM?.

Para ver qué es COM, vamos a hacernos antes la siguiente pregunta: ¿cómo pueden diferentes pedazos de software ("chunks") acceder entre sí a los distintos servicios que proporcionan?

Hasta ahora, la respuesta es clara: depende de qué tipo de software se trate. Es decir, una aplicación podría acceder a los servicios que le proporciona una librería enlazándose a ella, y llamando a alguna de sus rutinas. O bien, una aplicación puede acceder a los servicios de otra que se encuentra en un proceso diferente, para lo cual, se debe acudir a alguno de los diferentes mecanismos de comunicación entre procesos (IPC, "Interprocess Communications"). Un tercer tipo sería el acceso a los servicios del propio sistema operativo. O bien, una aplicación puede requerir los servicios de otra que se encuentra en otra máquina completamente diferente, accesible a través de la red.

La necesidad fundamental es la misma: acceder a los servicios de un determinado software. Sin embargo, el mecanismo difiere. ¿No sería mucho mejor definir un modo unificado de acceder a cualquier servicio de un determinado software, sin importarnos cómo se proporcionan?

Esto es lo que hace COM: Define un estándar mediante el cual un trozo de código proporciona sus servicios a otro, y que funciona en todos los casos a los que anteriormente nos hemos referido.

Mediante COM, un trozo de código expone sus servicios a través de uno o más objetos COM. Cada objeto COM soporta uno o más interfaces, cada uno de los cuales incluye un determinado número de métodos. Los clientes de un objeto COM pueden acceder a sus servicios invocando a alguno de los métodos definidos en alguno de sus interfaces, no pudiendo acceder directamente a los datos de dicho objeto. La mayoría de los objetos COM soportan más de un interfaz. El objeto en sí se implementa siempre dentro de un servidor, que puede ser bien una DLL o un EXE.

Para invocar a los métodos de un interfaz de un objeto COM, el cliente debe adquirir un puntero a ese interfaz.

Cada objeto COM es una instancia de una determinada clase. Es por tanto necesario conocer la clase a la que pertenece un objeto si es que queremos ejecutar una determinada instancia del mismo (lo cual podemos hacer con la librería COM). Esta librería está presente en cada sistema que soporta COM, y que tiene acceso a un directorio en el cual se encuentran todas las clases de objetos COM que se hayan en el sistema. El cliente llamaría a una función de la librería COM especificando la clase de objeto COM que queremos instanciar, y el primero de los interfaces del cual queremos un puntero.

La librería COM proporciona estos servicios a través de funciones, y no a través de métodos en interfaces COM.

Una vez que el cliente tiene un puntero a uno de los interfaces, puede preguntar al objeto en cuestión acerca del resto de los interfaces que éste expone (a modo de punteros, se entiende). Así, podemos llamar a los métodos de ese interfaz como si de una función

Anexo C: Comunicación COM y Matlab

230

cualquiera se tratara, con la diferencia de que no tenemos que preocuparnos acerca de dónde se está ejecutando ese código, porque todo es accesible del mismo modo.

C.2. Orientación a Objetos y COM.

Un objeto no es más que una combinación de datos y métodos. Los objetos son una idea central en COM. Pero el modo en que COM expone y usa sus objetos difiere del modo en que se hace en otra serie de tecnologías quizás más conocidas.

Una de las principales diferencias es que los objetos COM exponen más de un interfaz (Java también lo permite), y la mayoría de las tecnologías orientadas a objetos sólo uno por objeto.

En COM, una clase define una implementación particular de un conjunto de interfaces. De hecho, dos clases distintas pueden exponer, por ejemplo, diferentes implementaciones del mismo conjunto de interfaces. El cómo estén implementados esos interfaces, que es lo que la clase define, no es materia del cliente. La habilidad de trabajar del mismo modo con diferentes tipos de objetos, soportando cada uno el mismo conjunto de interfaces es lo que se llama polimorfismo. Pues bien, COM soporta polimorfismo.

En cuanto a la herencia, tenemos que distinguir entre herencia de la implementación, y herencia de interfaces. En la herencia de interfaces, lo que se hereda es la definición de los mismos, y no su implementación: el objeto hijo ha de proveer la implementación. C++ proporciona los dos tipos de herencia; COM sólo la de interfaces. La razón se haya en que de este modo, es imposible que se pueda romper la encapsulación del objeto padre, ya que cuando se hereda la implementación se conocen los detalles del objeto padre. Claro que si no heredamos la encapsulación, la pregunta es: ¿cómo puede un objeto COM reutilizar el código que expone otro objeto? La respuesta es: mediante agregación y contención. Mediante la contención, un objeto simplemente llama a otro cuando lo necesita; con agregación, un objeto presenta uno o más de los interfaces de otro objeto como si fueran suyos; lo que un cliente ve como un único objeto que proporciona un conjunto de interfaces es en realidad dos o más objetos agregados.

Las tecnologías orientadas a objetos tradicionales presentan tres obstáculos a la hora de crear lo que podemos denominar un mercado de componentes software:

4. Distribución de objetos con el código fuente, debido a la posible incompatibilidad binaria de los mismos.

5. Es difícil la reutilización de objetos entre diferentes lenguajes.

6. Necesidad de volver a recompilar la aplicación si algún componente se modifica.

Estos tres problemas tienen solución en COM: los objetos COM pueden empaquetarse en librerías o ejecutables, y pueden ser distribuidos en formato binario sin necesidad de distribuir el código fuente. Esto es así porque COM define un mecanismo estándar de acceso a los componentes software binarios; por tanto, pueden desarrollarse con un determinado lenguaje, y utilizarse con otro. Como los objetos COM se instancian a medida que se necesitan, cuando una nueva versión se instala en el sistema, todos los clientes obtendrán automáticamente la nueva versión del componente la siguiente vez que lo necesiten.

Anexo C: Comunicación COM y Matlab

231

Lo que se pretende es constituir un gran mercado de componentes software basados en COM y fácilmente reutilizables.

Entre los principales beneficios de COM se hayan:

5. las ventajas que ofrece la orientación a objetos.

6. La consistencia.

7. La independencia del lenguaje.

8. El versionamiento simple y eficiente.

9. COM se encontrará disponible en diferentes sistema operativos (ya lo está en los sistemas operativos de Microsoft).

C.3. Matlab y COM.

C.3.1. Glosario.

Objetos COM: Un objeto COM es una instanciación de una clase. COM aplica un encapsulamiento total de forma que no se puede acceder a los datos internos del objeto directamente. Se accede a los métodos y propiedades del objeto mediante interfaces.

Formas de operar de un objeto COM.

In-process: El objeto se implementa en una DLL y se carga dentro de la aplicación cliente. No se requiere comunicación entre procesos.

Out-of-process: El objeto está en una archivo EXE y funciona en un proceso de servidor separado. La aplicación se tiene que comunicar con él más allá del las propias fronteras del proceso.

DCOM: Los objetos pueden estar en un sistema remosto conectado por red, en cuyo caso se utiliza el protocolo DCOM (Distributed Component Object Model).

Interfaces COM: Una interfaz COM proporciona acceso a los métodos y propiedades del objeto COM. A traves de ciertos métodos se obtiene acceso a propiedades del objeto. La interfaz no contiene una implementación de ningún método. Sólo sirve como un puntero a los métodos y propiedades del objeto. Cada objeto puede exponer más de una interfaz. Para usar un objeto COM hay que saber qué interfaces soporta, así como los métodos, propiedades y eventos implementados en el objeto. El fabricante del objeto COM debe proporcionar la información.

Automatización: Es un método simple de comunicación entre clientes y servidores tipo COM. Utiliza una interfaz estándar única llamada lDispatch. Esta interfaz permite al cliente acceder a las propiedades y métodos del objeto COM. Un cliente que se comunica utilizando lDispatch es conocido como “cliente de Automatización”y el servidor como “servidor de Automatización”.

LDispatch es el único tipo de interfaz que soporta Matlab.

Anexo C: Comunicación COM y Matlab

232

Controles: Un control es un componente de Automatización que tiene una interfaz gráfica de usuario (cuadros, botones...). De esta forma el programa puede responder a acciones tomadas por el usuario. Por ejemplo, una ventana con un botón de “OK” y otro de “Cancela” sería un control. Un control se ejecuta en el espacio de direcciones del proceso de la aplicación. En este caso se indica al cliente que es un contenedor del control que el control estará incluido como parte de la aplicación. Debido a que un control se comunica mediante Automatización, la aplicación (cliente) puede invocar directamente sus métodos y acceder a sus propiedades. El control debe poder comunicarse con el cliente (aplicación) a su vez, esto le permite notificar de cualquier evento ocurrido como por ejemplo un “clic” del ratón.

C.3.2. Configuraciones COM en Matlab.

Se puede configurar MATLAB tanto para controlar objetos COM como para ser controlado por otros componentes COM. Cuando MATLAB controla otros componentes , MATLAB es el cliente y el otro componente es el servidor. Cuando MATLAB es controlado por otro componente está actuando como servidor.

MATLAB puede soportar 4 tipos de configuración cliente-servidor COM:

5. MATLAB cliente y un control (servidor) In-process.

6. MATLAB cliente y un servidor Out-of-process.

7. Aplicación cliente y MATLAB como servidor de Automatización.

8. Aplicación cliente y MATLAB como un motor servidor.

Las tres primeras configuraciones se comunican utilizando una interfaz de Automatización a la cuál el cliente accede. Es un tipo de interfaz COM que se denomina lDispatch. La última configuración utiliza un tipo de interfaz COM más rápida denominada lEngine.

C.3.2.1. MATLAB cliente y un control (servidor) In-process.

Se utiliza esta configuración cuando se necesita interactuar con un control COM. Los controles son componentes que pueden ser integrados en lo que a interfaz visual y programa se refiere en un contenedor como por ejemplo una ventana de figura de MATLAB. Algunos ejemplos de controles útiles son el buscador de Internet Explorer, el control de comunicaciones para el acceso al puerto serie o todas las interfaces gráficas proporcionadas por el entorno de desarrollo de Visual Basic.

En la figura C.1. se muestra un esquema que describe este tipo de configuración. La aplicación en MATLAB es, en este caso, el cliente. MATLAB “contiene” al control, porque el control se ejecuta en el espacio de direcciones del proceso de la aplicación

Anexo C: Comunicación COM y Matlab

233

cliente en lugar de hacerlo en un proceso separado. El control COM es, en este caso, el servidor de Automatización.

Figura C.1. MATLAB cliente y un control (servidor) In-process.

El control se crea utilizando la función de MATLAB actxcontrol. Esta función crea una ventana de figura de MATLAB y sitúa la interfaz gráfica de usuario del control dentro de esa ventana. Los usuarios podrán interactuar con esa interfaz gráfica utilizando los menús, botones, etc. Según la acción que se tome se disparará uno u otro evento que será comunicado por parte del control al cliente (MATLAB). El cliente decidirá, entonces, qué hacer y responderá adecuadamente.

C.3.2.2. MATLAB cliente y un servidor Out-of--process.

Esta configuración ejecuta el servidor en un proceso separado del proceso de la aplicación. El servidor no es contenido por el proceso del cliente y no se ejecuta como una parte de MATLAB en una ventana de figura de éste. Cualquier interfaz gráfica de usuario que se vaya a utilizar se presenta en una ventana separada. Ejemplos de servidores locales son Microsoft Excel y Microsoft Word.

El cliente y el servidor utilizan Automatización para comunicarse a través de una interfaz lDispatch COM. Dado que el servidor se ejecuta en un proceso de ejecución separado podrá funcionar tanto en el mismo sistema que la aplicación cliente como en un computador remoto (DCOM). Actualmente, para la versión 6.5 de MATLAB, no hay soporte para eventos generados desde servidores de Automatización que se ejecuten fuera del proceso de la aplicación cliente desarrollada desde MATLAB.

La función de MATLAB actxserver crea un servidor de automatización COM y devuelve un objeto COM para la interfaz del servidor por defecto.

En la figura C.2. se puede observar el diagrama que describe esta configuración entre una aplicación MATLAB cliente y un servidor COM.

MATLAB

Application

Automation Client Automation Server

In-Process

Control

lDispatch

Interface

Anexo C: Comunicación COM y Matlab

234

Figura C.2. MATLAB cliente y un servidor Out-of-process.

C.3.2.3. Aplicación cliente y MATLAB como servidor de Automatización.

MATLAB opera como un servidor de Automatización en este tipo de configuración. Podrá ser iniciado y controlado por cualquier programa de tipo windows que pueda actuar como controlador de automatización. Algunos ejemplos de aplicaciones que pueden actuar como controladores de Automatización son todas aquellas desarrolladas en Microsoft Excel, Microsoft Access, Microsoft Project y los programas desarrollados en Visual Basic y Visual C++.

Un servidor de automatización desarrollado en MATLAB puede ejecutar comandos en el workspace de MATLAB y adquirir y trasladar matrices directamente en el workspace.

Nota: Debido a que los programas clientes en VBScript requieren una interfaz de comunicación para comunicarse con los servidores, esta es la única configuración que soportará un cliente VBScript.

De entre todas las configuraciones que proporciona MATLAB ésta es la configuración que se ha adoptado para desarrollar el programa desarrollado en este proyecto

Figura C.3. Aplicación cliente y MATLAB como servidor de Automatización.

Client

Application

Automation Client Automation Server

MATLAB lDispatch

Interface

MATLAB

Application

Automation Client Automation Server

Out-of-Process

Server

lDispatch

Interface

Anexo C: Comunicación COM y Matlab

235

C.3.2.4. Aplicación cliente y MATLAB como un motor servidor

MATLAB proporciona una interfaz más rápidas que las vistas anteriormente llamada lEngine para aplicaciones cliente escritas en C, C++ o Fortran. MATLAB utiliza este tipo de interfaz COM para comunicar la aplicación cliente y el moton MATLAB funcionando como un servidor COM. Junto con MATLAB se proporciona una librería de funciones que permitirá al usuario iniciar y finalizar el proceso del servidor, y enviar comandos para que sean procesados por MATLAB.

Figura C.4. Aplicación cliente y MATLAB como un motor servidor.

C.3.2. MATLAB COM Builder.

MATLAB COM Builder es una extensión del compilador de MATLAB que permite al usuario convertir automáticamente aplicaciones desarrolladas en MATLAB a un modelos de objeto componente COM (Component objects model). La persona que crea la aplicación puede realizar el desarrollo en MATLAB y convertir la aplicación en un objeto COM listo para ser utilizado. Estos objetos COM creados mediante MATLAB COM Builder pueden integrarse inmediatamente en una aplicación basada en COM como por ejemplo un programa en Visual Basic.

MATLAB COM Builder soporta estos compiladores:

• Borland C++ Builder 4

• Borland C++ Builder 5

• Borland C++ Builder 6

• Microsoft Visual Studio 5.0

• Microsoft Visual Studio 6.0

• Microsoft Visual Studio .NET

Client

Application

COM Client COM Server

MATLAB

Engine

lEngine

Interface

Anexo C: Comunicación COM y Matlab

236

Utilizar MATLAB COM Builder para crear un componente COM es un proceso simple que consta de una secuencia de 4 pasos:

1. Crear el proyecto.

2. Desarrollar los M-Files y MEX-Files.

3. Construir el proyecto.

4. Empaquetar y distribuir el proyecto.

Un proyecto está compuesto por todos los elementos necesarios para desarrollar un objeto COM. Los componentes creados con MATLAB COM Builder son objetos COM accesibles a través de Visual Basic, C++ o cualquier otra aplicación o lenguaje que soporte COM. COM son las siglas de Component Object Model que es el estándar binario de Microsoft para el funcionamiento entre objetos. Cada componente COM expone una o más clases al entorno de programación Visual Basic (por ejemplo). Cada clase contiene una serie de funciones llamadas métodos, correspondientes a las funciones originales desarrolladas en MATLAB incluidas en los componentes del proyecto cuando se crea el objeto COM.

Cuando se crea un proyecto se proporciona una o más nombres de clases. El nombre del componente constituye el nombre del fichero DLL que se va a crear. El nombre de una clase denota el nombre que se utiliza para acceder a un método específico en tiempo de ejecución. La relación entre el nombre del componente, los nombres de las clases que incluye el componente y las funciones que hay dentro de cada una de las clases es una cuestión puramente organizativa que depende de la persona que desarrolla el componente.

Como regla general, cuando se compilan varias funciones de MATLAB, ayuda el determinar un esquema de las categorías de las funciones y el crear una clase separada para cada categoría. El nombre de la clase debe ser descriptivo de lo que la clase hace.

Los componentes creados por MATLAB COM Builder también soportan un mecanismo simple de versiones. Un número de versión es asignado a un componente determinado. Este número quedará registrado en el fichero DLL y en el registro de información del sistema. Como regla general la primera versión de un componente es 1.0 (valor por defecto si no se selecciona ningún otro). Los cambios realizados al componente antes de su distribución mantienen el mismo número de versión. Después de la distribución, si se hacen cambios se asignará un nuevo número de versión cuando se distribuya para que se pueda llevar un control de las versiones nuevas y las antiguas. El sistema considera las clases de diferentes versiones del mismo componente como clases diferentes aunque tengan el mismo nombre.

Para empezar un proyecto de creación de un objeto COM se debe iniciar la herramienta del COM Builder escribiendo la instrucción comtool en la línea de comandos de MATLAB. Aparecerá la ventana principal de MATLAB COM Builder (figura C.5.). En esta interfaz gráfica el usuario podrá definir las clases y las funciones desarrolladas en MATLAB que serán los métodos del objeto que se va crear.

En este proyecto en el que se ha desarrollado el programa IDAMAT no se ha utilizado el MATLAB COM Builder para desarrollar objetos COM. Sin embargo, si en el futuro se decide ampliar el programa o mejorarlo quizá se podría utilizar esta herramienta para crear DLL’s y de esta forma realizar un programa que pueda funcionar sin necesidad

Anexo C: Comunicación COM y Matlab

237

de tener el programa MATLAB instalado en el sistema. De esta forma se podría obtener un programa más comercial y poderlo vender a empresas que estén interesadas.

Figura C.5. MATLAB COM Builder.

ANEXO D: Funciones de soporte en Matlab.

Anexo D : Funciones de soporte en Matlab

241

Anexo D: Funciones de soporte en MATLAB.

D.1. Introducción.

La mayor parte de las necesidades que han ido surgiendo a medida que se ha desarrollado el proyecto se han resuelto mediante Visual Basic 6.0. Es decir, es el programa IDAMAT quien se encarga de ejecutar y calcular todas las operaciones para obtener los datos finales. Sin embargo, algunas cuestiones que han surgido se han resuelto en Matlab.

La solución informática que se ha ido desarrollando desde un principio ya puso de manifiesto la necesidad de comunicar los programas IDAMAT y Matlab. Esto fue debido a que los algoritmos de tratamiento de los datos que se preveía, se iban a aplicar en análisis posteriores y ajenos a este proyecto, se aplicarían en un entorno de Matlab. Posteriormente se ha visto la posibilidad de utilizar esta comunicación para aprovechar la potencia y funciones de cálculo de Matlab. Este es el caso de la función ObtenerDesplazamiento programada en Matlab.

En el programa IDAMAT se construyen las matrices con los datos de espectrometría y cromatografía. Existe la opción de obtener estos datos alineados con respecto a una de las sustancias analizadas. Para poder realizar el alineamiento y modificar los datos obtenidos previamente es necesario saber cuál es el desplazamiento de los datos de cada una de las sustancias. Resultó más cómodo resolver esta cuestión en Matlab gracias a la función de correlaciones cruzadas que proporciona. Por este motivo se decidió programar la función ObtenerDesplazamiento que mediante la función crosscorr obtiene los desplazamientos que tiene cada sustancia con respecto a la de referencia.

Entonces, aprovechando la flexibilidad y capacidad que nos brinda el protocolo de automatización COM para aprovechar las herramientas de todos los programas que se comunican entre si, la solución a esta cuestión derivó en un intercambió de información que se describe en la figura D.1.

Figura D.1. Flujo de datos para realizar el alineamiento de datos.

Programa IDAMAT

Obtención de la cromatografía.

Matrices de cromatografía

A partir de las matrices de cromatografía se calcula el desplazamiento de las sustancias (vector DESPLA)

MATLAB VISUAL BASIC 6.0

ALINEACION DE LOS DATOS (CROM. O ESPECTR. )

Vector DESPLA

Anexo D : Funciones de soporte en Matlab

242

En la figura D.1. se pretende describir cómo se ha utilizado esta comunicación entre los programas. Primero en Visual Basic se obtienen los datos referentes a la cromatografía. Se construye una matriz con los TIC’s de las sustancias analizadas y esta matriz se traslada a un workspace de Matlab. A partir de esta matriz se calcula el vector de desplazamientos. Este vector se devuelve al programa en Visual Basic y se utiliza para construir la matriz con los datos alineados.

En el caso de la función quitaceros, se aplica a matrices que se han trasladado al workspace de Matlab. Para poder aplicar el algoritmo de PCA se deben proporcionar matrices que no contengan columnas formadas en su totalidad por ceros. Si no es así se produce un error y es imposible obtener resultados. Por este motivo se tiene que hacer un acondicionamiento de las matrices trasladadas al workspace de Matlab antes de aplicarles el algoritmo de PCA. Se decidió desarrollar la función que elimina las columnas formadas por ceros porque resultaba más sencillo. Matlab es un programa pensado para trabajar con matrices y por eso resultaba más complicado desarrollar esta función en Visual Basic.

En los siguientes apartados se muestra el código de ambas funciones.

Anexo D : Funciones de soporte en Matlab

243

D.2 Función “quitaceros.m”.

function [matriz_sinceros,variables_sinceros] = quitaceros (matriz , variables)

% Esta funcion elimina las columnas que estan compuestas solamente por

% ceros en la matriz de entrada. Se aplicara en las matrices de

% INTENSIDADES y VARIABLES antes de cargarlas en el pcagui porque las

% columnas compuestas por ceros provocan un error de calculo en el

% algoritmo al calcula la PCA.

% Esta funcion va mirando cada elemento de cada columna de la matriz de

% entrada (matriz) y en el momento en que encuentra un elemento

% diferente de cero guarda toda la columna en la matriz:

% matriz_sinceros. Cuando ha guardado la columna se sale del bucle

% mediante la funcion break.

% De esta forma se guardan todas las columnas que contienen algun

% elemento diferente de cero y se desechan las que estan compuestas

% en su totalidad por ceros. Finalmente la matriz_sinceros contendra

% los mismos datos sin columnas-cero. De la misma forma se guardan los

% nombres de las variables que corresponden a los datos guardados en

% matriz_sinceros, en la matriz: variables_sinceros

[filas,columnas] = size (matriz);

for c = 1:columnas,

for f = 1:filas,

if matriz(f,c) ~= 0

if exist('matriz_sinceros') == 0

matriz_sinceros = matriz(:,c);

variables_sinceros = variables(c,:);

else

matriz_sinceros = [matriz_sinceros,matriz(:,c)];

variables_sinceros = [variables_sinceros;variables(c,:)];

end

break

end

end

end

Anexo D : Funciones de soporte en Matlab

244

D.3. Función “ObtenerDesplazamiento.m”.

function [despla] = ObtenerDesplazamiento (tic,referencia)

% Esta funcion se utiliza para obtener el vector de desplazamiento

% de las diferentes sustancias a analizar.

% Resulta mas facil obtener esta informacion en Matlab utilizando

% la funcion de correlacion cruzada crosscorr que calcularlo en el

% entorno de visual basic.

% Por este motivo se traslada la informacion de los TICs de las sus-

% tancias a analizar a un workspace de Matlab. A partir de la matriz

% de TICs se calculara un vector (despla) con tantos elementos como

% sustancias hay en el estudio. Cada elemento indica el desplaza-

% miento de la sustancia con respecto a una sustancia de referencia

% (cuyo valor de desplazamiento logicamente sera cero).

%

% Ver tambien informacion sobre "crosscorr".

[filas,columnas] = size(tic);

for i = 1:filas,

[XCF,Lags,Bound] = crosscorr(tic(referencia,:),tic(i,:));

[x,y]=max(XCF);

despla(i) = Lags(y);

end

ANEXO E: Manual de usuario

247

Anexo E: Manual de usuario.

E.1. Introducción.

E.1.1. Comunicación IDAMAT-Software del analizador.

E.1.2. Datos obtenidos del GCMSSolution.

E.1.3. Almacenamiento de los datos en formatos accesibles.

E.2. Instalación.

E.3. Interfaz.

E.3.1. Pantalla de inicio.

E.3.2. Pantalla para crear ficheros de texto.

E.3.3. Pantalla para crear graficos 3D.

E.3.4. Pantalla para calcular PCA’s.

E.4. Uso del programa.

E.4.1. Seleccionar una carpeta de trabajo.

E.4.2. Visualizar datos en gráficos 3D.

E.4.3. Crear ficheros de texto.

E.4.4. Crear matrices en Matlab.

E.4.5. Utilizar pcagui para calcular las PCA’s de las matrices.

E.4.6. Guardar datos en un workspace de Matlab.

Anexo E: Manual de usuario.

249

E.1. Introducción.

E.1.1. Comunicación entre el software del analizador y el programa IDAMAT.

El programa IDAMAT es un programa que se desarrolló para dar respuesta a una serie de necesidades del grupo de investigación de sensores de gases y nariz electrónica de la Universidad Rovira i Virgili. Este grupo de investigación adquirió un sistema de análisis cromatografía de gases y espectrometría de masas para continuar con su línea de investigación. Pero pronto se pusieron de manifiesto las carencias del software del equipo en lo que se refiere a la flexibilidad en el tratamiento de los datos obtenidos.

El cometido de este programa consiste en la obtención de todos los datos relevantes adquiridos en los análisis realizados con el GC-MS. El programa IDAMAT se comunica con el GCMSSolution que es el software propio del analizador GC-MS SHIMADZU.

Concretamente el GCMSSolution almacena los datos en unos ficheros de extensión “*.qgd”. Cada uno de estos ficheros dispone de toda la información referente al análisis realizado a una sustancia concreta con el analizador GC-MS.

Los ficheros de datos del GCMSSolution disponen de una interfaz de automatización1. Esta interfaz permitirá comunicarse con el fichero *.qgd y obtener los datos que se necesitan. De esta forma se establece una comunicación entre el programa IDAMAT y el software del analizador.

Figura E.1. Diagrama de comunicación entre GCMSSolution-IDAMAT

El usuario del programa IDAMAT podrá indicar unos parámetros que definirán los rangos de los datos que se desea obtener y el programa solicitará estos datos al fichero *.qgd del GCMSSolution. Como el usuario puede limitar desde un principio el rango de datos, se puede reducir de forma considerable el volumen de datos con que se va a trabajar. Hay que tener en cuenta que el volumen de datos con que se va a tratar es muy grande. Preseleccionando los datos de relevancia, se reduce tiempo de ejecución de algoritmos que se aplicarán y se evitan problemas por falta de memoria.

El tipo de comunicación que se establece entre los dos programas es un tipo de protocolo COM (Component Object Model). Para más información sobre este protocolo ver el Ánexo C de la memoria.

1 Automatización es un protocolo estándar de comunicación entre programas. Ver anéxo C.

SOFTWARE

DEL ANALIZADOR

GC-MS

Interfaz

de

automatización

IDAMAT

Anexo E: Manual de usuario.

250

E.1.2. Datos obtenidos del GCMSSolution.

Antes de empezar a explicar el funcionamiento del programa IDAMAT es necesario explicar brevemente qué datos se obtienen del software del analizador y cómo están ordenados estos datos.

El analizador QP-5000 de SHIMADZU puede realizar análisis de espectrometría de masas1 y de cromatografía de gases1. Los datos que se obtendrán desde el programa IDAMAT serán referentes a los cromatogramas y espectrogramas obtenidos en los análisis.

Los datos de espectrometría componen un espacio de tres dimensiones dado que se obtiene un espectrograma, cuya información está compuesta por dos dimensiones, para cada instante de tiempo de análisis o scan. Por este motivo los datos se podrán visualizar en un eje de tres dimensiones en una de las herramientas del programa IDAMAT.

Un espectrograma proporciona información de dos variables: masa atómica e intensidad. A continuación se puede ver un ejemplo de espectrograma para un instante de tiempo determinado:

Figura E.2. Ejemplo de un espectrograma.

En el eje de ordenadas se indica la intensidad y en el de abcisas las masas atómicas. La intensidad indica el número de impactos de los iones que ha registrado el cromatógrafo. Por lo tanto cuanto mayor sea la cantidad de una masa determinada en la sustancia a analizar, mayor será el número de impactos y en consecuencia el pico del espectrograma correspondiente a esa masa atómica será mayor. En el ejemplo se puede observar que se ha detectado la presencia de las masas 41, 42, 43, 55, entre otras. La mayor intensidad se da para la masa 43. Este espectrograma es para el scan 206 que corresponde al minuto 1.717. La espectrometría de una sustancia estará constituida por tantos espectrogramas como scans haya en todo el tiempo de análisis. Por lo tanto todos los datos de espectrometría están relacionados entre sí en un espacio de 3 dimensiones en el que el eje X serían las masas, el eje Y sería el tiempo y el eje Z serían las intensidades detectadas por el GCMS. En la siguiente figura se puede observar un ejemplo de un gráfico de 3 dimensiones con todos los datos referentes a la espectrometría:

1 Para más información sobre espectrometría de masas y cromatografía de gases ver el anexo G.

Anexo E: Manual de usuario.

251

Figura E.3. Ejemplo de datos 3D de espectrometría de una sustancia determinada.

Un cromatograma presenta los datos de la cromatografía. En el cromatograma se representa el TIC (Total Ion Chromatography) con respecto al tiempo. El TIC es la suma de todas las intensidades de las masas para un instante de tiempo. Por lo tanto para cada instante de tiempo de análisis (scan) se tiene un valor de TIC o intensidad que es la totalidad de impactos de todos los iones registrados por el GCMS. El cromatograma es un gráfico de dos dimensiones intensidad-tiempo ya que se pierde la dimensión de las masas vista anteriormente. A continuación se puede ver un ejemplo de TIC:

Figura E.4. Ejemplo de un cromatograma.

Anexo E: Manual de usuario.

252

E.1.3. Almacenamiento de los datos en formato flexible.

Una vez obtenidos los datos de cromatografía o espectrometría el programa IDAMAT puede almacenarlos para su posterior tratamiento. El usuario puede escoger de entre dos opciones la que más le convenga: puede guardar los datos en un fichero de texto (nombrefichero.txt) o puede guardar los datos como matrices en un workspace de Matlab. Esta última opción permitirá posteriores tratamiento de los datos en el propio workspace de Matlab tales como PCA o “fuzzy logic”.

Figura E.5. Almacenamiento de los datos en diferentes formatos.

E.2. Instalación.

El programa IDAMAT ha sido desarrollado en Visual Basic 6.0. Debido a su interacción con Matlab ha sido necesario desarrollar dos funciones en este programa: ObtenerDesplazamiento.m y quitaceros.m. Por este motivo se incluyen en un fichero zip autoextraíble las dos funciones programadas en Matlab junto con el programa IDAMAT:

Figura E.6. Fichero autoextraíble para instalación.

Cuando se hace doble click sobre el icono Instalar_IDAMAT.exe el sistema pregunta por la carpeta donde se desea que sean extraídos los ficheros. El usuario podrá seleccionar la carpeta donde se extraerán los ficheros :

• IDAMAT.exe

• ObtenerDesplazamiento.m

• quitaceros.m

IDAMAT

Ficheros de texto con los datos de espectrometría o cromatografía

Workspace con las matrices de datos de espectrometría o cromatografía.

Anexo E: Manual de usuario.

253

Una vez se han extraído los ficheros a la carpeta seleccionada, las funciones de Matlab ObtenerDesplazamiento.m y quitaceros.m se deben incluir en alguna carpeta que esté registrada entre los directorios de búsqueda del Matlab. El usuario puede hacerlo de dos formas:

• Puede registrar el directorio donde se han extraído las dos funciones de Matlab como directorios donde Matlab debe realizar la búsqueda. Para ello deber abrir Matlab y en “Fileà Set Path...” debe seleccionar la carpeta donde se extrajeron las funciones.

• También se puede, simplemente, mover los dos ficheros de las funciones a una carpeta de Matlab como por ejemplo el directorio work: C:\MATLAB6p5\work.

NOTA IMPORTANTE:

Para que sea posible obtener los datos del GCMSSolution mediante el programa IDAMAT, debe haber sido instalada previamente en el pc la versión 2 del software GCMSSolution. De esta forma se podrán obtener los datos de los ficheros *.qgd y guardarlos en ficheros de texto convencionales.

Actualmente la versión del GCMSSolution instalada en el pc que está conectado al analizador QP-5000 GCMS de Shimadzu es inferior a la versión 2. No se ha conseguido comunicar el programa IDAMAT con la versión 1 del GCMSSolution. Por lo visto esta versión del GCMSSolution carece de una interfaz de automatización que le permita comunicarse con otros programas. Por el momento, la solución adoptada ha sido la de trasladar los ficheros de datos *.qgd obtenidos mediante el analizador a otro pc donde se encuentre instalada la versión 2 del GCMSSolution.

Para que las funciones del programa IDAMAT relacionadas con Matlab como son la generación de gráficos 3D, el almacenamiento de datos en workspace de Matlab o el cálculo de PCA’s (Principal Components Analysis) puedan funcionar correctamente se debe haber instalado previamente en el pc la versión 6.5 de Matlab o una versión superior.

Anexo E: Manual de usuario.

254

E.3. Interfaz.

Las diferentes herramientas de que dispone el programa IDAMAT están distribuidas en una serie de pantallas que constituyen la interfaz gráfica. Éstas han sido diseñadas para que sean fáciles de utilizar y su funcionamiento sea intuitivo.

E.3.1. Pantalla de inicio.

Cuando el usuario inicia el programa IDAMAT aparece la pantalla de inicio donde han incluido explicaciones sobre el funcionamiento del programa. En la figura siguiente se puede ver la pantalla de inicio del programa:

Figura E.7. Pantalla de inicio del programa IDAMAT.

1. Cuadro de texto donde se indica el path de la carpeta de trabajo en la que se encuentran los ficheros de datos *.qgd. Pulsando el botón “Examinar...” se abre un cuadro de dialogo de “Buscar carpeta”. El usuario puede seleccionar a través de este cuadro de dialogo la carpeta donde se encuentran los ficheros del GCMSSolution que contienen los datos que se desea obtener.

Anexo E: Manual de usuario.

255

2. Lista de los ficheros de texto *.qgd de la carpeta seleccionada. En este cuadro de lista se mostrarán todos los ficheros de datos del GCMSSolution que se encuentran en la carpeta seleccionada.

3. Botón de navegación que lleva a la pantalla donde se pueden generar ficheros de texto (*.txt) a partir de los datos de los ficheros del GCMSSolutions seleccionados.

4. Botón de navegación que lleva a la pantalla donde se pueden generar gráficos en 3 dimensiones. En esta pantalla, como se verá más adelante en este manual, se puede seleccionar un fichero *.qgd que contiene todos los datos referentes a una sustancia determinada. Una vez seleccionada la sustancia se podrá generar un gráfico 3D con los datos de espectrometría correspondientes a dicha sustancia.

5. Botón de navegación que lleva a la pantalla donde se pueden generar matrices con datos de espectrometría o cromatografía y trasladarlas a un workspace de Matlab. También se podrá iniciar desde esta pantalla una herramienta propia de Matlab que permite generar PCA’s con los ficheros *.qgd seleccionados.

E.3.2. Pantalla para crear ficheros de texto.

En la siguiente figura se muestra la pantalla del programa donde se pueden generar los ficheros de texto con la información de los ficheros *.qgd seleccionados previamente. A esta pantalla se accede mediante el navegador visto anteriormente en la pantalla de inicio:

Figura E.8. Pantalla para generar ficheros de texto.

Anexo E: Manual de usuario.

256

1. Cuadro de lista donde se muestran los ficheros de datos del GCMSSolution seleccionados de los cuales se guardarán los datos en los ficheros de texto.

2. Botones para eliminar algún fichero que no se desee incluir en los ficheros de texto que se van a crear y para volver a listar todos los ficheros de la carpeta.

3. Botones de selección. Según se elija cromatografía o espectrometría apareceran los controles (botones y cajas de texto) relacionados con una elección u otra.

4. Cajas de texto donde el usuario puede introducir el intervalo del cual desea obtener los datos.

5. Cajas de texto para que el usuario introduzca los nombres de los ficheros de texto que se van a crear. El primer nombre introducido corresponderá al fichero donde se guardarán las intensidades. El segundo nombre deberá ser el del fichero donde se guardarán los nombres de las variables que indicarán la masa y el número de scan. Por último, en la tercera caja de texto, el usuario introducirá el nombre del fichero donde desea guardar los nombres de los objetos (sustancias analizadas) que coincide con los nombres de los ficheros de datos del GCMSSolution.

6. Botón con el que el usuario da la orden de crear los ficheros de texto una vez se han introducido todos los datos necesarios en las diferentes cajas de texto de la pantalla.

A.3.3. Pantalla para crear graficos 3D.

Figura E.9. Pantalla para generar los ficheros 3D con los datos de la espectrometría de una sustancia determinada.

Anexo E: Manual de usuario.

257

1. Cuadro de lista donde se muestran los ficheros de datos del GCMSSolution seleccionados de los cuales se guardarán los datos en los ficheros de texto. El usuario puede seleccionar un fichero de la lista haciendo doble click sobre él. De esta forma el path completo del fichero queda registrado en la caja de texto del fichero seleccionado.

2. Botón para seleccionar el fichero de la lista del cual se va a generar el gráfico 3D. Al pulsar este botón el path completo del fichero queda registrado en la caja de texto del fichero seleccionado.

3. Caja de texto donde queda registrado el path completo del fichero del que se quiere generar el gráfico 3D.

4. Cajas de texto donde el usuario debe introducir los intervalos de tiempo (scans) y masas que definan el espacio 3D que se quiere visualizar.

5. Botón para generar el gráfico 3D con los datos de espectrometría de la sustancia previamente seleccionada.

6. Caja de texto donde se visualizarán los posibles errores que puedan tener lugar en el workspace de matlab donde se genera el gráfico 3D.

7. Botón que abre el cuadro de dialogo “guardar como...” para que el usuario introduzca el nombre del fichero con extensión “*.mat” donde se guardará el workspace que contiene los datos relacionados con el gráfico 3D.

8. Botón de navegación para volver a la pantalla de inicio.

E.3.4. Pantalla para calcular PCA’s.

En la siguiente figura se muestra la pantalla del programa donde se pueden generar diferentes matrices con los datos de espectrometría o cromatografía. Estas matrices se mantendrán en un workspace de Matlab, hasta que el usuario cierre el programa o decida guardarlas en un fichero *.mat.

El usuario también podrá iniciar una herramienta propia del Matlab: PCAGUI que es una interfaz gráfica para calcular PCA’s. De esta manera se podrán calcular las PCA’s de las matrices generadas a partir de la información solicitada por el usuario.

Una pantalla mostrará cualquier mensaje de error que se genere en el workspace de Matlab para poder, así, detectar posibles errores que puedan tener lugar.

Anexo E: Manual de usuario.

258

Figura E.10. Pantalla para generar matrices y PCA’s de los datos de intensidades de las sustancias.

1. Cuadro de lista donde se muestran los ficheros de datos del GCMSSolution seleccionados de los cuales se guardarán los datos en los ficheros de texto. El usuario puede seleccionar un fichero de la lista haciendo doble click sobre él. De esta forma el path completo del fichero queda registrado en la caja de texto del fichero seleccionado.

2. Botones para eliminar algún fichero que no se desee incluir en los ficheros de texto que se van a crear y para volver a listar todos los ficheros de la carpeta.

3. Botones de selección. Según se elija cromatografía o espectrometría apareceran los controles (botones y cajas de texto) relacionados con una elección u otra.

4. Cajas de texto donde el usuario puede introducir el intervalo del cual desea obtener los datos. En este caso se muestra la pantalla con la opción de espectrometría seleccionado por lo que los intervalos que el usuario puede seleccionar corresponden al tiempo (scans) y a las masas.

5. Botones para crear las matrices con los datos de espectrometría pero si el alineamiento realizado a estos datos. Una vez generadas, las matrices se mantendrán en un workspace de Matlab. Los datos se perderán una vez el usuario cierre el programa IDAMAT, a no ser que previamente haya salvado el workspace.

6. Caja de texto donde se registra la sustancia que se va a tomar como referencia para realizar el alineamiento de todas las restantes. El usuario puede escribir el nombre de una de las sustancias que figure en el listado (1) o también puede hacer doble click sobre la sustancia seleccionada en la lista y automáticamente el nombre de la sustancia quedará registrado en esta caja de texto.

Anexo E: Manual de usuario.

259

7. Botones para crear las matrices con los datos de espectrometría alineados. Los datos se alinearán con respecto a la sustancia que previamente se haya indicado en la caja de texto de la muestra de referencia. Se pueden observar que hay dos botones. Uno crea la matriz con los valores absolutos de intensidad y el otro con los valores relativos.

8. Caja de texto donde se mostrarán los mensajes de error que se puedan generar en el workspace de Matlab cuando se generan las matrices de datos.

9. Botón para arrancar la herramienta de Matlaba: PCAGUI. Es una interfaz gráfica con la que el usuario podrá crear las PCA’s de los datos generados.

10. Botón que abre un cuadro de dialogo estándar de windows con el que se podrá guardar todos los datos generados hasta el momento en un fichero *.mat .

11. Botón de navegación para volver a la pantalla de inicio.

Anexo E: Manual de usuario.

260

E.4. Uso del programa.

En los siguientes apartados se explicarán, mediante ejemplos, paso a paso y a modo

de tutorial, las diferentes herramientas y opciones que tiene el programa IDAMAT.

E.4.1. Seleccionar una carpeta de trabajo.

El primer paso para utilizar el programa es indicar la carpeta de trabajo. La carpeta de trabajo es la carpeta donde se encuentran los ficheros de datos del GCMSSolution que son objeto de estudio. El usuario debe pulsar el botón de “Examinar...” y aparecerá el cuadro de diálogo estándar de windows de “Buscar carpeta” y podrá seleccionar la carpeta donde se encuentran los ficheros *.qgd.

Figura E.11. Selección de la carpeta de trabajo.

En cuanto el usuario pulsa el botón de aceptar, quedará registrado el nombre de la carpeta de trabajo en la caja de texto. En el cuadro de lista inferior se mostrarán todos los archivos de datos del GCMSSolution que contiene dicha carpeta. También, y para que sirve de comprobación para el usuario, se muestra un mensaje con el número de ficheros de datos que contiene la carpeta.

Anexo E: Manual de usuario.

261

Figura E.12. Datos mostrados al seleccionar la carpeta de trabajo.

En la parte inferior de la pantalla se pueden observar los 3 botones de navegación que llevan a diferentes pantallas del programa. Junto a cada uno de ellos hay una explicación sobre la función de cada pantalla.

En cada una de las tres pantallas a las que se puede acceder mediante los tres botones de navegación hay un cuadro de lista como el que se muestra en la pantalla de inicio. En el momento en que se selecciona la carpeta de trabajo, los cuadros de lista de todas las pantallas se actualizan con los nombres de los archivos *.qgd que contiene. También en cada una de las tres pantallas (Texto, Gráficos y PCA) se muestra una etiqueta con el path completo de la carpeta de trabajo actual.

La carpeta de trabajo sólo se podrá cambiar desde la pantalla de inicio y de la forma que se ha explicado. Si el usuario desea cambiar a una nueva carpeta de trabajo deberá hacerlo de la misma forma. En el momento en que se detecte que la carpeta de trabajo ha cambiado los cuadros de lista de todas las pantallas se actualizarán con la información de la nueva carpeta de trabajo.

Anexo E: Manual de usuario.

262

E.4.2. Visualizar datos en gráficos 3D.

Mediante los gráficos 3D el usuario puede realizar un análisis preeliminar de los datos con los que se va a trabajar. Inspeccionando visualmente los gráficos 3D se puede determinar los intervalos donde se encuentra la información relevante para un posterior análisis más exhaustivo. De esta forma se puede reducir desde un principio el volumen de información a tratar y reducir considerablemente el tiempo de análisis posterior.

A través del botón de navegación Gráficos se puede acceder a la pantalla donde se podrán generar gráficos 3D con los datos de espectrometría de las diferentes sustancias.

El usuario debe seleccionar uno de los ficheros que se muestra en la lista y que corresponde a una de las sustancias analizadas. Hay 2 formas de hacerlo: doble click en la sustancia o seleccionarla en el cuadro de lista y pulsar el botón “Pulsa para seleccionar el fichero escogido”. El path completo del archivo *.qgd quedará registrado en la caja de texto correspondiente.

Una vez registrado el path completo del archivo se deben introducir los límites de los intervalos de datos que se deseen visualizar en el gráfico. El usuario deberá introducir los límites inferior y superior para el intervalo de tiempo (scans) y para el intervalo de masas. En la figura siguiente se puede ver un ejemplo con todos los datos necesarios para generar el gráfico 3D introducidos:

Figura E.13. Datos introducidos para generar un gráfico 3D de una sustancia determinada.

Anexo E: Manual de usuario.

263

Ahora se puede generar el gráfico 3D pulsando el botón “Generar gráfico 3D...”. El programa IDAMAT obtendrá los datos del GCMSSolution para generar el gráfico y utilizará la herramienta gráfica de Matlab para presentarlo por pantalla. El resultado obtenido es el siguiente:

Figura E.14. Gráfico 3D de la sustancia 09a2.

Debido a la gran cantidad de datos que contiene el gráfico 3D generado es complicado interpretar la información que aporta, como se puede apreciar en la figura E.14. Por ello es recomendable realizar una serie de ajustes en las opciones del gráfico que proporciona Matlab:

En el menú Edit seleccionamos la opción Figure Properties.... Aparecerá el editor de las propiedades de la figura que corresponde al gráfico generado. En la parte superior del editor hay un cuadro de texto con la etiqueta Edit Properties for: . En este cuadro seleccionamos la opción surface: y de entre las nuevas pestañas que aparecen seleccionamos la de nombre Marker/Edges. En esta pestaña hay un cuadro de texto con la etiqueta Edge style. En este cuadro seleccionamos la opción “Column lines only (column)”:

Anexo E: Manual de usuario.

264

Figura E.15. Editor de propiedades de gráficos de Matlab.

Posteriormente se puede rotar el gráfico sobre el eje Z unos 90º a la izquierda para situar los ejes en una posición más intuitiva. Con estas modificaciones se obtiene el gráfico 3D de la figura E.16. en el que se puede apreciar mejor la información aportada:

El eje X corresponde a las masas. Será un array con todas las masas incluidas en los datos seleccionados previamente.

El eje Y corresponde a los scans, o lo que es lo mismo al tiempo. Corresponde a un array con todos los valores de scans incluidos en el intervalo indicado anteriormente.

El eje Z corresponde al valor de intensidades detectadas por el analizador para cada masa y instante de tiempo de análisis (scan). Los valores Z constituyen una matriz de 2 dimensiones que contiene las intensidades para una masa y un tiempo concretos.

Anexo E: Manual de usuario.

265

Figura E.16. Gráfico 3D con pequeños ajustes realizados para visualizar mejor la información.

E.4.3. Crear ficheros de texto.

Pulsando el botón de navegación Texto de la pantalla de inicio se accede a la pantalla de IDAMAT donde se pueden crear ficheros de texto. En esta pantalla aparecerá el path completo de la carpeta de trabajo. También aparecerán, en el cuadro de lista, todos los ficheros *.qgd que contiene la carpeta de trabajo.

En la figura E.17., se puede apreciar que ,junto al cuadro de lista donde se muestran los ficheros *.qgd, hay dos botones con las siguientes etiquetas: Listar todos los ficheros de la carpeta y Pulsa para excluir un fichero de la lista. El segundo botón sirve para eliminar los archivos *.qgd que no se desee incluir en los ficheros de texto que se van a crear. Si, por ejemplo, ha existido un error en el momento de inyectar la muestra en el analizador y los resultados obtenidos no son buenos, puede interesar al usuario eliminar este análisis del estudio que se va a realizar. Con el primer botón se puede volver a listar todos los ficheros de la carpeta de trabajo si finalmente se decide incluir en el estudio el fichero que ha sido eliminado o si, por error, se ha eliminado de la lista un fichero que no se deseaba eliminar. En la parte inferior del cuadro de lista se indica el número total de ficheros seleccionados. Se puede observar como este número varía cuando se elimina algún archivo.

Anexo E: Manual de usuario.

266

Una vez el usuario ha seleccionado los archivos que van a ser objeto de estudio tiene la opción de escoger entre generar los ficheros de texto con los datos de cromatografía o con los datos de espectrometría. Cuando se selecciona una u otra opción aparecen los controles (cuadros de texto y botones) que son necesarios para introducir los datos que el programa necesita.

En las figuras E.17. y E.18 se puede observar que al escoger la opción de cromatografía no aparecen los cuadros de texto para introducir los límites para los intervalos de masas que, sin embargo, sí aparecen si se selecciona la opción de espectrometría. Como la cromatografía sólo constituye un espacio de dos dimensiones (intensidad-tiempo) sólo hay que introducir el intervalo de tiempo (scans) y no son necesarios los intervalos de masas. El programa se ha realizado de esta forma por que así se espera disminuir los errores por parte del usuario en el momento de introducir los datos. Además se presentan en pantalla un número menor de controles por lo que la presentación en pantalla resulta más clara.

Finalmente el usuario debe introducir los nombres de los ficheros de texto que se generarán: uno contendrá las intensidades, otro los nombres de las variables que indican la masa y el scan a los que corresponde cada valor de intensidad y el tercero los nombres de las sustancias que se han tomado del cuadro de lista. Junto a cada cuadro de texto hay un botón que abre un cuadro de diálogo de windows del tipo Guardar como... para facilitar al usuario la introducción del path completo de los ficheros que se van a crea.

Sólo resta ya, pulsar el botón para crear los ficheros. En la figura E.18. se puede observar que escogiendo la opción de espectrometría el usuario puede crear los ficheros con intensidades absolutas o relativas según pulse uno u otro botón.

Figura E.17. Generación de los ficheros de texto con la información solicitada de la cromatografía.

Anexo E: Manual de usuario.

267

Figura E.18. Generación de los ficheros de texto con la información solicitada de la espectrometría.

E.4.4. Crear Matrices en Matlab.

E.4.4.1. Cromatografía.

El programa IDAMAT dispone de herramientas para realizar un análisis previo de los datos seleccionados. Concretamente utiliza herramientas de Matlab para esta función. El primer paso para realizar un análisis preeliminar de los datos recogidos es crear las matrices con los datos y colocarlas en un workspace de Matlab para poder hacer uso de la información que proporcionan. El usuario debe acceder a la pantalla donde están los botones para crear las matrices mediante el botón de navegación de la pantalla de inico “PCA”.

Como previamente se habrá seleccionado la carpeta de trabajo, los archivos *.qgd incluidos en ella aparecerán listados en el cuadro de lista de la pantalla. El usuario podrá eliminar de la lista los ficheros que considere oportuno. De esta forma la información que contienen no será tomada en cuenta cuando se construyan las matrices con los datos seleccionados.

Seleccionados ya los ficheros que van a ser objeto de estudio, se puede indicar si se desea la información referente a la cromatografía o por el contrario la referente a la espectrometría de los archivos seleccionados. Al igual que en el apartado anterior según la selección aparecerán los controles que corresponden a una u otra elección.

Anexo E: Manual de usuario.

268

Figura E.19. Generar matrices con datos de cromatografía en Matlab.

En la figura E.19. se pueden observar los límites (scan inicial y scan final) introducidos para definir los intervalos de tiempo de los cuales se desea obtener la información. El usuario debe introducir como mínimo un intervalo para que el programa pueda construir las matrices. Si no se introduce como mínimo un intervalo aparecerá un mensaje de aviso para el usuario.

Una vez introducidos los intervalos ya se puede proceder a pulsar el botón de crear matrices sin alinear. Se crearán 3 matrices: una con los datos de los TIC’s de todas las sustancias del cuadro de lista, otra matriz que contiene los nombres de las variables (que en este caso será el número de scan, por ejemplo “s125”) y por último la matriz que contiene los nombres de los objetos (sustancias analizadas). Estas matrices se guardan en un workspace de Matlab temporal. El usuario podrá visualizar los TIC’s sin alinear de las sustancias pulsando el botón “Plot TIC’s sin alinear”. Aparecerá una pantalla gráfica del Matlab en la que se mostrará todos los TIC’s.

El programa IDAMAT también realiza el alineamiento de los datos obtenidos en los análisis. Normalmente, en el momento de inyectar las muestras en el analizador se cometen errores inevitables. Es imposible inyectar siempre de la misma forma ya que se realiza de forma manual. Estos pequeños errores se ven reflejados en los datos mostrados. Para obtener mejores resultados en análisis posteriores de los datos en que se realizará la comparación de las sustancias entre ellas es necesario realizar un alineamiento de los datos.

En el programa se han incluido las opciones de obtener los TIC’s alineados y no alineados por separado para dar más flexibilidad al programa y para que el usuario pueda tener acceso a todos los datos, finales e intermedios, por si acaso lo necesita.

Anexo E: Manual de usuario.

269

En la figura E.20. se muestran los TIC’s de 10 sustancias sin haber realizado el alineamiento.

Figura E.20. Ejemplo TIC’s sin alinear.

Se puede observar cómo los puntos máximos de las diferentes curvas no coinciden exactamente en el mismo punto. Esto se puede apreciar con bastante claridad si se comparan las tres curvas inferiores.

Para obtener los datos de cromatografía alineados el primer paso es seleccionar la sustancia (objeto) que va a servir como referencia al alineamiento. Para ello el usuario debe escribir el nombre del archivo que corresponda a la sustancia seleccionada en el cuadro de texto que tiene la etiqueta “Muestra referencia alineamiento”. Se debe escribir el nombre del archivo completo, (incluida la extensión *.qgd) tal y como aparece en el listado superior. También se puede hacer doble click con el ratón sobre la sustancia seleccionada en el cuadro de lista superior y automáticamente aparecerá el nombre registrado en el cuadro de texto. Habiendo indicado ya la sustancia que va a servir como referencia para el alineamiento se puede pulsar el botón “Crear matrices cromatografía alineadas”. Estas matrices se guardarán en el workspace temporal de Matlab. Posteriormente se pueden visualizar las curvas correspondientes a los TIC’s alineados pulsando el botón “Plot TIC’s alineados”.

En la figura E.21. se pueden observar las curvas con los datos de la cromatografía ya alineados. Se aprecia claramente cómo los valores máximos de las curvas coinciden en el mismo instante de tiempo. Este tratamiento de los datos permite obtener resultados mejores en posteriores análisis.

Anexo E: Manual de usuario.

270

Figura E.21. Ejemplo TIC’s alineados.

E.4.4.2. Espectrometría.

El procedimiento para obtener las matrices con los datos de espectrometría sería similar al explicado anteriormente para las matrices con la información de la cromatografía.

Una vez seleccionados los archivos *.qgd se selecciona espectrometría en los comandos de opción. Además de los cuadros de texto para introducir los intervalos de tiempo (scans) aparecerán los intervalos de masas. Ahora, aparece una dimensión más: las masas atómicas. También se puede apreciar que los botones para crear las matrices de cromatografía desaparecen y aparecen los relacionados con la espectrometría. Con los datos de espectrometría se pueden crear 4 tipos de matrices:

§ Matrices con los datos sin alinear y con valores absolutos de intensidad.

§ Matrices con los datos sin alinear y con valores relativos de intensidad.

§ Matrices con los datos alineados y con valores absolutos de intensidad.

§ Matrices con los datos alineados y con valores relativos de intensidad.

Lógicamente para obtener los datos alineados es necesario definir previamente la sustancia respecto a la cual se va realizar la alineación.

Para obtener las matrices de datos existen cuatro botones(uno para cada matriz), como se puede comprobar en la figura E.22. en la que se muestra la pantalla PCA con la opción de espectrometría seleccionada y con todos los datos necesarios introducidos.

Anexo E: Manual de usuario.

271

Figura E.22. Generar matrices con datos de espectrometría en Matlab.

E.4.5. Utilizar pcagui para calcular las PCA’s de las matrices.

El software utilizado en el laboratorio para aplicar técnicas de tratamiento de señal a los datos obtenidos de los análisis de espectrometría de masas y cromatografía de gases es el Matlab. Por este motivo se ha comunicado el programa IDAMAT con Matlab. En primer lugar, como se ha visto, se trasladan los datos obtenidos a un workspace de Matlab en forma de matrices. Además de llevar estos datos a Matlab, ahorrando al usuario este trabajo, que en algunas situaciones puede resultar complicado, también se utilizan herramientas propias de éste. En el programa IDAMAT se ha añadido la posibilidad de iniciar el pcagui. El pcagui (PCA Graphic User Interface) es una interfaz gráfica que permite aplicar el algoritmo PCA a los datos que se proporcionen sin necesidad de escribir comandos en modo texto en la ventana de comandos de Matlab.

Para iniciar el pcagui desde el programa IDAMAT solamente hay que pulsar el botón “iniciar PCAGUI” que se puede observar en la figura E.22.. Inmediatamente aparecerá la interfaz gráfica para calcular PCA’s (figura E.23.). El siguiente paso es cargar los datos para calcular la PCA. Estos datos, evidentemente, son las matrices que se han construido antes con los datos espectrometría y cromatografía.

Anexo E: Manual de usuario.

272

Figura E.24. PCAGUI:Interfaz gráfica de Matlab para el cálculo de PCA’s.

Para cargar los datos en el menú PCA_File se selecciona la opción Load Data. Aparecerá un cuadro de diálogo que muestra todas las matrices numéricas que existen actualmente en el workspace temporal que se crea. Se deberá escoger la matriz de la cual se desea calcular la PCA. También se tienen que cargar los nombres de las sustancias que son objeto del análisis para de esta forma saberlas diferenciar en la PCA una vez calculada. Para ello hay que seleccionar, en el menú PCA_File, la opción Load Labels à Sample. Posteriormente se debe seleccionar la opción mean center del menú PCA_Scale para obtener mejores resultados. A continuación se pulsa el botón calc de la pcagui y aparecen resultados numéricos obtenidos al aplicar el algoritmo PCA a los datos cargados tales como los componentes principales, la varianza...

Una vez calculada la PCA, sólo queda seleccionar el número de componentes principales con que se quiere ver el gráfico de la PCA. Normalmente, para análisis de química analítica se utilizan 2 componentes. Así pues, se obtendrá una gráfica de 2 dimensiones como resultado de la PCA. Se selecciona la línea de los 2 componentes principales y sólo queda pulsar el botón apply. El botón scores se volverá activo, para ver la gráfica de la PCA para dos componentes principales sólo hay que pulsar el botón. En la gráfica E.25 se puede observar la PCA obtenida. En el ejemplo de la figura se ha calculado la PCA para los datos de espectrometría alineados y con valores de intensidades relativas que es la opción con la que se obtienen mejores resultados ya que la diferenciación de las muestras es mayor.

Anexo E: Manual de usuario.

273

Figura E.25. PCA para datos de espectrometría alineados y con intensidades relativas.

E.4.6. Guardar datos en un workspace de Matlab.

Todas las matrices que se construyen en la pantalla PCA’s se guardan en un workspace temporal de Matlab. Si se cierra el programa IDAMAT o el workspace temporal todos los datos creados se perderán y el usuario deberá proceder de nuevo a la construcción de las matrices. Para evitar esto se ha incluido una opción en el programa para que el usuario pueda grabar el workspace temporal en un ficheros de extensión *.mat. De esta forma se pueden guardar los datos permanentemente. Esta opción se encuentra disponible en las dos pantallas del programa IDAMAT que interactúan con el programa Matlab. En ambas pantallas existe un botón con la etiqueta “Guardar workspace” en la parte inferior derecha. Cuando se pulsa ese botón aparece un cuadro de dialogo estándar de windows del tipo Guardar como... (figura E.26.). El usuario debe indicar la ubicación donde se guardará el fichero e introducir el nombre.

Anexo E: Manual de usuario.

274

Figura E.26. Guardar workspace.

BIBLIOGRAFÍA.

GCMSsolution Ver.2, OLE Automation Reference Manual

Fco. Javier Ceballos.Enciclopedia de Visual Basic.Madrid. RA-MA. 1996.

Fco. Javier Ceballos. Visual C++. Madrid. RA-MA. 1996.

MSDN, Microsoft Developer Network

Matlab 6.5 help 2002.

http://www.mathworks.com

http://www.elguille.info/vb/vb6/indice.htm

http://www.elguille.info/vb/vbQA.htm#qa08

http://www.elguille.info/vb/cursos_vb/BASICO/basico47.htm

http://support.microsoft.com/default.aspx?scid=kb;ZH-TW;256056

http://support.microsoft.com/default.aspx?scid=kb;ES;550479

http://msdn.microsoft.com/library/spa/default.asp?url=/library/SPA/vccore/html/_cor

e_automation_topics.asp

http://www.ugr.es/~quiored/espec/ms1.htm

http://es.geocities.com/r_vaquerizo/Manual_R9.htm

http://fisica.unav.es/~angel/matlab/matlab1.html#control

http://www.elguruprogramador.com.ar/zonas/ver.asp?cod=10

http://www.canalvisualbasic.net/

http://www.bradanovic.cl/pcasual/snipt.html

http://msdn.microsoft.com/

http://msdn.microsoft.com/library/default.asp?url=/library/en-

us/dv_vbcode/html/vbtskHowToSortArray.asp

http://geneura.ugr.es/~jmerelo/DegaX/activex.html