libStatGen Software
1
|
This class allows a user to easily read/write a GLF file. More...
#include <GlfFile.h>
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. |
enum GlfFile::OpenType |
GlfFile::GlfFile | ( | const char * | filename, |
OpenType | mode = READ |
||
) |
Constructor that opens the specified file based on the specified mode (READ/WRITE).
Default is READ.
filename | name of the file to open. |
mode | mode 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(); }
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(); }
uint32_t GlfFile::getCurrentRecordCount | ( | ) |
Return the number of records that have been read/written so far.
Definition at line 483 of file GlfFile.cpp.
{
return(myRecordCount);
}
GlfStatus::Status GlfFile::getFailure | ( | ) | [inline] |
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.
record | object to populate with the file's next 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.
refSection | object to populate with the file's next reference section. |
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); }
GlfStatus::Status GlfFile::getStatus | ( | ) | [inline] |
Get the Status of the last call that sets 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.
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.
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.
filename | glf file to open for reading. |
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.
filename | glf file to open for reading. |
header | header object to populate with the file's glf header. |
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.
filename | glf file to open for writing. |
compressed | whether or not to compress the file, defaults to true |
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.
header | header object to populate with the file's glf header. |
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.
header | header object to write into the file. |
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.
record | record to write to the file. |
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.
refSection | reference section to write to the file. |
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); }