int maxSubArray(vector<int>& nums) { if (nums.empty()) return 0; int res = nums[0]; int n = nums.size(); vector<int> maxD(n, 0); maxD[0] = nums[0]; for (int i = 1; i < n; ++i) { maxD[i] = max(maxD[i-1] + nums[i], nums[i]); res = max(res, maxD[i]); } return res; }
bool chkOvlR(string tempname,asmMerge & merge,int k,int j) { int D = abs(merge.ref_st[tempname][k] - merge.ref_end[tempname][k]) + abs(merge.ref_st[tempname][j] - merge.ref_end[tempname][j]); int d = maxD(merge.ref_st[tempname][k],merge.ref_end[tempname][k],merge.ref_st[tempname][j],merge.ref_end[tempname][j]); if(D>d) { return 1; } else { return 0; } }
bool chkOvlQ(string tempname,asmMerge & merge,int k,int j) { int D = abs(merge.q_st[tempname][k] - merge.q_end[tempname][k]) + abs (merge.q_st[tempname][j]-merge.q_end[tempname][j]); int d = maxD(merge.q_st[tempname][k],merge.q_end[tempname][k],merge.q_st[tempname][j],merge.q_end[tempname][j]); if(D>d) //when they overlap, sum of the two intervals would be bigger than the interval between the endpoints { return 1; } else { return 0; } }
void ctgJoiner(asmMerge & merge,asmMerge & merge1,fastaSeq & hybrid, fastaSeq & pbOnly, fastaSeq & merged) { string name,subseq,subseqR,indexL1,indexL2,seqHolder; vector<int> v1; //entry by michel // tempRef_st initalized and moved at second for-loop int begin_insrt = 1; for(map<string,vector<string> >::iterator it = merge1.lseq.begin(); it!=merge1.lseq.end();it++) // merge1.lseq is container for the contig names { name = it->first; begin_insrt = 1; for(unsigned int i=0;i<merge1.lseq[name].size();i++) { int q1_f = 0,q1_last = 0,q2_f = 0,q2_last = 0,r1_f = 0,r1_last = 0,r2_f = 0,r2_last = 0,tempRef_st = 0; if( i ==0 && (find(merge.q_name.begin(),merge.q_name.end(),merge1.lseq[name][i])!=merge.q_name.end()))//if first element is query { indexL2 = merge1.rseq[name][i]; // index name coresponding to the query element q2_f = merge.q_st[indexL2][0]; q2_last = merge.q_end[indexL2][merge.q_end[indexL2].size()-1]; if(q2_f > merge.q_end[indexL2][0]) // if query is reverse oriented { subseq = hybrid.seq[merge1.lseq[name][i]].substr(q2_f); //take q_f to the end of the sequence } if(q2_f < merge.q_end[indexL2][0]) // if query is forward oriented { if(merge.sideInfo[indexL2] == 'R') { subseq = hybrid.seq[merge1.lseq[name][i]].substr(0,q2_last); if(merge1.lseq[name][i] != merge1.lseq[name][merge1.lseq[name].size()-1]) //if the first and last element are not same { begin_insrt = -1; // this is experimental } } if((merge.sideInfo[indexL2] == 'L') || (merge1.lseq[name][0] == merge1.lseq[name][merge1.lseq[name].size()-1])) { subseq = hybrid.seq[merge1.lseq[name][i]].substr(0,q2_f); } } } if(i == 0 && (find(merge.r_name.begin(),merge.r_name.end(),merge1.lseq[name][i]) != merge.r_name.end())) // if first element is reference { indexL2 = merge1.rseq[name][i]; r2_last = merge.ref_end[indexL2][merge.ref_end[indexL2].size()-1]; r2_f = merge.ref_st[indexL2][0]; if(merge1.lseq[name][i] == name) { subseq = pbOnly.seq[merge1.lseq[name][i]].substr(0,r2_last); } if(merge1.lseq[name][i] != name) { if((merge.Ori[name][i] == 1) && (merge.Ori[name][i+1] == -1) && (merge.sideInfoQ[merge1.rseq[name][i]]=='R')) { subseq = pbOnly.seq[merge1.lseq[name][i]].substr(0,r2_last); } if(merge.Ori[name][i] == merge.Ori[name][i+1]) { subseq = pbOnly.seq[merge1.lseq[name][i]].substr(0,r2_last); } if((merge.Ori[name][i] == 1) && (merge.Ori[name][i+1] == -1) && (merge.sideInfoQ[merge1.rseq[name][i]]=='L')) { subseq = pbOnly.seq[merge1.lseq[name][i]].substr(r2_f,(merge.ref_len[indexL2] - r2_f)); begin_insrt = -1; } } } if(i > 0 && (find(merge.q_name.begin(),merge.q_name.end(),merge1.lseq[name][i])!=merge.q_name.end())) // if the element is query { indexL1 = merge1.rseq[name][i-1]; q1_f = merge.q_st[indexL1][0]; q1_last = merge.q_end[indexL1][merge.q_end[indexL1].size()-1]; if(i != (merge1.lseq[name].size()-1)) //if it isn't the last element { indexL2 = merge1.rseq[name][i]; q2_f = merge.q_st[indexL2][0]; q2_last = merge.q_end[indexL2][merge.q_end[indexL2].size() -1]; if(chkOvl(q1_f,q1_last,q2_f,q2_last) == 0) //alignments are non-overlapping { v1 = minD(q1_f,q1_last,q2_f,q2_last); int cheatF = min(v1[0],v1[1]); int cheatR = max(v1[0],v1[1]); subseq = hybrid.seq[merge1.lseq[name][i]].substr(cheatF,(cheatR-cheatF)); } if(chkOvl(q1_f,q1_last,q2_f,q2_last) == 1) // if alignments are overlapping { tempRef_st = mapQonRef(indexL1,indexL2,merge); subseq = ""; // may be add a single base if this causes segfault for revcom } } if( i == (merge1.lseq[name].size()-1)) // if this is the last element { if(merge.q_st[merge1.rseq[name][i-1]][0] > merge.q_end[merge1.rseq[name][i-1]][0]) // last element uses (i-1) th index. if query reverse oriented { subseq = hybrid.seq[merge1.lseq[name][i]].substr(0,q1_last); if((i>1) && (merge1.lseq[name][i] == merge1.lseq[name][i-2])) //if two queries for the reference are same { subseq = hybrid.seq[merge1.lseq[name][i]].substr(q1_f,(merge.q_len[merge1.rseq[name][i-1]] - q1_f)); } if(merge1.lseq[name][i] == merge1.lseq[name][0]) //if first element and last elements are same { subseq = hybrid.seq[merge1.lseq[name][i]].substr(0,q1_last); } } if(merge.q_st[merge1.rseq[name][i-1]][0] < merge.q_end[merge1.rseq[name][i-1]][0]) // if query is forward oriented { if(merge.sideInfo[merge1.rseq[name][i-1]] == 'L') { subseq = hybrid.seq[merge1.lseq[name][i]].substr(0,q1_f); } if(merge.sideInfo[merge1.rseq[name][i-1]] == 'R') { subseq = hybrid.seq[merge1.lseq[name][i]].substr(q1_last); } if(merge1.lseq[name][i] == merge1.lseq[name][0]) //if first element and last elements are same { subseq = hybrid.seq[merge1.lseq[name][i]].substr(q1_last); } } } if(merge.Ori[name][i] == -1) { subseqR = revCom(subseq); // if needs to be reverse complemented subseq = subseqR; } } if(i>0 && (find(merge.r_name.begin(),merge.r_name.end(),merge1.lseq[name][i]) != merge.r_name.end())) // if the element is reference { indexL1 = merge1.rseq[name][i-1]; r1_f = merge.ref_st[indexL1][0]; r1_last = merge.ref_end[indexL1][merge.ref_end[indexL1].size()-1]; if(i != (merge1.lseq[name].size()-1)) // if this is not the last element { indexL2 = merge1.rseq[name][i]; r2_f = merge.ref_st[indexL2][0]; r2_last = merge.ref_end[indexL2][merge.ref_end[indexL2].size()-1]; if(tempRef_st != 0) { r1_f = tempRef_st; //r1_last = tempRef_st; //transfer the number so that it is used in case of an overlap; //v1 = maxD(r1_last,r1_last,r2_f,r2_last);//CHANGED } v1 = maxD(r1_f,r1_last,r2_f,r2_last); // maximum distance between coords from the two alignments r1_f = min(v1[0],v1[1]); r2_last = max(v1[0],v1[1]); subseq = pbOnly.seq[merge1.lseq[name][i]].substr(r1_f,(r2_last - r1_f)); tempRef_st = 0; //reset tempRef_st if((i<2)&&(merge.Ori[name][i] == -1)) // && (name == merge1.lseq[name][i]) this was inside earlier { begin_insrt = -1; } if((i>1)&&(merge.Ori[name][i] == -1) && (name == merge1.lseq[name][i]) && (merge.Ori[name][i-2] == 1)) // if the preceding reference is of different sign { begin_insrt = -1; } } //if(i == (merge1.lseq[name].size()-1)) else { if((merge.Ori[name][i] == -1) && (name == merge1.lseq[name][i])) { begin_insrt = -1; } if(tempRef_st != 0) { r1_f = tempRef_st; //transfer the number so that it is used in case of an overlap; tempRef_st = 0; //reset tempRef } const std::string& s = pbOnly.seq[merge1.lseq[name][i]]; subseq = s.substr(r1_f,(merge.ref_len[indexL1] - r1_f)); // error here } if(merge.Ori[name][i] == -1) { subseqR = revCom(subseq); subseq = subseqR; } } if(begin_insrt == -1) { subseq.append(seqHolder); seqHolder = subseq; } if(begin_insrt == 1) { seqHolder.append(subseq); } } merged.seq[name] = seqHolder; seqHolder.clear(); } }