src/gnFragmentSpec.cpp

Go to the documentation of this file.
00001 00002 // File: gnFragmentSpec.cpp 00003 // Purpose: implements gnMultiSpec< gnContigSpec > for sequence fragments 00004 // Description: 00005 // Changes: 00006 // Version: libGenome 0.5.1 00007 // Author: Aaron Darling 00008 // Modified by: 00009 // Copyright: (c) Aaron Darling 00010 // Licenses: See COPYING file for details 00012 00013 #include "gn/gnFragmentSpec.h" 00014 #include <string> 00015 00016 gnFragmentSpec::gnFragmentSpec() 00017 { 00018 gnBaseSpec::Clear(); 00019 } 00020 00021 gnFragmentSpec::gnFragmentSpec( const gnFragmentSpec& s ) 00022 { 00023 m_sourceName = s.m_sourceName; 00024 m_name = s.m_name; 00025 m_reverseComplement = s.m_reverseComplement; 00026 m_circular = s.m_circular; 00027 //copy the header list. 00028 uint32 list_size = s.m_headerList.size(); 00029 m_headerList.reserve(list_size); 00030 for(uint32 i=0; i < list_size; i++) 00031 m_headerList.push_back(s.m_headerList[i]->Clone()); 00032 //copy the contig list. 00033 list_size = s.m_SpecList.size(); 00034 m_SpecList.reserve(list_size); 00035 uint32 i=0; 00036 for(; i < list_size; i++) 00037 m_SpecList.push_back(s.m_SpecList[i]->Clone()); 00038 //copy the feature list 00039 list_size = s.m_featureList.size(); 00040 m_featureList.reserve(list_size); 00041 for(i=0; i < list_size; i++) 00042 m_featureList.push_back(s.m_featureList[i]->Clone()); 00043 } 00044 gnFragmentSpec::~gnFragmentSpec() 00045 { 00046 Clear(); 00047 } 00048 // Clone 00049 00050 void gnFragmentSpec::Clear() 00051 { 00052 uint32 list_size = m_SpecList.size(); 00053 for(uint32 i=0; i < list_size; i++) 00054 delete m_SpecList[i]; 00055 m_SpecList.clear(); 00056 list_size = m_featureList.size(); 00057 for(uint32 i=0; i < list_size; i++) 00058 delete m_featureList[i]; 00059 m_featureList.clear(); 00060 gnMultiSpec< gnContigSpec >::Clear(); 00061 } 00062 //Fragment 00063 void gnFragmentSpec::GetContainedFeatures(const gnLocation& lt, vector<gnBaseFeature*>& feature_vector, vector<uint32>& index_vector) const{ 00064 for(uint32 i=0; i < m_featureList.size(); i++){ 00065 if(m_featureList[i]->IsContainedBy(lt)){ 00066 feature_vector.push_back(m_featureList[i]->Clone()); 00067 index_vector.push_back(i); 00068 } 00069 } 00070 } 00071 void gnFragmentSpec::GetIntersectingFeatures(const gnLocation& lt, vector<gnBaseFeature*>& feature_vector, vector<uint32>& index_vector) const{ 00072 for(uint32 i=0; i < m_featureList.size(); i++){ 00073 if(m_featureList[i]->Intersects(lt)){ 00074 feature_vector.push_back(m_featureList[i]->Clone()); 00075 index_vector.push_back(i); 00076 } 00077 } 00078 } 00079 void gnFragmentSpec::GetBrokenFeatures(const gnLocation& lt, vector<gnBaseFeature*>& feature_vector) const{ 00080 for(uint32 i=0; i < m_featureList.size(); i++) 00081 if(m_featureList[i]->IsBroken() && m_featureList[i]->IsContainedBy(lt)) 00082 feature_vector.push_back(m_featureList[i]->Clone()); 00083 } 00084 00085 //do feature cropping... done 00086 void gnFragmentSpec::CropStart( gnSeqI cropLen ){ 00087 uint32 flen = m_featureList.size(); 00088 for(uint32 featureI = 0; featureI < flen; featureI++){ 00089 m_featureList[featureI]->CropStart(cropLen); 00090 } 00091 gnMultiSpec< gnContigSpec >::CropStart(cropLen); 00092 } 00093 00094 void gnFragmentSpec::CropEnd( gnSeqI cropLen ){ 00095 uint32 flen = m_featureList.size(); 00096 for(uint32 featureI = 0; featureI < flen; featureI++){ 00097 m_featureList[featureI]->CropEnd(cropLen); 00098 } 00099 gnMultiSpec< gnContigSpec >::CropEnd(cropLen); 00100 } 00101 00102 gnFragmentSpec* gnFragmentSpec::CloneRange( const gnSeqI startI, const gnSeqI len ) const{ 00103 if(len == 0) 00104 return new gnFragmentSpec(); 00105 00106 //find the valid range of specs to copy 00107 uint32 firstSpec = GetSpecIndexByBase(startI); 00108 gnSeqI total_copylen = len; 00109 uint32 endSpec; 00110 if(len != GNSEQI_END){ 00111 endSpec = GetSpecIndexByBase(startI + len - 1); 00112 }else{ 00113 endSpec = GetSpecListLength() - 1; 00114 total_copylen = GetLength() - startI; 00115 } 00116 00117 //find their starting and ending bases 00118 gnSeqI firstBase = startI - GetSpecStartBase(firstSpec); 00119 gnSeqI firstSpecLen = GetSpec(firstSpec)->GetLength(); 00120 boolean spans_specs = true; 00121 gnSeqI firstCopyLen = firstSpecLen - firstBase; 00122 if(firstCopyLen >= total_copylen){ 00123 spans_specs = false; 00124 firstCopyLen = total_copylen; 00125 } 00126 gnFragmentSpec* destSpec = new gnFragmentSpec(); 00127 gnContigSpec* newSpec = m_SpecList[firstSpec]->CloneRange(firstBase, firstCopyLen); 00128 destSpec->AddSpec( newSpec ); 00129 00130 gnSeqI cur_copylen = firstCopyLen; 00131 //add all the completely covered specs in the middle 00132 for(uint32 specI = firstSpec + 2; specI <= endSpec; specI++){ 00133 destSpec->AddSpec(GetSpec(specI-1)->Clone()); 00134 cur_copylen += GetSpec(specI-1)->GetLength(); 00135 } 00136 //add the last spec if necessary 00137 if(spans_specs){ 00138 newSpec = m_SpecList[endSpec]->CloneRange( 0, total_copylen - cur_copylen); 00139 destSpec->AddSpec(newSpec); 00140 } 00141 00142 //now clone all the appropriate features 00143 gnLocation lt; 00144 vector<gnBaseFeature*> feature_vector; 00145 vector<uint32> index_vector; 00146 lt.SetStart(startI); 00147 lt.SetEnd(startI + total_copylen); 00148 GetIntersectingFeatures(lt, destSpec->m_featureList, index_vector); 00149 00150 return destSpec; 00151 } 00152 00153 /*IMPLEMENT ME!! ADD FEATURE Manipulation*/ 00154 void gnFragmentSpec::SetReverseComplement( const boolean value ) 00155 { 00156 if(value == m_reverseComplement) 00157 return; 00158 //reverse the spec list entries 00159 vector<gnContigSpec*> tmp_spec_list; 00160 for(uint32 i=0; i < GetSpecListLength(); i++){ 00161 //transmit rev_comp down the tree 00162 GetSpec(i)->SetReverseComplement(!GetSpec(i)->IsReverseComplement()); 00163 tmp_spec_list.insert(tmp_spec_list.begin(), GetSpec(i)); 00164 } 00165 m_SpecList = tmp_spec_list; 00166 m_reverseComplement = value; 00167 }

Generated on Mon Feb 14 19:28:20 2005 for libGenome by doxygen 1.3.8