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. |
This class allows a user to easily read/write a GLF file.
Definition at line 28 of file GlfFile.h.
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.
00034 : myFilePtr(NULL), 00035 myEndMarker() 00036 { 00037 resetFile(); 00038 00039 bool openStatus = true; 00040 if(mode == READ) 00041 { 00042 // open the file for read. 00043 openStatus = openForRead(filename); 00044 } 00045 else 00046 { 00047 // open the file for write. 00048 openStatus = openForWrite(filename); 00049 } 00050 if(!openStatus) 00051 { 00052 // Failed to open the file - print error and abort. 00053 fprintf(stderr, "%s\n", getStatusMessage()); 00054 std::cerr << "FAILURE - EXITING!!!" << std::endl; 00055 exit(-1); 00056 } 00057 }
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.
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.
uint32_t GlfFile::getCurrentRecordCount | ( | ) |
Return the number of records that have been read/written so far.
Definition at line 477 of file GlfFile.cpp.
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().
00122 { 00123 return(getStatus()); 00124 }
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(), GlfRecord::read(), GlfStatus::setStatus(), GlfStatus::SUCCESS, and GlfStatus::UNKNOWN.
Referenced by getNextRefSection().
00369 { 00370 if(myIsOpenForRead == false) 00371 { 00372 // File is not open for read 00373 myStatus.setStatus(GlfStatus::FAIL_ORDER, 00374 "Cannot read reference section since the file is not open for reading"); 00375 throw(GlfException(myStatus)); 00376 return(false); 00377 } 00378 00379 if(myNextSection == HEADER) 00380 { 00381 // The header has not yet been read. 00382 myStatus.setStatus(GlfStatus::FAIL_ORDER, 00383 "Cannot read reference section since the header has not been read."); 00384 throw(GlfException(myStatus)); 00385 return(false); 00386 } 00387 00388 if(myNextSection == REF_SECTION) 00389 { 00390 // The reference section has not yet been read. 00391 // TODO - maybe just read the reference section. 00392 myStatus.setStatus(GlfStatus::FAIL_ORDER, 00393 "Cannot read record since a reference section has not been read."); 00394 throw(GlfException(myStatus)); 00395 return(false); 00396 } 00397 00398 // Read the record. 00399 if(record.read(myFilePtr)) 00400 { 00401 myStatus = GlfStatus::SUCCESS; 00402 if(record.getRecordType() != 0) 00403 { 00404 return(true); 00405 } 00406 else 00407 { 00408 // Not an error, so no exception thrown, but no more records. 00409 // The next thing is a reference section. 00410 myNextSection = REF_SECTION; 00411 return(false); 00412 } 00413 } 00414 00415 myStatus.setStatus(GlfStatus::UNKNOWN, 00416 "Failed reading a record from the file."); 00417 throw(GlfException(myStatus)); 00418 return(false); 00419 }
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.
00241 { 00242 if(myIsOpenForRead == false) 00243 { 00244 // File is not open for read 00245 myStatus.setStatus(GlfStatus::FAIL_ORDER, 00246 "Cannot read reference section since the file is not open for reading"); 00247 throw(GlfException(myStatus)); 00248 return(false); 00249 } 00250 00251 if(myNextSection == HEADER) 00252 { 00253 // The header has not yet been read. 00254 // TODO - maybe just read the header. 00255 myStatus.setStatus(GlfStatus::FAIL_ORDER, 00256 "Cannot read reference section since the header has not been read."); 00257 throw(GlfException(myStatus)); 00258 return(false); 00259 } 00260 00261 // Keep reading until the next section is found. 00262 if(myNextSection == RECORD) 00263 { 00264 GlfRecord record; 00265 while(getNextRecord(record)) 00266 { 00267 // Nothing to do, with the record. 00268 } 00269 } 00270 00271 // Check for end of file. If end of file, return false. 00272 if(isEOF()) 00273 { 00274 return(false); 00275 } 00276 00277 if(myNextSection != REF_SECTION) 00278 { 00279 // Failed reading all the records, so throw exception. 00280 myStatus.setStatus(GlfStatus::FAIL_IO, 00281 "Failed to get to a reference section."); 00282 throw(GlfException(myStatus)); 00283 return(false); 00284 } 00285 00286 // Ready to read the section: 00287 if(refSection.read(myFilePtr)) 00288 { 00289 myStatus = GlfStatus::SUCCESS; 00290 // Next a record should be read. 00291 myNextSection = RECORD; 00292 return(true); 00293 } 00294 00295 // If it is the EOF, just return false. 00296 if(isEOF()) 00297 { 00298 return(false); 00299 } 00300 myStatus.setStatus(GlfStatus::UNKNOWN, 00301 "Failed reading a reference section from the file."); 00302 throw(GlfException(myStatus)); 00303 return(false); 00304 }
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().
00129 { 00130 return(myStatus.getStatus()); 00131 }
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().
00136 { 00137 return(myStatus.getStatusMessage()); 00138 }
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 getNextRefSection().
00153 { 00154 if (myFilePtr != NULL) 00155 { 00156 // File Pointer is set, so return if eof. 00157 return(ifeof(myFilePtr)); 00158 } 00159 // File pointer is not set, so return true, eof. 00160 return true; 00161 }
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().
00093 { 00094 if(!openForRead(filename)) 00095 { 00096 return(false); 00097 } 00098 00099 // Read the header 00100 if(!readHeader(header)) 00101 { 00102 return(false); 00103 } 00104 return(true); 00105 }
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().
00067 { 00068 // Reset for any previously operated on files. 00069 resetFile(); 00070 00071 myFilePtr = ifopen(filename, "rb"); 00072 00073 if (myFilePtr == NULL) 00074 { 00075 std::string errorMessage = "Failed to Open "; 00076 errorMessage += filename; 00077 errorMessage += " for reading"; 00078 myStatus.setStatus(GlfStatus::FAIL_IO, errorMessage.c_str()); 00079 throw(GlfException(myStatus)); 00080 return(false); 00081 } 00082 00083 myIsOpenForRead = true; 00084 // Successfully opened the file. 00085 myStatus = GlfStatus::SUCCESS; 00086 return(true); 00087 }
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().
00110 { 00111 // Reset for any previously operated on files. 00112 resetFile(); 00113 00114 if(compressed) 00115 { 00116 myFilePtr = ifopen(filename, "wb", InputFile::BGZF); 00117 } 00118 else 00119 { 00120 myFilePtr = ifopen(filename, "wb", InputFile::UNCOMPRESSED); 00121 } 00122 00123 if (myFilePtr == NULL) 00124 { 00125 std::string errorMessage = "Failed to Open "; 00126 errorMessage += filename; 00127 errorMessage += " for writing"; 00128 myStatus.setStatus(GlfStatus::FAIL_IO, errorMessage.c_str()); 00129 throw(GlfException(myStatus)); 00130 return(false); 00131 } 00132 00133 myIsOpenForWrite = true; 00134 00135 // Successfully opened the file. 00136 myStatus = GlfStatus::SUCCESS; 00137 return(true); 00138 }
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().
00166 { 00167 if(myIsOpenForRead == false) 00168 { 00169 // File is not open for read 00170 myStatus.setStatus(GlfStatus::FAIL_ORDER, 00171 "Cannot read header since the file is not open for reading"); 00172 throw(GlfException(myStatus)); 00173 return(false); 00174 } 00175 00176 if(myNextSection != HEADER) 00177 { 00178 // The header has already been read. 00179 myStatus.setStatus(GlfStatus::FAIL_ORDER, 00180 "Cannot read header since it has already been read."); 00181 throw(GlfException(myStatus)); 00182 return(false); 00183 } 00184 00185 if(header.read(myFilePtr)) 00186 { 00187 // The header has now been successfully read. 00188 myNextSection = REF_SECTION; 00189 myStatus = GlfStatus::SUCCESS; 00190 return(true); 00191 } 00192 myStatus.setStatus(GlfStatus::UNKNOWN, 00193 "Failed to read the header."); 00194 throw(GlfException(myStatus)); 00195 return(false); 00196 }
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().
00201 { 00202 if(myIsOpenForWrite == false) 00203 { 00204 // File is not open for write 00205 // -OR- 00206 // The header has already been written. 00207 myStatus.setStatus(GlfStatus::FAIL_ORDER, 00208 "Cannot write header since the file is not open for writing"); 00209 throw(GlfException(myStatus)); 00210 return(false); 00211 } 00212 00213 if(myNextSection != HEADER) 00214 { 00215 // The header has already been written. 00216 myStatus.setStatus(GlfStatus::FAIL_ORDER, 00217 "Cannot write header since it has already been written"); 00218 throw(GlfException(myStatus)); 00219 return(false); 00220 } 00221 00222 if(header.write(myFilePtr)) 00223 { 00224 // The header has now been successfully written. 00225 myNextSection = REF_SECTION; 00226 myStatus = GlfStatus::SUCCESS; 00227 return(true); 00228 } 00229 00230 // return the status. 00231 myStatus.setStatus(GlfStatus::UNKNOWN, 00232 "Failed to write the header."); 00233 throw(GlfException(myStatus)); 00234 return(false); 00235 }
bool GlfFile::writeRecord | ( | const GlfRecord & | record | ) |
Writes the specified record into the file.
record | record to write to the file. |
Definition at line 423 of file GlfFile.cpp.
References GlfStatus::FAIL_ORDER, GlfRecord::getRecordType(), GlfStatus::setStatus(), GlfStatus::SUCCESS, GlfStatus::UNKNOWN, and GlfRecord::write().
Referenced by writeRefSection().
00424 { 00425 if(myIsOpenForWrite == false) 00426 { 00427 // File is not open for write 00428 // -OR- 00429 // The header has already been written. 00430 myStatus.setStatus(GlfStatus::FAIL_ORDER, 00431 "Cannot write record since the file is not open for writing"); 00432 throw(GlfException(myStatus)); 00433 return(false); 00434 } 00435 00436 if(myNextSection == HEADER) 00437 { 00438 // The header has not been written. 00439 myStatus.setStatus(GlfStatus::FAIL_ORDER, 00440 "Cannot write record since the header has not been written"); 00441 throw(GlfException(myStatus)); 00442 return(false); 00443 } 00444 00445 if(myNextSection != RECORD) 00446 { 00447 // The header has not been written. 00448 myStatus.setStatus(GlfStatus::FAIL_ORDER, 00449 "Cannot write record since a reference section has not been written"); 00450 throw(GlfException(myStatus)); 00451 return(false); 00452 } 00453 00454 if(record.write(myFilePtr)) 00455 { 00456 myStatus = GlfStatus::SUCCESS; 00457 // The record has now been successfully written. 00458 00459 // Check if it was the end marker - if so, set that next a 00460 // reference section is expected. 00461 if(record.getRecordType() == 0) 00462 { 00463 myNextSection = REF_SECTION; 00464 } 00465 return(true); 00466 } 00467 00468 // return the status. 00469 myStatus.setStatus(GlfStatus::UNKNOWN, 00470 "Failed writing a record to the file."); 00471 throw(GlfException(myStatus)); 00472 return(false); 00473 }
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().
00309 { 00310 if(myIsOpenForWrite == false) 00311 { 00312 // File is not open for write 00313 myStatus.setStatus(GlfStatus::FAIL_ORDER, 00314 "Cannot write reference section since the file is not open for writing"); 00315 throw(GlfException(myStatus)); 00316 return(false); 00317 } 00318 00319 if(myNextSection == HEADER) 00320 { 00321 // The header has not been written. 00322 myStatus.setStatus(GlfStatus::FAIL_ORDER, 00323 "Cannot write reference section since the header has not been written"); 00324 throw(GlfException(myStatus)); 00325 return(false); 00326 } 00327 00328 if(myNextSection == RECORD) 00329 { 00330 // did not write a end marker record, so write one now. 00331 if(!writeRecord(myEndMarker)) 00332 { 00333 // Failed to write the end marker record. 00334 myStatus.setStatus(GlfStatus::FAIL_IO, 00335 "Failed to write end of chromosome/section marker."); 00336 throw(GlfException(myStatus)); 00337 return(false); 00338 } 00339 } 00340 00341 if(myNextSection != REF_SECTION) 00342 { 00343 // Not ready to write a reference section. 00344 myStatus.setStatus(GlfStatus::FAIL_IO, 00345 "Not ready for a chromosome/section header."); 00346 throw(GlfException(myStatus)); 00347 return(false); 00348 } 00349 00350 if(refSection.write(myFilePtr)) 00351 { 00352 myStatus = GlfStatus::SUCCESS; 00353 // A reference section has now been successfully written. 00354 myNextSection = RECORD; 00355 return(true); 00356 } 00357 00358 // return the status. 00359 myStatus.setStatus(GlfStatus::UNKNOWN, 00360 "Failed writing a reference section to the file."); 00361 throw(GlfException(myStatus)); 00362 return(false); 00363 }