Projecte Final

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
Tota la informació d'una proteïna en una sola estructura

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;
}
Retorna un array de punters i el nombre de proteïnes llegides per referència

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;
}
Menú interactiu que crida les funcions dels mòduls

Checklist del Projecte Final

Lectura de fitxers FASTA
Càlcul de longitud de seqüències
Percentatge GC
Composició aminoacídica
Traducció ADN → proteïna
Comparació entre seqüències
Detecció de mutacions
Exportació d'informe

Exercicis previs al projecte

  1. Implementa la funció crear_proteina() que reservi memòria dinàmica per a una nova proteïna i inicialitzi tots els seus camps.
  2. Escriu el mòdul analisi.c amb funcions per calcular GC, freqüències i traduir ADN a proteïna utilitzant una taula completa del codi genètic.
  3. 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):

· Opsines· Hemoglobines· Citocrom P450 · Queratines· Tubulines· Actines · Aquaporines· Canals de sodi· Canals de potassi · GPCR· Integrines· Col·lagen · Insulina· p53· EGFR