#include "MaskFile.h" #include #include #include /* FORMAT HEADER (contains rxntype & nuclei numbers & beam kinetic energy) (64 bits, 8 bytes) NSAMPLES(32bit) RXNTYPE(32bit) end HEADER There are NSAMPLES * (number of saved nuclei) data in the file. The number of nuclei saved is related to the RXNTYPE. All nuclei (target, projectile, ejectile, residual, break1, etc...) are saved. A datum is as follows: DATUM (contains kinematic data for a nucleus) (384 bits, 48 bytes) Z(32bit) A(32bit) DETECTFLAG(32bit) E(64bit) KE(64bit) P(64bit) THETA(64bit) PHI(64bit) end DATUM */ namespace Mask { MaskFile::MaskFile() : file_type(MaskFile::FileType::none), filename(""), buffer_position(0), buffer_end(0), data_size(0), buffersize_bytes(0), file() { } MaskFile::MaskFile(const std::string& name, MaskFile::FileType type) : file_type(type), filename(name), buffer_position(0), buffer_end(0), data_size(0), buffersize_bytes(0), file() { Open(filename, type); } bool MaskFile::Open(const std::string& name, MaskFile::FileType type) { if(IsOpen()) { std::cerr<<"Attempted to open file that is already open!"< 0 && buffer_position < buffersize_bytes && (file_type == FileType::write || file_type == FileType::append)) { file.write(data_buffer.data(), buffer_position); } file.close(); } void MaskFile::WriteHeader(RxnType rxn_type, int nsamples) { m_rxn_type = rxn_type; switch(rxn_type) { case RxnType::PureDecay : { data_size = 3 * ( 5 * double_size + 2 * int_size + bool_size); break; } case RxnType::OneStepRxn : { data_size = 4 * ( 5 * double_size + 2 * int_size + bool_size); break; } case RxnType::TwoStepRxn : { data_size = 6 * ( 5 * double_size + 2 * int_size + bool_size); break; } case RxnType::ThreeStepRxn : { data_size = 8 * ( 5 * double_size + 2 * int_size + bool_size); break; } case RxnType::None : { std::cerr<<"Invalid RxnType at MaskFile::WriteHeader!"< temp_buffer(4); file.read(temp_buffer.data(), 4); header.nsamples = *(int*)(&temp_buffer[0]); file.read(temp_buffer.data(), 4); uint32_t type_value = *(uint32_t*)(&temp_buffer[0]); m_rxn_type = GetRxnTypeFromInt(type_value); switch(m_rxn_type) { case RxnType::PureDecay: { data_size = 3 * ( 5 * double_size + 2 * int_size + bool_size); break; } case RxnType::OneStepRxn: { data_size = 4 * ( 5 * double_size + 2 * int_size + bool_size); break; } case RxnType::TwoStepRxn: { data_size = 6 * ( 5 * double_size + 2 * int_size + bool_size); break; } case RxnType::ThreeStepRxn: { data_size = 8 * ( 5 * double_size + 2 * int_size + bool_size); break; } case RxnType::None: { std::cerr<<"Unexpected reaction type at MaskFile::ReadHeader (rxn type = "<& data) { char* data_pointer; double datum; int number; bool flag; std::size_t j; for(unsigned int i=0; i buffer_end) { std::cerr<<"Attempting to read past end of file at MaskFile::ReadData! Returning empty"<