00001
00002
00003
00004
00005
00006
00007
00008
00009 #include <cstring>
00010 #include "LtbReadoutFormat/LtbFrame.h"
00011
00012 #include "DaqReadoutFormat/ByteBuffer.h"
00013 #include "LtbReadoutFormat/LtbTime.h"
00014 #include "LtbReadoutFormat/LtbTraits.h"
00015
00016 using DybDaq::ByteBuffer;
00017 using DybDaq::LtbBuffer;
00018 using DybDaq::LtbFrame;
00019 using DybDaq::LtbTime;
00020 using DybDaq::LtbTraits;
00021
00022 LtbFrame::LtbFrame(const unsigned int readoutType,
00023 const unsigned int triggerMask,
00024 const LtbTraits::LtbDateTime& dateTime,
00025 const unsigned int halfNanoseconds,
00026 const int accumulation,
00027 const unsigned int hitSum,
00028 const bool totalEsum,
00029 const bool highEsum,
00030 const bool lowEsum,
00031 const unsigned int energySum,
00032 const unsigned int crossTriggerSource,
00033 const bool accumulationStatus,
00034 const bool validGps,
00035 const bool usingUtc,
00036 const bool validClockSystem,
00037 const bool feeBufferFull,
00038 const bool ltbBufferFull,
00039 const unsigned int blockedTriggerCount,
00040 const LtbTraits& traits) :
00041 LtbBuffer(new char[traits.frameSize() * kBytesInInt],
00042 traits),
00043 m_time(0) {
00044 traits.initializeFrame(buffer());
00045 setFrameNumber(0);
00046 setReadoutType(readoutType);
00047 setTriggerMask(triggerMask);
00048 m_time = new LtbTime(dateTime,
00049 halfNanoseconds,
00050 accumulation,
00051 traits);
00052 setHitSum(hitSum);
00053 setTotalEsum(totalEsum);
00054 setHighEsum(highEsum);
00055 setLowEsum(lowEsum);
00056 setEnergySum(energySum);
00057 setCrossTriggerSource(crossTriggerSource);
00058 setAccumulationStatus(accumulationStatus);
00059 setValidGps(validGps);
00060 setUsingUtc(usingUtc);
00061 setValidClockSystem(validClockSystem);
00062 setFeeBufferFull(feeBufferFull);
00063 setLtbBufferFull(ltbBufferFull);
00064 setBlockedTriggerCount(blockedTriggerCount);
00065 }
00066
00067
00068 LtbFrame::LtbFrame(const ByteBuffer& byteBuffer,
00069 const LtbTraits& traits) :
00070 LtbBuffer(byteBuffer,
00071 traits),
00072 m_time(0) {
00073 const unsigned int position = byteBuffer.position();
00074 byteBuffer.position(position + (ltbTraits().timeOffset() * kBytesInInt));
00075 m_time = new LtbTime(byteBuffer,
00076 traits);
00077 byteBuffer.position(position + (ltbTraits().frameSize() * kBytesInInt));
00078 }
00079
00080 LtbFrame::~LtbFrame() {
00081 if (0 != m_time) {
00082 delete m_time;
00083 }
00084 }
00085
00086 unsigned int LtbFrame::frameNumber() const {
00087 return readUnsignedInt(LtbTraits::kFrameNumber);
00088 }
00089
00090 unsigned int LtbFrame::readoutType() const {
00091 return readUnsignedInt(LtbTraits::kReadoutType);
00092 }
00093
00094 unsigned int LtbFrame::triggerMask() const {
00095 return readUnsignedInt(LtbTraits::kTriggerMask);
00096 }
00097
00098 bool LtbFrame::isTriggerLineSet(const unsigned int line) const {
00099 return 0 != (triggerMask() & ltbTraits().triggerLineBit(line));
00100 }
00101
00102 const LtbTraits::LtbDateTime& LtbFrame::dateTime() const {
00103 return *m_time;
00104 }
00105
00106 unsigned int LtbFrame::ticks() const {
00107 return m_time->ticks();
00108 }
00109
00110 unsigned int LtbFrame::halfNanoseconds() const {
00111 return m_time->halfNanoseconds();
00112 }
00113
00114 int LtbFrame::accumulation() const {
00115 return m_time->accumulation();
00116 }
00117
00118 unsigned int LtbFrame::hitSum() const {
00119 return readUnsignedInt(LtbTraits::kHitSum);
00120 }
00121
00122 bool LtbFrame::totalEsum() const {
00123 return readBool(LtbTraits::kTotalEsum);
00124 }
00125
00126 bool LtbFrame::highEsum() const {
00127 return readBool(LtbTraits::kHighEsum);
00128 }
00129
00130 bool LtbFrame::lowEsum() const {
00131 return readBool(LtbTraits::kLowEsum);
00132 }
00133
00134 unsigned int LtbFrame::energySum() const {
00135 return readUnsignedInt(LtbTraits::kEnergySum);
00136 }
00137
00138 unsigned int LtbFrame::crossTriggerSource() const {
00139 return readUnsignedInt(LtbTraits::kCrossTriggerSource);
00140 }
00141
00142 bool LtbFrame::accumulationStatus() const {
00143 return readBool(LtbTraits::kAccumulationStatus);
00144 }
00145
00146 bool LtbFrame::validGps() const {
00147 return readBool(LtbTraits::kValidGps);
00148 }
00149
00150 bool LtbFrame::usingUtc() const {
00151 return readBool(LtbTraits::kUsingUtc);
00152 }
00153
00154 bool LtbFrame::validClockSystem() const {
00155 return readBool(LtbTraits::kValidClockSystem);
00156 }
00157
00158 bool LtbFrame::feeBufferFull() const {
00159 return readBool(LtbTraits::kFeeBufferFull);
00160 }
00161
00162 bool LtbFrame::ltbBufferFull() const {
00163 return readBool(LtbTraits::kLtbBufferFull);
00164 }
00165
00166 unsigned int LtbFrame::blockedTriggerCount() const {
00167 return readUnsignedInt(LtbTraits::kBlockedTriggerCount);
00168 }
00169
00170 unsigned int LtbFrame::gather(OutputBufferList& outputBuffers) const {
00171 if (!hasByteBuffer()) {
00172 const LtbTraits& traits = ltbTraits();
00173 memcpy(const_cast<char*>(buffer()) + (traits.timeOffset() * kBytesInInt),
00174 m_time->buffer(),
00175 traits.timeSize() * kBytesInInt);
00176 }
00177 return LtbBuffer::gather(outputBuffers);
00178 }
00179
00180
00181 unsigned int LtbFrame::inspect(DaqBuffer::Bytes& inspectors) const {
00182 unsigned int cursor = fillInspectors(inspectors,
00183 LtbTraits::kFrameFront,
00184 0);
00185 cursor += m_time->inspect(inspectors);
00186 cursor = fillInspectors(inspectors,
00187 LtbTraits::kFrameBack,
00188 cursor + 1);
00189 return cursor + 1;
00190 }
00191
00192
00193 unsigned int LtbFrame::bufferSize() const {
00194 return ltbTraits().frameSize();
00195 }
00196
00197 void LtbFrame::setFrameNumber(const unsigned int frameNumber) {
00198 writeField(frameNumber,
00199 LtbTraits::kFrameNumber);
00200 }
00201
00202 void LtbFrame::setReadoutType(const unsigned int readoutType) {
00203 writeField(readoutType,
00204 LtbTraits::kReadoutType);
00205 }
00206
00207 void LtbFrame::setTriggerMask(const unsigned int triggerMask) {
00208 writeField(triggerMask,
00209 LtbTraits::kTriggerMask);
00210 }
00211
00212 void LtbFrame::setTriggerLine(const unsigned int line) {
00213 writeField((triggerMask() | ltbTraits().triggerLineBit(line)),
00214 LtbTraits::kTriggerMask);
00215 }
00216
00217 void LtbFrame::setDateTime(const LtbTraits::LtbDateTime& dateTime) {
00218 m_time->setDateTime(dateTime);
00219 }
00220
00221 void LtbFrame::setHalfNanoseconds(const unsigned int halfNanoseconds) {
00222 m_time->setHalfNanoseconds(halfNanoseconds);
00223 }
00224
00225 void LtbFrame::setAccumulation(const int accumulation) {
00226 m_time->setAccumulation(accumulation);
00227 }
00228
00229 void LtbFrame::setHitSum(const unsigned int hitSum) {
00230 writeField(hitSum,
00231 LtbTraits::kHitSum);
00232 }
00233
00234 void LtbFrame::setTotalEsum(const bool totalEsum) {
00235 writeField(totalEsum,
00236 LtbTraits::kTotalEsum);
00237 }
00238
00239 void LtbFrame::setHighEsum(const bool highEsum) {
00240 writeField(highEsum,
00241 LtbTraits::kHighEsum);
00242 }
00243
00244 void LtbFrame::setLowEsum(const bool lowEsum) {
00245 writeField(lowEsum,
00246 LtbTraits::kLowEsum);
00247 }
00248
00249 void LtbFrame::setEnergySum(const unsigned int energySum) {
00250 writeField(energySum,
00251 LtbTraits::kEnergySum);
00252 }
00253
00254 void LtbFrame::setCrossTriggerSource(const unsigned int crossTriggerSource) {
00255 writeField(crossTriggerSource,
00256 LtbTraits::kCrossTriggerSource);
00257 }
00258
00259 void LtbFrame::setAccumulationStatus(const bool accumulationStatus) {
00260 writeField(accumulationStatus,
00261 LtbTraits::kAccumulationStatus);
00262 }
00263
00264 void LtbFrame::setValidGps(const bool validGps) {
00265 writeField(validGps,
00266 LtbTraits::kValidGps);
00267 }
00268
00269 void LtbFrame::setUsingUtc(const bool usingUtc) {
00270 writeField(usingUtc,
00271 LtbTraits::kUsingUtc);
00272 }
00273
00274 void LtbFrame::setValidClockSystem(const bool validClockSystem) {
00275 writeField(validClockSystem,
00276 LtbTraits::kValidClockSystem);
00277 }
00278
00279 void LtbFrame::setFeeBufferFull(const bool feeBufferFull) {
00280 writeField(feeBufferFull,
00281 LtbTraits::kFeeBufferFull);
00282 }
00283
00284 void LtbFrame::setLtbBufferFull(const bool ltbBufferFull) {
00285 writeField(ltbBufferFull,
00286 LtbTraits::kLtbBufferFull);
00287 }
00288
00289 void LtbFrame::setBlockedTriggerCount(const unsigned int blockedTriggerCount) {
00290 writeField(blockedTriggerCount,
00291 LtbTraits::kBlockedTriggerCount);
00292 }
00293