DNA-sequences / src / sequentie.cc
sequentie.cc
Raw
#include "sequentie.h"

// Default constructor
Sequentie::Sequentie():
    data("") {
} // Sequentie::Sequentie

// Intialisatie constructor Sequentie
Sequentie::Sequentie(Sequentie const &sequentie):
    data(sequentie.data) {
} // Sequentie::Sequentie

// Intialisatie constructor string
Sequentie::Sequentie(std::string const &sequentie):
    data(sequentie) {
} // Sequentie::Sequentie

// Geeft de lengte van de Sequentieuentie in symbolen
int Sequentie::length() const {
    return data.size();
} // Sequentie::length

// Geeft char terug op positie post
char Sequentie::char_at(int const pos) const {
    return data[pos];
} // Sequentie::char_at

// Concateneert Sequentie met andere Sequentie
Sequentie Sequentie::concat(Sequentie const &other) const {
    return Sequentie(data + other.data);
} // Sequentie::concat

// Geeft een nieuwe Sequentieuentie met de symbolen [start, end)
Sequentie Sequentie::slice(int const start, int const eind) const {
    if(start > eind || start < 0 || eind > length()) {
        std::cerr << "Start en eind zitten niet binnen de grenzen van de sequentie." << std::endl;
        return Sequentie();
    } 
    return Sequentie(data.substr(start, eind - start));
} // Sequentie::slice

// Checkt of twee Sequentieuenties hetzelfde zijn en
// retourneert true als dat zo is, anders false
bool Sequentie::equal(Sequentie const &sequentie) const {
    if(data.compare(sequentie.data) == 0) {
        return true;
    }
    return false;
} // Sequentie::equal

// Voert de varianten in de meegegeven vector uit op de sequentie 
// en retourneerd het resultaat. Alleen voor de variant inversie moeten
// er aparte dingen gebeuren, de rest kan allemaal in eenzelfde 'algoritme'
Sequentie Sequentie::apply(std::vector<Variant const*> varianten) const {
    int vectorSize = varianten.size(); 
    Sequentie product(data); // Steeds het product na toepassing van een variant
    
    for(int k = 0; k < vectorSize; k++) {
        Variant const* var = varianten.at(k); // Hulppointer naar variant
        if(var->get_eind() > product.length()) {
            std::cerr << "Deze variant komt buiten de grenzen van de sequentie." << std::endl;
            return Sequentie();
        } // Checkt de grenzen van de variant
        Sequentie const prefix = product.slice(0, var->get_start());
        Sequentie const insert(var->get_inserted()); 
        Sequentie const suffix = product.slice(var->get_eind(), product.length()); 
        Sequentie temp = prefix.concat(insert); // prefix + insert
        if(var->get_type() == "inv") {
            Sequentie const inside = product.slice(var->get_start(), var->get_eind());
            std::string seq; // Hierin komt de reverse complement van inside
            for(int i = inside.length(); i >= 0; i--) {
                char symbol = inside.char_at(i);
                if(symbol == 'A') {
                    seq += 'T';
                }
                else if(symbol == 'T') {
                    seq += 'A';
                }
                else if(symbol == 'C') {
                    seq += 'G';
                }
                else if(symbol == 'G') {
                    seq += 'C';
                }
            } // Voegt per symbol van inside, van achter naar voren, het complement in seq
            temp = prefix.concat(Sequentie(seq)); // prefix + seq
        } // Inversie
        product = temp.concat(suffix); // temp + suffix
        delete var;
    } // Voert steeds de variant uit op de sequentie in product
    varianten.clear();
    return product;
} // Sequentie::apply

// Drukt de sequentie af
void Sequentie::drukAf() const {
    std::cout << data << std::endl;
} // Sequentie::drukAf