src/gnRAWSource.cpp

Go to the documentation of this file.
00001 00002 // File: gnRAWSource.h 00003 // Purpose: Implements gnBaseSource for raw data files 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 #include "gn/gnFilter.h" 00013 #include "gn/gnRAWSource.h" 00014 #include "gn/gnGenomeSpec.h" 00015 #include "gn/gnFragmentSpec.h" 00016 #include "gn/gnSourceSpec.h" 00017 #include "gn/gnStringTools.h" 00018 #include "gn/gnDebug.h" 00019 00020 gnRAWSource::gnRAWSource() 00021 { 00022 m_openString = ""; 00023 m_contig = NULL; 00024 m_pFilter = NULL; 00025 } 00026 00027 gnRAWSource::gnRAWSource( const gnRAWSource& s ) : gnFileSource(s) 00028 { 00029 m_contig = NULL; 00030 if(s.m_contig != NULL) 00031 m_contig = s.m_contig->Clone(); 00032 } 00033 00034 gnRAWSource::~gnRAWSource() 00035 { 00036 m_ifstream.close(); 00037 delete m_contig; 00038 } 00039 00040 boolean gnRAWSource::HasContig( const string& name ) const 00041 { 00042 if( name.length() == 0 ) 00043 return true; 00044 return false; 00045 } 00046 00047 uint32 gnRAWSource::GetContigID( const string& name ) const 00048 { 00049 return ALL_CONTIGS; 00050 } 00051 00052 string gnRAWSource::GetContigName( const uint32 i ) const 00053 { 00054 return ""; 00055 } 00056 00057 gnSeqI gnRAWSource::GetContigSeqLength( const uint32 i ) const 00058 { 00059 if( m_contig && (i == 0 || i == ALL_CONTIGS)) 00060 return m_contig->GetSeqLength(); 00061 return GNSEQI_ERROR; 00062 } 00063 00064 boolean gnRAWSource::SeqRead( const gnSeqI start, char* buf, gnSeqI& bufLen, const uint32 contigI ){ 00065 return Read( start, buf, bufLen ); 00066 } 00067 00068 gnGenomeSpec *gnRAWSource::GetSpec() const{ 00069 return m_spec->Clone(); 00070 } 00071 00072 boolean gnRAWSource::Write(gnSequence& seq, const string& filename){ 00073 ofstream m_ofstream(filename.c_str(), ios::out | ios::binary); 00074 if(!m_ofstream.is_open()) 00075 return false; 00076 00077 gnSeqC buf[BUFFER_SIZE + 1]; 00078 buf[BUFFER_SIZE] = 0; 00079 gnSeqI readOffset = 0; 00080 gnSeqI readLength = seq.length(); 00081 while(readLength > 0){ //buffer the read/writes 00082 gnSeqI writeLen = readLength < BUFFER_SIZE ? readLength : BUFFER_SIZE; 00083 if(!seq.ToArray(buf, writeLen, readOffset + 1)) 00084 return false; 00085 m_ofstream.write( buf, writeLen ); 00086 readLength -= writeLen; 00087 readOffset += writeLen; 00088 } 00089 m_ofstream.flush(); 00090 m_ofstream.close(); 00091 return true; 00092 } 00093 00094 gnFileContig* gnRAWSource::GetFileContig( const uint32 contigI ) const{ 00095 if(contigI > 0) 00096 return NULL; 00097 return m_contig; 00098 } 00099 00100 //File parsing access routine 00101 boolean gnRAWSource::ParseStream( istream& fin ) 00102 { 00103 // init variables 00104 uint64 streamPos = 0; 00105 uint64 bufReadLen = 0; 00106 Array<char> array_buf( BUFFER_SIZE ); 00107 char* buf = array_buf.data; 00108 gnSeqI seqLength = 0; 00109 00110 if( m_contig == NULL ) 00111 m_contig = new gnFileContig(); 00112 m_contig->SetName( "Raw Data" ); 00113 m_contig->SetRepeatSeqGap(true); 00114 m_contig->SetSectStart(gnContigSequence, 0); 00115 00116 uint64 offset = 0; 00117 if( !CheckRawData() ){ 00118 fin.seekg( 0, ios::end ); 00119 offset = fin.tellg(); 00120 } 00121 else 00122 { 00123 while( !fin.eof() ) 00124 { 00125 // read chars 00126 fin.read( buf , BUFFER_SIZE ); 00127 bufReadLen = fin.gcount(); 00128 00129 for( uint32 i=0 ; i < bufReadLen ; i++ ) 00130 { 00131 if(m_pFilter == NULL || m_pFilter->IsValid(buf[i])) 00132 seqLength++; 00133 else{ 00134 m_contig->SetRepeatSeqGap(false); 00135 } 00136 } 00137 streamPos += bufReadLen; 00138 } 00139 } 00140 m_contig->SetSectEnd(gnContigSequence, streamPos + offset); 00141 m_contig->SetSeqLength(seqLength + offset ); 00142 m_spec = new gnGenomeSpec(); 00143 gnFragmentSpec* fragspec = new gnFragmentSpec(); 00144 gnSourceSpec* sspec = new gnSourceSpec(this); 00145 sspec->SetSourceName(m_openString); 00146 m_spec->AddSpec(fragspec); 00147 fragspec->AddSpec(sspec); 00148 00149 m_ifstream.clear(); 00150 return true; 00151 }

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