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(); } }
//TSP 본체 int travel(int start, const int W[][13], int P[][4096], int b[], int D[][MAX_BINT]){ //반복 변수 int i, j, k; //D가 되는 개수 변수, 주소 변수 int cnt=0, index=0; //부분집합을 표현하는 비트 int bitS=0; //임시 D값 저장 배열, 임시 최단 거리 주소 저장 배열 int temp[12]={MAX,MAX,MAX,MAX,MAX,MAX,MAX,MAX,MAX,MAX,MAX,MAX}, indexP[12]={0,}; //출발점 제외한 나머지 거리에서 도착점까지 최단 경로 저장 for(i=1;i<=CITYCOUNT;++i) if(i!=start) D[i][0]=W[i][start]; //부분집합 1~10개의 경우 계산 for(k=1;k<=CITYCOUNT-2;++k){ //개수에 맞는 최초부분집합 계산 bitS=0; for(j=0;j<=k;++j){ b[j]=1; bitS |= (int)pow(2.0, j); } b[start-1]=0; bitS ^= (int)pow(2.0, start-1); while(1){ for(j=1;j<=CITYCOUNT;++j){ //부분집합 A, 출발점에 포함되면 넘어감 if((bitS & (1<<(j-1)))>0) continue; //A인 경우에 D행렬, P행렬의 일부 계산 for(i=1, cnt=0;cnt<k;++i){ if((bitS & (1<<(i-1)))>0){ temp[cnt]=W[j][i]+D[i][bitS^(1<<i)]; indexP[cnt]=i; ++cnt; } } D[j][bitS]=minD(temp, cnt, &index); P[j][bitS]=indexP[index]; } //비트수 검사하여 개수 맞으면 계속 진행, 범위 초과시 종료 while(1){ ++bitS; //범위 초과시 반복 종료 if(bitS>4095) break; //개수 일치 시 반복 종료 else if(checkBit(bitS)==k) break; } //범위 초과 시 구문 종료 if(bitS>4095) break; } } //출발 제외한 나머지 경로 거칠 때 경우 계산 bitS=4095; bitS^=(int)pow(2.0, start-1); for(i=1, cnt=0;cnt<CITYCOUNT-1;++i){ if((bitS & (1<<(i-1)))>0){ temp[cnt]=W[start][i]+D[i][bitS^(1<<j)]; indexP[cnt]=i; ++cnt; } } D[start][bitS]=minD(temp,cnt,&index); P[start][bitS]=indexP[index]; return D[start][bitS]; }