From 83ff4ab1123d75087f062dcf9d82f2ae29362638 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Fri, 18 Feb 2022 15:51:54 +0100 Subject: [PATCH] hdf5 doestn work yet, wip --- slsDetectorGui/src/qDrawPlot.cpp | 20 +++++----------- .../slsDetectorFunctionList.c | 15 +++++------- slsReceiverSoftware/src/HDF5DataFile.cpp | 24 ++++++++++++++++++- slsReceiverSoftware/src/HDF5DataFile.h | 4 ++++ 4 files changed, 39 insertions(+), 24 deletions(-) diff --git a/slsDetectorGui/src/qDrawPlot.cpp b/slsDetectorGui/src/qDrawPlot.cpp index 062bc2eb1..a95c9efcd 100644 --- a/slsDetectorGui/src/qDrawPlot.cpp +++ b/slsDetectorGui/src/qDrawPlot.cpp @@ -1065,6 +1065,7 @@ void qDrawPlot::toDoublePixelData(double *dest, char *source, int size, int discardBits = numDiscardBits; uint16_t temp = 0; + uint8_t *src = (uint8_t *)source; switch (dr) { case 4: @@ -1086,22 +1087,13 @@ void qDrawPlot::toDoublePixelData(double *dest, char *source, int size, case 12: for (ichan = 0; ichan < size; ++ichan) { - // first 12 bit pixel - // lsb (8 bytes) - temp = (*((u_int8_t *)source)) & 0xFF; - ++source; - // msb (4 bytes) - temp |= (((*((u_int8_t *)source)) & 0xF) << 8); + temp = (*src++ & 0xFF); + temp |= ((*src & 0xF) << 8u); dest[ichan] = (double)temp; - - // second 12bit pixel ++ichan; - // lsb (4 bytes) - temp = (((*((u_int8_t *)source)) & 0xF0) >> 4); - ++source; - // msb (8 bytes) - temp |= (((*((u_int8_t *)source)) & 0xFF) << 4); - ++source; + + temp = ((*src++ & 0xF0) >> 4u); + temp |= ((*src++ & 0xFF) << 4u); dest[ichan] = (double)temp; } break; diff --git a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c index 0a25fac2c..1d9661987 100644 --- a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c @@ -2377,14 +2377,12 @@ void *start_timer(void *arg) { case 12: // first 12 bit pixel // first 8 byte - *source = - eiger_virtual_test_mode ? 0xFE : (uint8_t)(pixelVal & 0xFF); + *source = eiger_virtual_test_mode ? 0xFE : (uint8_t)(i & 0xFF); ++source; // second 8 byte (first nibble) - temp = eiger_virtual_test_mode - ? 0xF - : (uint8_t)((pixelVal >> 8) & 0xF); + temp = + eiger_virtual_test_mode ? 0xF : (uint8_t)((i >> 8) & 0xF); // second 12bit pixel ++i; @@ -2392,13 +2390,12 @@ void *start_timer(void *arg) { // second 8 byte (second nibble) *source = eiger_virtual_test_mode ? 0xE - : temp | ((uint8_t)(pixelVal & 0xF) << 4); + : temp | ((uint8_t)(i & 0xF) << 4); ++source; // third byte - *source = eiger_virtual_test_mode - ? 0xFF - : (uint8_t)((pixelVal >> 4) & 0xFF); + *source = + eiger_virtual_test_mode ? 0xFF : (uint8_t)((i >> 4) & 0xFF); ++source; break; diff --git a/slsReceiverSoftware/src/HDF5DataFile.cpp b/slsReceiverSoftware/src/HDF5DataFile.cpp index a521d17dc..7924da1a4 100644 --- a/slsReceiverSoftware/src/HDF5DataFile.cpp +++ b/slsReceiverSoftware/src/HDF5DataFile.cpp @@ -249,8 +249,30 @@ void HDF5DataFile::WriteToFile(char *buffer, const int buffersize, WriteParameterDatasets(currentFrameNumber, (sls_receiver_header *)(buffer)); } +void HDF5DataFile::Convert12to16Bit(uint16_t *dst, uint8_t *src) { + for (int i = 0; i < EIGER_NUM_PIXELS; ++i) { + *dst = (*src++ & 0xFF); + *dst++ |= ((*src & 0xF) << 8); + ++i; + *dst = ((*src++ & 0xF0) >> 4); + *dst++ |= ((*src++ & 0xFF) << 4); + } +} + void HDF5DataFile::WriteDataFile(const uint64_t currentFrameNumber, char *buffer) { + char *revBuffer = buffer; + if (dynamicRange_ == 12) { + revBuffer = (char *)malloc(EIGER_16_BIT_IMAGE_SIZE); + if (revBuffer == nullptr) { + throw sls::RuntimeError("Could not allocate memory for 12 bit to " + "16 bit conversion in object " + + std::to_string(index_)); + } + Convert12to16Bit((uint16_t *)revBuffer, (uint8_t *)buffer); + free(revBuffer); + } + std::lock_guard lock(*hdf5Lib_); uint64_t nDimx = @@ -267,7 +289,7 @@ void HDF5DataFile::WriteDataFile(const uint64_t currentFrameNumber, dataSpace_->selectHyperslab(H5S_SELECT_SET, count, start); DataSpace memspace(2, dims2); - dataSet_->write(buffer, dataType_, memspace, *dataSpace_); + dataSet_->write(revBuffer, dataType_, memspace, *dataSpace_); memspace.close(); } catch (const Exception &error) { LOG(logERROR) << "Could not write to file in object " << index_; diff --git a/slsReceiverSoftware/src/HDF5DataFile.h b/slsReceiverSoftware/src/HDF5DataFile.h index a2e2aa78a..dc1c2ae5e 100644 --- a/slsReceiverSoftware/src/HDF5DataFile.h +++ b/slsReceiverSoftware/src/HDF5DataFile.h @@ -35,6 +35,7 @@ class HDF5DataFile : private virtual slsDetectorDefs, public File { private: void CreateFile(); + void Convert12to16Bit(uint16_t *dst, uint8_t *src); void WriteDataFile(const uint64_t currentFrameNumber, char *buffer); void WriteParameterDatasets(const uint64_t currentFrameNumber, sls_receiver_header *rheader); @@ -72,4 +73,7 @@ class HDF5DataFile : private virtual slsDetectorDefs, public File { int detIndex_{0}; int numUnitsPerReadout_{0}; uint32_t udpPortNumber_{0}; + + static const int EIGER_NUM_PIXELS{256 * 2 * 256}; + static const int EIGER_16_BIT_IMAGE_SIZE{EIGER_NUM_PIXELS * 2}; }; \ No newline at end of file