5 * Created by westcott on 2/12/10.
6 * Copyright 2010 Schloss Lab. All rights reserved.
10 #include "chimerarealigner.h"
11 #include "needlemanoverlap.hpp"
14 //***************************************************************************************************************
15 ChimeraReAligner::ChimeraReAligner(vector<Sequence*> t, int m, int mm) : match(m), misMatch(mm) { templateSeqs = t; }
16 //***************************************************************************************************************
17 ChimeraReAligner::~ChimeraReAligner() {}
18 //***************************************************************************************************************
19 void ChimeraReAligner::reAlign(Sequence* query, vector<results> parents) {
21 if (parents.size() != 0) {
22 vector<Sequence*> queryParts;
23 vector<Sequence*> parentParts; //queryParts[0] relates to parentParts[0]
25 string qAligned = query->getAligned();
28 //sort parents by region start
29 sort(parents.begin(), parents.end(), compareRegionStart);
31 //make sure you don't cutoff beginning of query
32 if (parents[0].nastRegionStart > 0) { newQuery += qAligned.substr(0, parents[0].nastRegionStart); }
34 //take query and break apart into pieces using breakpoints given by results of parents
35 for (int i = 0; i < parents.size(); i++) {
36 cout << parents[i].parent << '\t' << parents[i].nastRegionStart << '\t' << parents[i].nastRegionEnd << endl;
37 int length = parents[i].nastRegionEnd - parents[i].nastRegionStart;
38 string q = qAligned.substr(parents[i].nastRegionStart, length);
39 cout << "query = " << q << endl;
40 Sequence* queryFrag = new Sequence(query->getName(), q);
42 queryParts.push_back(queryFrag);
44 Sequence* parent = getSequence(parents[i].parent);
45 string p = parent->getAligned();
47 p = p.substr(parents[i].nastRegionStart, length);
48 cout << "parent = " << p << endl;
49 parent->setAligned(p);
51 parentParts.push_back(parent);
53 if (q.length() > longest) { longest = q.length(); }
54 if (p.length() > longest) { longest = p.length(); }
57 //align each peice to correct parent from results
58 for (int i = 0; i < queryParts.size(); i++) {
59 alignment = new NeedlemanOverlap(-2.0, match, misMatch, longest+1); //default gapopen, match, mismatch, longestbase
60 Nast nast(alignment, queryParts[i], parentParts[i]);
64 //recombine pieces to form new query sequence
65 for (int i = 0; i < queryParts.size(); i++) {
66 newQuery += queryParts[i]->getAligned();
70 //make sure you don't cutoff end of query
71 if (parents[parents.size()-1].nastRegionEnd < qAligned.length()) { newQuery += qAligned.substr(parents[parents.size()-1].nastRegionEnd); }
73 //set query to new aligned string
74 query->setAligned(newQuery);
77 for (int i = 0; i < queryParts.size(); i++) { delete queryParts[i]; }
78 for (int i = 0; i < parentParts.size(); i++) { delete parentParts[i]; }
80 } //else leave query alone, you have bigger problems...
84 errorOut(e, "ChimeraReAligner", "reAlign");
88 //***************************************************************************************************************
89 Sequence* ChimeraReAligner::getSequence(string name) {
93 //look through templateSeqs til you find it
95 for (int i = 0; i < templateSeqs.size(); i++) {
96 if (name == templateSeqs[i]->getName()) {
102 if(spot == -1) { mothurOut("Error: Could not find sequence."); mothurOutEndLine(); return NULL; }
104 temp = new Sequence(templateSeqs[spot]->getName(), templateSeqs[spot]->getAligned());
108 catch(exception& e) {
109 errorOut(e, "ChimeraReAligner", "getSequence");
113 //***************************************************************************************************************