Tema 10 · Integració – MiniSuite Bioinformàtica
Introducció
Aquest tema integra tots els coneixements adquirits durant el trimestre en un projecte final individual. Construiràs una MiniSuite Bioinformàtica capaç de processar seqüències biològiques en format FASTA, calcular estadístiques, traduir ADN a proteïna, comparar seqüències i exportar informes complets.
Clau de l'èxit
Organitza el codi en mòduls independents (fitxers .c i .h) i utilitza totes les eines apreses: structs, punters, memòria dinàmica, fitxers, ordenació i processament de cadenes.
Objectius del Projecte
- Dissenyar una arquitectura modular amb structs i funcions
- Llegir fitxers FASTA amb múltiples seqüències
- Calcular estadístiques: longitud, percentatge GC, composició aminoacídica
- Traduir ADN a proteïna en els tres marcs de lectura
- Comparar seqüències i detectar mutacions
- Exportar un informe complet en fitxer de text
Arquitectura de la MiniSuite
El projecte s'organitza en diversos fitxers font i capçaleres per mantenir el codi net i reutilitzable:
| Fitxer | Contingut |
|---|---|
| proteina.h | Definició de la struct Proteina i capçaleres de funcions |
| fasta.h / fasta.c | Funcions per llegir i escriure fitxers FASTA |
| analisi.h / analisi.c | Càlcul d'estadístiques: GC, composició, traducció |
| comparacio.h / comparacio.c | Alineament, identitat, detecció de mutacions |
| informe.h / informe.c | Generació d'informes en fitxers de text |
| main.c | Programa principal amb menú interactiu |
Estructura de dades principal
La struct Proteina emmagatzema tota la informació rellevant d'una seqüència:
// proteina.h
#ifndef PROTEINA_H
#define PROTEINA_H
#define MAX_NOM 100
#define MAX_SEQ 10000
typedef struct {
char nom[MAX_NOM];
char sequencia_adn[MAX_SEQ];
char sequencia_proteina[MAX_SEQ/3];
int longitud_adn;
int longitud_proteina;
float gc_percent;
int freq_a, freq_c, freq_g, freq_t;
} Proteina;
// Funcions per inicialitzar i alliberar
Proteina* crear_proteina(const char *nom, const char *adn);
void alliberar_proteina(Proteina *p);
#endif
Mòdul de lectura FASTA
Funció per llegir múltiples seqüències d'un fitxer FASTA i retornar un array dinàmic de punters a Proteina:
// fasta.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "proteina.h"
Proteina** llegir_fasta(const char *nom_fitxer, int *num_proteines) {
FILE *f = fopen(nom_fitxer, "r");
if (!f) {
printf("Error: no s'ha pogut obrir %s\n", nom_fitxer);
return NULL;
}
// Array dinàmic de punters a Proteina
int capacitat = 10;
Proteina **llista = malloc(capacitat * sizeof(Proteina*));
*num_proteines = 0;
char linia[MAX_SEQ];
char nom_actual[MAX_NOM] = "";
char sequencia[MAX_SEQ] = "";
int llegint_seq = 0;
while (fgets(linia, MAX_SEQ, f)) {
linia[strcspn(linia, "\n")] = '\0'; // eliminar salt de línia
if (linia[0] == '>') {
// Si ja teníem una proteïna anterior, la guardem
if (llegint_seq && strlen(sequencia) > 0) {
llista[*num_proteines] = crear_proteina(nom_actual, sequencia);
(*num_proteines)++;
sequencia[0] = '\0';
}
strcpy(nom_actual, linia + 1); // saltar el '>'
llegint_seq = 1;
} else if (llegint_seq) {
strcat(sequencia, linia);
}
}
// Guardar l'última proteïna
if (llegint_seq && strlen(sequencia) > 0) {
llista[*num_proteines] = crear_proteina(nom_actual, sequencia);
(*num_proteines)++;
}
fclose(f);
return llista;
}
Programa principal
El main.c ofereix un menú interactiu per accedir a totes les funcionalitats:
// main.c (esquema del menú)
#include <stdio.h>
#include "proteina.h"
#include "fasta.h"
#include "analisi.h"
#include "comparacio.h"
#include "informe.h"
int main() {
Proteina **llista = NULL;
int num_prot = 0;
int opcio;
printf("=== MiniSuite Bioinformàtica ===\n");
printf("1. Carregar fitxer FASTA\n");
printf("2. Mostrar estadístiques\n");
printf("3. Traduir ADN a proteïna\n");
printf("4. Comparar dues proteïnes\n");
printf("5. Exportar informe\n");
printf("0. Sortir\n");
do {
printf("\nOpció: ");
scanf("%d", &opcio);
// switch amb crides a les funcions dels mòduls
} while (opcio != 0);
// Alliberar memòria
for (int i = 0; i < num_prot; i++)
alliberar_proteina(llista[i]);
free(llista);
return 0;
}
Checklist del Projecte Final
Exercicis previs al projecte
- Implementa la funció
crear_proteina()que reservi memòria dinàmica per a una nova proteïna i inicialitzi tots els seus camps. - Escriu el mòdul
analisi.camb funcions per calcular GC, freqüències i traduir ADN a proteïna utilitzant una taula completa del codi genètic. - Dissenya el format de l'informe de sortida: quines dades ha d'incloure i en quin ordre.
Projecte Final – MiniSuite Bioinformàtica
Construeix la suite completa amb els següents requisits:
- Importar FASTA: llegir un fitxer amb múltiples seqüències (capçaleres
>nom+ seqüència). - Estadístiques: per a cada proteïna, calcular longitud, %GC, composició aminoacídica i pes molecular aproximat.
- Traducció: convertir ADN a proteïna en els tres marcs de lectura i seleccionar l'ORF més llarg.
- Comparació: donar dues proteïnes, mostrar identitat, alineament visual i llista de mutacions.
- Exportar informe: generar un fitxer de text amb totes les dades anteriors en format llegible.
- Interfície: menú interactiu que permeti a l'usuari triar quina operació realitzar.
Famílies de gens per triar (cada alumne una diferent):