Esempio n. 1
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();
		
	}
}
Esempio n. 2
0
//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];
}