libStatGen Software  1
GlfFile Class Reference

This class allows a user to easily read/write a GLF file. More...

#include <GlfFile.h>

Inheritance diagram for GlfFile:

List of all members.

Public Types

enum  OpenType { READ, WRITE }
 Enum for indicating whether to open the file for read or write. More...

Public Member Functions

 GlfFile ()
 Default Constructor.
 GlfFile (const char *filename, OpenType mode=READ)
 Constructor that opens the specified file based on the specified mode (READ/WRITE).
virtual ~GlfFile ()
 Closes the file if there is one open, adding an end marker record if there is a previous section and one has not already been written.
bool openForRead (const char *filename)
 Open a glf file for reading with the specified filename.
bool openForRead (const char *filename, GlfHeader &header)
 Open a glf file for reading with the specified filename and read the header into the specified header.
bool openForWrite (const char *filename, bool compressed=true)
 Open a glf file for writing with the specified filename.
void close ()
 Close the file if there is one open, adding an end marker record if there is a previous section and one has not already been written.
bool isEOF ()
 Returns whether or not the end of the file has been reached.
bool readHeader (GlfHeader &header)
 Reads the header section from the file and stores it in the passed in header.
bool writeHeader (GlfHeader &header)
 Writes the specified header into the file.
bool getNextRefSection (GlfRefSection &refSection)
 Gets the next reference section from the file & stores it in the passed in section, consuming records until a new section is found.
bool writeRefSection (const GlfRefSection &refSection)
 Write the reference section to the file, adding an end marker record if there is a previous section and one has not already been written.
bool getNextRecord (GlfRecord &record)
 Gets the nextrecord from the file & stores it in the passed in record.
bool writeRecord (const GlfRecord &record)
 Writes the specified record into the file.
uint32_t getCurrentRecordCount ()
 Return the number of records that have been read/written so far.
GlfStatus::Status getFailure ()
 Get the Status of the last call that sets status.
GlfStatus::Status getStatus ()
 Get the Status of the last call that sets status.
const char * getStatusMessage ()
 Get the Status of the last call that sets status.

Detailed Description

This class allows a user to easily read/write a GLF file.

Definition at line 28 of file GlfFile.h.


Member Enumeration Documentation

Enum for indicating whether to open the file for read or write.

Enumerator:
READ 

open for reading.

WRITE 

open for writing.

Definition at line 32 of file GlfFile.h.

        {
            READ, ///< open for reading.
            WRITE ///< open for writing.
        };

Constructor & Destructor Documentation

GlfFile::GlfFile ( const char *  filename,
OpenType  mode = READ 
)

Constructor that opens the specified file based on the specified mode (READ/WRITE).

Default is READ.

Parameters:
filenamename of the file to open.
modemode to use for opening the file (defaults to READ).

Definition at line 33 of file GlfFile.cpp.

References getStatusMessage(), openForRead(), openForWrite(), and READ.

    : myFilePtr(NULL),
      myEndMarker()
{
    resetFile();

    bool openStatus = true;
    if(mode == READ)
    {
        // open the file for read.
        openStatus = openForRead(filename);
    }
    else
    {
        // open the file for write.
        openStatus = openForWrite(filename);
    }
    if(!openStatus)
    {
        // Failed to open the file - print error and abort.
        fprintf(stderr, "%s\n", getStatusMessage());
        std::cerr << "FAILURE - EXITING!!!" << std::endl;
        exit(-1);
    }
}
GlfFile::~GlfFile ( ) [virtual]

Closes the file if there is one open, adding an end marker record if there is a previous section and one has not already been written.

Definition at line 59 of file GlfFile.cpp.

{
    resetFile();
}

Member Function Documentation

void GlfFile::close ( )

Close the file if there is one open, adding an end marker record if there is a previous section and one has not already been written.

Definition at line 142 of file GlfFile.cpp.

{
    // Resetting the file will close it if it is open, and
    // will reset all other variables.
    resetFile();
}

Return the number of records that have been read/written so far.

Returns:
number of records that have been read/written so far.

Definition at line 483 of file GlfFile.cpp.

{
    return(myRecordCount);
}

Get the Status of the last call that sets status.

To remain backwards compatable - will be removed later.

Definition at line 121 of file GlfFile.h.

References getStatus().

    {
        return(getStatus());
    }
bool GlfFile::getNextRecord ( GlfRecord record)

Gets the nextrecord from the file & stores it in the passed in record.

Parameters:
recordobject to populate with the file's next record.
Returns:
true = record was successfully set. false = record not successfully set or for the endMarker record.

Definition at line 368 of file GlfFile.cpp.

References GlfStatus::FAIL_ORDER, GlfRecord::getRecordType(), isEOF(), GlfRecord::read(), GlfStatus::setStatus(), GlfStatus::SUCCESS, and GlfStatus::UNKNOWN.

Referenced by getNextRefSection().

{
    if(myIsOpenForRead == false)
    {
        // File is not open for read
        myStatus.setStatus(GlfStatus::FAIL_ORDER, 
                           "Cannot read reference section since the file is not open for reading");
        throw(GlfException(myStatus));
        return(false);
    }

    if(myNextSection == HEADER)
    {
        // The header has not yet been read.
        myStatus.setStatus(GlfStatus::FAIL_ORDER, 
                           "Cannot read reference section since the header has not been read.");
        throw(GlfException(myStatus));
        return(false);
    }
    
    if(myNextSection == REF_SECTION)
    {
        // The reference section has not yet been read.
        // TODO - maybe just read the reference section.
        myStatus.setStatus(GlfStatus::FAIL_ORDER, 
                           "Cannot read record since a reference section has not been read.");
        throw(GlfException(myStatus));
        return(false);
    }

    // Check for end of file.  If end of file, return false.
    if(isEOF())
    {
        return(false);
    }

    // Read the record.
    if(record.read(myFilePtr))
    {
        myStatus = GlfStatus::SUCCESS;
        if(record.getRecordType() != 0)
        {
            return(true);
        }
        else
        {
            // Not an error, so no exception thrown, but no more records.
            // The next thing is a reference section.
            myNextSection = REF_SECTION;
            return(false);
        }
    }
    
    myStatus.setStatus(GlfStatus::UNKNOWN, 
                       "Failed reading a record from the file.");
    throw(GlfException(myStatus));
    return(false);
}
bool GlfFile::getNextRefSection ( GlfRefSection refSection)

Gets the next reference section from the file & stores it in the passed in section, consuming records until a new section is found.

Parameters:
refSectionobject to populate with the file's next reference section.
Returns:
true = section was successfully set. false = section was not successfully set.

Definition at line 240 of file GlfFile.cpp.

References GlfStatus::FAIL_IO, GlfStatus::FAIL_ORDER, getNextRecord(), isEOF(), GlfRefSection::read(), GlfStatus::setStatus(), GlfStatus::SUCCESS, and GlfStatus::UNKNOWN.

{
    if(myIsOpenForRead == false)
    {
        // File is not open for read
        myStatus.setStatus(GlfStatus::FAIL_ORDER, 
                           "Cannot read reference section since the file is not open for reading");
        throw(GlfException(myStatus));
        return(false);
    }

    if(myNextSection == HEADER)
    {
        // The header has not yet been read.
        // TODO - maybe just read the header.
        myStatus.setStatus(GlfStatus::FAIL_ORDER, 
                           "Cannot read reference section since the header has not been read.");
        throw(GlfException(myStatus));
        return(false);
    }

    // Keep reading until the next section is found.
    if(myNextSection == RECORD)
    {
        GlfRecord record;
        while(getNextRecord(record))
        {
            // Nothing to do, with the record.
        }
    }

    // Check for end of file.  If end of file, return false.
    if(isEOF())
    {
        return(false);
    }

    if(myNextSection != REF_SECTION)
    {
        // Failed reading all the records, so throw exception.
        myStatus.setStatus(GlfStatus::FAIL_IO, 
                           "Failed to get to a reference section.");
        throw(GlfException(myStatus));
        return(false);
    }

    // Ready to read the section:
    if(refSection.read(myFilePtr))
    {
        myStatus = GlfStatus::SUCCESS;
        // Next a record should be read.
        myNextSection = RECORD;
        return(true);
    }

    // If it is the EOF, just return false.
    if(isEOF())
    {
        return(false);
    }
    myStatus.setStatus(GlfStatus::UNKNOWN, 
                       "Failed reading a reference section from the file.");
    throw(GlfException(myStatus));
    return(false);
}

Get the Status of the last call that sets status.

Returns:
status of the last method that sets a status.

Definition at line 128 of file GlfFile.h.

References GlfStatus::getStatus().

Referenced by getFailure().

    {
        return(myStatus.getStatus());
    }
const char* GlfFile::getStatusMessage ( ) [inline]

Get the Status of the last call that sets status.

Returns:
status message of the last method that sets a status.

Definition at line 135 of file GlfFile.h.

References GlfStatus::getStatusMessage().

Referenced by GlfFile(), GlfFileReader::GlfFileReader(), and GlfFileWriter::GlfFileWriter().

    {
        return(myStatus.getStatusMessage());
    }
bool GlfFile::isEOF ( )

Returns whether or not the end of the file has been reached.

Returns:
true = EOF; false = not eof. If the file is not open, true is returned.

Definition at line 152 of file GlfFile.cpp.

References ifeof().

Referenced by getNextRecord(), and getNextRefSection().

{
    if (myFilePtr != NULL)
    {
        // File Pointer is set, so return if eof.
        return(ifeof(myFilePtr));
    }
    // File pointer is not set, so return true, eof.
    return true;
}
bool GlfFile::openForRead ( const char *  filename)

Open a glf file for reading with the specified filename.

Parameters:
filenameglf file to open for reading.
Returns:
true = success; false = failure.

Definition at line 66 of file GlfFile.cpp.

References GlfStatus::FAIL_IO, ifopen(), GlfStatus::setStatus(), and GlfStatus::SUCCESS.

Referenced by GlfFile(), GlfFileReader::GlfFileReader(), and openForRead().

{
    // Reset for any previously operated on files.
    resetFile();

    myFilePtr = ifopen(filename, "rb");
   
    if (myFilePtr == NULL)
    {
        std::string errorMessage = "Failed to Open ";
        errorMessage += filename;
        errorMessage += " for reading";
        myStatus.setStatus(GlfStatus::FAIL_IO, errorMessage.c_str());
        throw(GlfException(myStatus));
        return(false);
    }

    myIsOpenForRead = true;
    // Successfully opened the file.
    myStatus = GlfStatus::SUCCESS;
    return(true);
}
bool GlfFile::openForRead ( const char *  filename,
GlfHeader header 
)

Open a glf file for reading with the specified filename and read the header into the specified header.

Parameters:
filenameglf file to open for reading.
headerheader object to populate with the file's glf header.
Returns:
true = success; false = failure.

Definition at line 92 of file GlfFile.cpp.

References openForRead(), and readHeader().

{
    if(!openForRead(filename))
    {
        return(false);
    }

    // Read the header
    if(!readHeader(header))
    {
        return(false);
    }
    return(true);
}
bool GlfFile::openForWrite ( const char *  filename,
bool  compressed = true 
)

Open a glf file for writing with the specified filename.

Parameters:
filenameglf file to open for writing.
compressedwhether or not to compress the file, defaults to true
Returns:
true = success; false = failure.

Definition at line 109 of file GlfFile.cpp.

References InputFile::BGZF, GlfStatus::FAIL_IO, ifopen(), GlfStatus::setStatus(), GlfStatus::SUCCESS, and InputFile::UNCOMPRESSED.

Referenced by GlfFile(), and GlfFileWriter::GlfFileWriter().

{
    // Reset for any previously operated on files.
    resetFile();

    if(compressed)
    {
        myFilePtr = ifopen(filename, "wb", InputFile::BGZF);
    }
    else
    {
        myFilePtr = ifopen(filename, "wb", InputFile::UNCOMPRESSED);
    }

    if (myFilePtr == NULL)
    {
        std::string errorMessage = "Failed to Open ";
        errorMessage += filename;
        errorMessage += " for writing";
        myStatus.setStatus(GlfStatus::FAIL_IO, errorMessage.c_str());
        throw(GlfException(myStatus));
        return(false);
    }
   
    myIsOpenForWrite = true;

    // Successfully opened the file.
    myStatus = GlfStatus::SUCCESS;
    return(true);
}
bool GlfFile::readHeader ( GlfHeader header)

Reads the header section from the file and stores it in the passed in header.

Parameters:
headerheader object to populate with the file's glf header.
Returns:
true = success; false = failure.

Definition at line 165 of file GlfFile.cpp.

References GlfStatus::FAIL_ORDER, GlfHeader::read(), GlfStatus::setStatus(), GlfStatus::SUCCESS, and GlfStatus::UNKNOWN.

Referenced by openForRead().

{
    if(myIsOpenForRead == false)
    {
        // File is not open for read
        myStatus.setStatus(GlfStatus::FAIL_ORDER, 
                           "Cannot read header since the file is not open for reading");
        throw(GlfException(myStatus));
        return(false);
    }

    if(myNextSection != HEADER)
    {
        // The header has already been read.
        myStatus.setStatus(GlfStatus::FAIL_ORDER, 
                           "Cannot read header since it has already been read.");
        throw(GlfException(myStatus));
        return(false);
    }

    if(header.read(myFilePtr))
    {
        // The header has now been successfully read.
        myNextSection = REF_SECTION;
        myStatus = GlfStatus::SUCCESS;
        return(true);
    }
    myStatus.setStatus(GlfStatus::UNKNOWN, 
                       "Failed to read the header.");
    throw(GlfException(myStatus));
    return(false);
}
bool GlfFile::writeHeader ( GlfHeader header)

Writes the specified header into the file.

Parameters:
headerheader object to write into the file.
Returns:
true = success; false = failure.

Definition at line 200 of file GlfFile.cpp.

References GlfStatus::FAIL_ORDER, GlfStatus::setStatus(), GlfStatus::SUCCESS, GlfStatus::UNKNOWN, and GlfHeader::write().

{
    if(myIsOpenForWrite == false)
    {
        // File is not open for write
        // -OR-
        // The header has already been written.
        myStatus.setStatus(GlfStatus::FAIL_ORDER, 
                           "Cannot write header since the file is not open for writing");
        throw(GlfException(myStatus));
        return(false);
    }

    if(myNextSection != HEADER)
    {
        // The header has already been written.
        myStatus.setStatus(GlfStatus::FAIL_ORDER, 
                           "Cannot write header since it has already been written");
        throw(GlfException(myStatus));
        return(false);
    }

    if(header.write(myFilePtr))
    {
        // The header has now been successfully written.
        myNextSection = REF_SECTION;
        myStatus = GlfStatus::SUCCESS;
        return(true);
    }

    // return the status.
    myStatus.setStatus(GlfStatus::UNKNOWN, 
                       "Failed to write the header.");
    throw(GlfException(myStatus));
    return(false);
}
bool GlfFile::writeRecord ( const GlfRecord record)

Writes the specified record into the file.

Parameters:
recordrecord to write to the file.
Returns:
true = success; false = failure.

Definition at line 429 of file GlfFile.cpp.

References GlfStatus::FAIL_ORDER, GlfRecord::getRecordType(), GlfStatus::setStatus(), GlfStatus::SUCCESS, GlfStatus::UNKNOWN, and GlfRecord::write().

Referenced by writeRefSection().

{
    if(myIsOpenForWrite == false)
    {
        // File is not open for write
        // -OR-
        // The header has already been written.
        myStatus.setStatus(GlfStatus::FAIL_ORDER, 
                           "Cannot write record since the file is not open for writing");
        throw(GlfException(myStatus));
       return(false);
    }

    if(myNextSection == HEADER)
    {
        // The header has not been written.
        myStatus.setStatus(GlfStatus::FAIL_ORDER, 
                           "Cannot write record since the header has not been written");
        throw(GlfException(myStatus));
        return(false);
    }

    if(myNextSection != RECORD)
    {
        // The header has not been written.
        myStatus.setStatus(GlfStatus::FAIL_ORDER, 
                           "Cannot write record since a reference section has not been written");
        throw(GlfException(myStatus));
        return(false);
    }

    if(record.write(myFilePtr))
    {
        myStatus = GlfStatus::SUCCESS;
        // The record has now been successfully written.

        // Check if it was the end marker - if so, set that next a 
        // reference section is expected.
        if(record.getRecordType() == 0)
        {
            myNextSection = REF_SECTION;
        }
        return(true);
    }

    // return the status.
    myStatus.setStatus(GlfStatus::UNKNOWN, 
                       "Failed writing a record to the file.");
    throw(GlfException(myStatus));
    return(false);    
}
bool GlfFile::writeRefSection ( const GlfRefSection refSection)

Write the reference section to the file, adding an end marker record if there is a previous section and one has not already been written.

Parameters:
refSectionreference section to write to the file.
Returns:
true = succes; false = failure.

Definition at line 308 of file GlfFile.cpp.

References GlfStatus::FAIL_IO, GlfStatus::FAIL_ORDER, GlfStatus::setStatus(), GlfStatus::SUCCESS, GlfStatus::UNKNOWN, GlfRefSection::write(), and writeRecord().

{
    if(myIsOpenForWrite == false)
    {
        // File is not open for write
        myStatus.setStatus(GlfStatus::FAIL_ORDER, 
                           "Cannot write reference section since the file is not open for writing");
        throw(GlfException(myStatus));
        return(false);
    }

    if(myNextSection == HEADER)
    {
        // The header has not been written.
        myStatus.setStatus(GlfStatus::FAIL_ORDER, 
                           "Cannot write reference section since the header has not been written");
        throw(GlfException(myStatus));
       return(false);
    }

    if(myNextSection == RECORD)
    {
        // did not write a end marker record, so write one now.
        if(!writeRecord(myEndMarker))
        {
            // Failed to write the end marker record.
            myStatus.setStatus(GlfStatus::FAIL_IO,
                               "Failed to write end of chromosome/section marker.");
            throw(GlfException(myStatus));
            return(false);
        }
    }

    if(myNextSection != REF_SECTION)
    {
        // Not ready to write a reference section.
        myStatus.setStatus(GlfStatus::FAIL_IO,
                           "Not ready for a chromosome/section header.");
        throw(GlfException(myStatus));
        return(false);
    }

    if(refSection.write(myFilePtr))
    {
        myStatus = GlfStatus::SUCCESS;
        // A reference section has now been successfully written.
        myNextSection = RECORD;
        return(true);
    }

    // return the status.
    myStatus.setStatus(GlfStatus::UNKNOWN, 
                       "Failed writing a reference section to the file.");
    throw(GlfException(myStatus));
    return(false);    
}

The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends