File indexing completed on 2025-08-05 08:18:26
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030 #include "MilleBinary.h"
0031
0032
0033 namespace gbl {
0034
0035
0036
0037
0038
0039
0040
0041 MilleBinary::MilleBinary(const std::string &fileName, bool doublePrec,
0042 unsigned int aSize) :
0043 binaryFile(fileName.c_str(), std::ios::binary | std::ios::out), intBuffer(), floatBuffer(), doubleBuffer(), doublePrecision(
0044 doublePrec) {
0045 intBuffer.reserve(aSize);
0046 intBuffer.push_back(0);
0047 if (doublePrecision) {
0048 doubleBuffer.reserve(aSize);
0049 doubleBuffer.push_back(0.);
0050
0051 } else {
0052 floatBuffer.reserve(aSize);
0053 floatBuffer.push_back(0.);
0054 }
0055 }
0056
0057 MilleBinary::~MilleBinary() {
0058 binaryFile.close();
0059 }
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070 void MilleBinary::addData(double aMeas, double aErr,
0071 const std::vector<unsigned int> &indLocal,
0072 const std::vector<double> &derLocal, const std::vector<int> &labGlobal,
0073 const std::vector<double> &derGlobal) {
0074
0075 if (doublePrecision) {
0076
0077 intBuffer.push_back(0);
0078 doubleBuffer.push_back(aMeas);
0079 for (unsigned int i = 0; i < indLocal.size(); ++i) {
0080 intBuffer.push_back(indLocal[i]);
0081 doubleBuffer.push_back(derLocal[i]);
0082 }
0083 intBuffer.push_back(0);
0084 doubleBuffer.push_back(aErr);
0085 for (unsigned int i = 0; i < labGlobal.size(); ++i) {
0086 if (derGlobal[i]) {
0087 intBuffer.push_back(labGlobal[i]);
0088 doubleBuffer.push_back(derGlobal[i]);
0089 }
0090 }
0091 } else {
0092
0093 intBuffer.push_back(0);
0094 floatBuffer.push_back(aMeas);
0095 for (unsigned int i = 0; i < indLocal.size(); ++i) {
0096 intBuffer.push_back(indLocal[i]);
0097 floatBuffer.push_back(derLocal[i]);
0098 }
0099 intBuffer.push_back(0);
0100 floatBuffer.push_back(aErr);
0101 for (unsigned int i = 0; i < labGlobal.size(); ++i) {
0102 if (derGlobal[i]) {
0103 intBuffer.push_back(labGlobal[i]);
0104 floatBuffer.push_back(derGlobal[i]);
0105 }
0106 }
0107 }
0108 }
0109
0110
0111 void MilleBinary::writeRecord() {
0112
0113 const int recordLength =
0114 (doublePrecision) ? -intBuffer.size() * 2 : intBuffer.size() * 2;
0115 binaryFile.write(reinterpret_cast<const char*>(&recordLength),
0116 sizeof(recordLength));
0117 if (doublePrecision)
0118 binaryFile.write(reinterpret_cast<char*>(&doubleBuffer[0]),
0119 doubleBuffer.size() * sizeof(doubleBuffer[0]));
0120 else
0121 binaryFile.write(reinterpret_cast<char*>(&floatBuffer[0]),
0122 floatBuffer.size() * sizeof(floatBuffer[0]));
0123 binaryFile.write(reinterpret_cast<char*>(&intBuffer[0]),
0124 intBuffer.size() * sizeof(intBuffer[0]));
0125
0126 intBuffer.resize(1);
0127 if (doublePrecision)
0128 doubleBuffer.resize(1);
0129 else
0130 floatBuffer.resize(1);
0131 }
0132 }