00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
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
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
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
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
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
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
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
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
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
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
00137
if(spans_specs){
00138 newSpec = m_SpecList[endSpec]->
CloneRange( 0, total_copylen - cur_copylen);
00139 destSpec->
AddSpec(newSpec);
00140 }
00141
00142
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
00154 void gnFragmentSpec::SetReverseComplement(
const boolean value )
00155 {
00156
if(value == m_reverseComplement)
00157
return;
00158
00159 vector<gnContigSpec*> tmp_spec_list;
00160
for(
uint32 i=0; i <
GetSpecListLength(); i++){
00161
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 }