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 Mar 28 06:00:21 2005 for libGenome by doxygen 1.3.6