00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "FileReadoutFormat/FileTraits.h"
00010
00011 #include <map>
00012
00013 #include "FileReadoutFormat/FileTraits_v0_6.h"
00014 #include "FileReadoutFormat/FileTraits_v0_7.h"
00015 #include "FileReadoutFormat/FileTraits_v0_8.h"
00016 #include "FileReadoutFormat/FileTraits_v0_9.h"
00017
00018 using DybDaq::FileTraits;
00019 using std::string;
00020
00021 const unsigned int FileTraits::kIllegalRecord = 0xffffffffU;
00022 const unsigned int FileTraits::kFileStartRecord = 0;
00023 const unsigned int FileTraits::kFileNameStrings = FileTraits::kFileStartRecord + 1;
00024 const unsigned int FileTraits::kMetadataStrings = FileTraits::kFileNameStrings + 1;
00025 const unsigned int FileTraits::kRunParametersRecord = FileTraits::kMetadataStrings + 1;
00026 const unsigned int FileTraits::kCalibrationParametersRecord = FileTraits::kRunParametersRecord + 1;
00027 const unsigned int FileTraits::kDataSeparatorRecord = FileTraits::kCalibrationParametersRecord + 1;
00028 const unsigned int FileTraits::kFileEndRecord = FileTraits::kDataSeparatorRecord + 1;
00029 const unsigned int FileTraits::kFileEndMarker = FileTraits::kFileEndRecord + 1;
00030
00031
00032
00033 const unsigned int FileTraits::kIllegalField = 0xffffffffU;
00034 const unsigned int FileTraits::kMarker = 0;
00035 const unsigned int FileTraits::kRecordSize = FileTraits::kMarker + 1;
00036
00037
00038
00039 const unsigned int FileTraits::kMajorVersion = FileTraits::kRecordSize + 1;
00040 const unsigned int FileTraits::kMinorVersion = FileTraits::kMajorVersion + 1;
00041 const unsigned int FileTraits::kFileNumber = FileTraits::kMinorVersion + 1;
00042 const unsigned int FileTraits::kFileOpenDate = FileTraits::kFileNumber + 1;
00043 const unsigned int FileTraits::kFileOpenTime = FileTraits::kFileOpenDate + 1;
00044 const unsigned int FileTraits::kDataBlockLimit = FileTraits::kFileOpenTime + 1;
00045 const unsigned int FileTraits::kMegabyteLimit = FileTraits::kDataBlockLimit + 1;
00046
00047 const unsigned int FileTraits::kFirstNameLength = FileTraits::kMegabyteLimit + 1;
00048
00049 const unsigned int FileTraits::kMetadataCount = FileTraits::kFirstNameLength + 1;
00050 const unsigned int FileTraits::kFirstMetadataLength = FileTraits::kMetadataCount + 1;
00051
00052 const unsigned int FileTraits::kFileRunNumber = FileTraits::kFirstMetadataLength + 1;
00053 const unsigned int FileTraits::kRecordEnabled = FileTraits::kFileRunNumber + 1;
00054 const unsigned int FileTraits::kRunTriggerType = FileTraits::kRecordEnabled + 1;
00055 const unsigned int FileTraits::kRunDetectorMask = FileTraits::kRunTriggerType + 1;
00056
00057 const unsigned int FileTraits::kCalibrationDetectorId = FileTraits::kRunDetectorMask + 1;
00058 const unsigned int FileTraits::kCalibrationAxis = FileTraits::kCalibrationDetectorId + 1;
00059 const unsigned int FileTraits::kCalibrationSourceId = FileTraits::kCalibrationAxis + 1;
00060 const unsigned int FileTraits::kCalibrationZPosition = FileTraits::kCalibrationSourceId + 1;
00061 const unsigned int FileTraits::kCalibrationDuration = FileTraits::kCalibrationZPosition + 1;
00062 const unsigned int FileTraits::kCalibrationLedFrequency = FileTraits::kCalibrationDuration + 1;
00063 const unsigned int FileTraits::kCalibrationLtbMode = FileTraits::kCalibrationLedFrequency + 1;
00064
00065 const unsigned int FileTraits::kBlockNumber = FileTraits::kCalibrationLtbMode + 1;
00066 const unsigned int FileTraits::kBlockLength = FileTraits::kBlockNumber + 1;
00067
00068 const unsigned int FileTraits::kFileCloseDate = FileTraits::kBlockLength + 1;
00069 const unsigned int FileTraits::kFileCloseTime = FileTraits::kFileCloseDate + 1;
00070 const unsigned int FileTraits::kFileEventCount = FileTraits::kFileCloseTime + 1;
00071 const unsigned int FileTraits::kFilePayloadSize = FileTraits::kFileEventCount + 1;
00072 const unsigned int FileTraits::kRunEventCount = FileTraits::kFilePayloadSize + 1;
00073 const unsigned int FileTraits::kRunPayloadSize = FileTraits::kRunEventCount + 1;
00074 const unsigned int FileTraits::kFileEndStatus = FileTraits::kRunPayloadSize + 1;
00075 const unsigned int FileTraits::kEndFileMarker = FileTraits::kFileEndStatus + 1;
00076
00077
00078
00079 const unsigned int FileTraits::kCalibrationAdNumber = FileTraits::kEndFileMarker + 1;
00080 const unsigned int FileTraits::kCalibrationLedNumber1 = FileTraits::kCalibrationAdNumber + 1;
00081 const unsigned int FileTraits::kCalibrationLedNumber2 = FileTraits::kCalibrationLedNumber1 + 1;
00082 const unsigned int FileTraits::kCalibrationLedVoltage1 = FileTraits::kCalibrationLedNumber2 + 1;
00083 const unsigned int FileTraits::kCalibrationLedVoltage2 = FileTraits::kCalibrationLedVoltage1 + 1;
00084 const unsigned int FileTraits::kCalibrationLedPulseSeparation = FileTraits::kCalibrationLedVoltage2 + 1;
00085
00086
00087
00088 const unsigned int FileTraits::kCalibrationSourceIdA = FileTraits::kCalibrationLedPulseSeparation + 1;
00089 const unsigned int FileTraits::kCalibrationZPositionA = FileTraits::kCalibrationSourceIdA + 1;
00090 const unsigned int FileTraits::kCalibrationSourceIdB = FileTraits::kCalibrationZPositionA + 1;
00091 const unsigned int FileTraits::kCalibrationZPositionB = FileTraits::kCalibrationSourceIdB + 1;
00092 const unsigned int FileTraits::kCalibrationSourceIdC = FileTraits::kCalibrationZPositionB + 1;
00093 const unsigned int FileTraits::kCalibrationZPositionC = FileTraits::kCalibrationSourceIdC + 1;
00094 const unsigned int FileTraits::kCalibrationMotorPower = FileTraits::kCalibrationZPositionC + 1;
00095 const unsigned int FileTraits::kCalibrationCameraPower = FileTraits::kCalibrationMotorPower + 1;
00096 const unsigned int FileTraits::kCalibrationLedFlashing = FileTraits::kCalibrationCameraPower + 1;
00097
00098
00099
00100 const unsigned int FileTraits::kCalibrationHomeA = FileTraits::kCalibrationCameraPower + 1;
00101 const unsigned int FileTraits::kCalibrationHomeB = FileTraits::kCalibrationHomeA + 1;
00102 const unsigned int FileTraits::kCalibrationHomeC = FileTraits::kCalibrationHomeB + 1;
00103
00104 static const unsigned int kLengthOfDateTime = 25;
00105 static std::map<const char*, FileTraits*> m_allTraits;
00106
00107 FileTraits::FileTraits() {
00108 }
00109
00110 FileTraits::~FileTraits() {
00111 }
00112
00113 const FileTraits& FileTraits::defaultTraits() {
00114 if (0 == m_allTraits.size()) {
00115 m_allTraits.insert(std::pair<const char*, FileTraits*>(FileTraits_v0_6::key(),new FileTraits_v0_6()));
00116 m_allTraits.insert(std::pair<const char*, FileTraits*>(FileTraits_v0_7::key(),new FileTraits_v0_7()));
00117 m_allTraits.insert(std::pair<const char*, FileTraits*>(FileTraits_v0_8::key(),new FileTraits_v0_8()));
00118 m_allTraits.insert(std::pair<const char*, FileTraits*>(FileTraits_v0_9::key(),new FileTraits_v0_9()));
00119 }
00120 return *m_allTraits[FileTraits_v0_9::key()];
00121 }
00122
00123 const FileTraits* FileTraits::readTraits(const char*& buffer) {
00124 const FileTraits& traits = defaultTraits();
00125 const unsigned int major = readUnsignedInt(buffer,
00126 traits,
00127 kMajorVersion);
00128 const unsigned int minor = readUnsignedInt(buffer,
00129 traits,
00130 kMinorVersion);
00131 const FileTraits* result = 0;
00132 if (0U == major && 6U == minor) {
00133 result = m_allTraits[FileTraits_v0_6::key()];
00134 } else if (0U == major && 7U == minor) {
00135 result = m_allTraits[FileTraits_v0_7::key()];
00136 } else if (0U == major && 8U == minor) {
00137 result = m_allTraits[FileTraits_v0_8::key()];
00138 } else if (0U == major && 9U == minor) {
00139 result = m_allTraits[FileTraits_v0_9::key()];
00140 }
00141 return result;
00142 }
00143
00144 unsigned int FileTraits::illegalMarker() const {
00145 return 0xffffffffU;
00146 }
00147
00148 unsigned int FileTraits::illegalField() const {
00149 return 0xffffffffU;
00150 }
00151
00152 unsigned int FileTraits::recordSize(unsigned int marker) const {
00153 if (marker >= markersEnd()) {
00154 return 0U;
00155 }
00156 return recordSizes()[marker];
00157 }
00158
00159 const FileTraits::DetectorList* FileTraits::detectorList(const unsigned int mask) const {
00160 DetectorList* result = new DetectorList();
00161 unsigned int bit = 1;
00162 for (unsigned int line = 0; line != detectorListEnd(); ++ line) {
00163 if (mask & bit) {
00164 result->push_back(detectorAsString(line));
00165 }
00166 bit = bit << 1;
00167 }
00168 return result;
00169 }
00170
00171 const char* FileTraits::detectorAsString(unsigned int line) const {
00172 if (line >= detectorListEnd()) {
00173 return "Unknown";
00174 }
00175 return detectorStrings()[line];
00176 }
00177
00178 const string FileTraits::dateTimeAsString(const FileDateTime& time) const {
00179 char* dateTime = new char[kLengthOfDateTime];
00180 if (0 == strftime(dateTime,
00181 kLengthOfDateTime,
00182 "%Y-%m-%dT%H:%M:%S+0800",
00183 &time)) {
00184 return "0000-00-00T00:00:00+0800";
00185 };
00186 dateTime[kLengthOfDateTime - 1] = 0;
00187 string result(dateTime);
00188 delete dateTime;
00189 return result;
00190 }
00191
00192 const FileTraits::FileDateTime* FileTraits::makeDateTime(const time_t& time) const {
00193 FileDateTime* result = new FileDateTime(*(gmtime(&time)));
00194 return result;
00195 }
00196
00197 unsigned int FileTraits::firstNameLengthOffset() const {
00198 return index(FileTraits::kFirstNameLength);
00199 }
00200
00201 unsigned int FileTraits::firstMetadataLengthOffset() const {
00202 return index(FileTraits::kFirstMetadataLength);
00203 }