5 * Created by westcott on 11/4/09.
6 * Copyright 2009 Schloss Lab. All rights reserved.
10 #include "alignmentdb.h"
12 #include "suffixdb.hpp"
13 #include "blastdb.hpp"
16 /**************************************************************************************************/
17 AlignmentDB::AlignmentDB(string fastaFileName, string method, int kmerSize, float gapOpen, float gapExtend, float match, float misMatch){ // This assumes that the template database is in fasta format, may
18 try { // need to alter this in the future?
19 m = MothurOut::getInstance();
23 openInputFile(fastaFileName, fastaFile);
25 m->mothurOutEndLine();
26 m->mothurOut("Reading in the " + fastaFileName + " template sequences...\t"); cout.flush();
28 while (!fastaFile.eof()) {
29 Sequence temp(fastaFile); gobble(fastaFile);
31 if (m->control_pressed) { templateSequences.clear(); break; }
33 if (temp.getName() != "") {
34 templateSequences.push_back(temp);
36 if (temp.getUnaligned().length() > longest) { longest = temp.getUnaligned().length()+1; }
40 numSeqs = templateSequences.size();
43 //all of this is elsewhere already!
45 m->mothurOut("DONE.");
46 m->mothurOutEndLine(); cout.flush();
48 //in case you delete the seqs and then ask for them
49 emptySequence = Sequence();
50 emptySequence.setName("no_match");
51 emptySequence.setUnaligned("XXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
52 emptySequence.setAligned("XXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
54 bool needToGenerate = true;
56 if(method == "kmer") {
57 search = new KmerDB(fastaFileName, kmerSize);
59 kmerDBName = fastaFileName.substr(0,fastaFileName.find_last_of(".")+1) + char('0'+ kmerSize) + "mer";
60 ifstream kmerFileTest(kmerDBName.c_str());
62 if(kmerFileTest){ needToGenerate = false; }
64 else if(method == "suffix") { search = new SuffixDB(numSeqs); }
65 else if(method == "blast") { search = new BlastDB(gapOpen, gapExtend, match, misMatch); }
67 m->mothurOut(method + " is not a valid search option. I will run the command using kmer, ksize=8.");
68 m->mothurOutEndLine();
69 search = new KmerDB(fastaFileName, 8);
72 if (!(m->control_pressed)) {
74 //add sequences to search
75 for (int i = 0; i < templateSequences.size(); i++) {
76 search->addSequence(templateSequences[i]);
80 }else if ((method == "kmer") && (!needToGenerate)) {
81 ifstream kmerFileTest(kmerDBName.c_str());
82 search->readKmerDB(kmerFileTest);
85 search->setNumSeqs(numSeqs);
89 m->errorOut(e, "AlignmentDB", "AlignmentDB");
93 /**************************************************************************************************/
94 AlignmentDB::~AlignmentDB() { delete search; }
95 /**************************************************************************************************/
96 Sequence AlignmentDB::findClosestSequence(Sequence* seq) {
99 vector<int> spot = search->findClosestSequences(seq, 1);
101 if (spot.size() != 0) { return templateSequences[spot[0]]; }
102 else { return emptySequence; }
105 catch(exception& e) {
106 m->errorOut(e, "AlignmentDB", "findClosestSequence");
110 /**************************************************************************************************/