|
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);
}