예제 #1
0
 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;
 }
예제 #2
0
파일: dellib.cpp 프로젝트: mahulchak/svmu
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;
        }
}
예제 #3
0
파일: dellib.cpp 프로젝트: mahulchak/svmu
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;
	}
}
예제 #4
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();
		
	}
}