moench has only analog readout

This commit is contained in:
maliakal_d 2019-03-06 14:52:21 +01:00
parent 2676e8b43d
commit abc7a9bd2f
7 changed files with 124 additions and 135 deletions

View File

@ -530,7 +530,9 @@ void setupDetector() {
setTimer(FRAME_PERIOD, DEFAULT_PERIOD); setTimer(FRAME_PERIOD, DEFAULT_PERIOD);
setTimer(DELAY_AFTER_TRIGGER, DEFAULT_DELAY); setTimer(DELAY_AFTER_TRIGGER, DEFAULT_DELAY);
setTiming(DEFAULT_TIMING_MODE); setTiming(DEFAULT_TIMING_MODE);
setReadOutFlags(NORMAL_READOUT);
// ensuring normal readout (only option for moench)
bus_w(addr, bus_r(addr) & (~CONFIG_DSBL_ANLG_OTPT_MSK) & (~CONFIG_ENBLE_DGTL_OTPT_MSK));
// clear roi // clear roi
{ {
@ -819,60 +821,6 @@ int getSpeed(enum speedVariable ind) {
} }
} }
enum readOutFlags setReadOutFlags(enum readOutFlags val) {
enum readOutFlags retval = GET_READOUT_FLAGS;
uint32_t addr = CONFIG_REG;
// set
if (val != GET_READOUT_FLAGS) {
switch(val) {
case NORMAL_READOUT:
FILE_LOG(logINFO, ("Setting Normal Readout\n"));
bus_w(addr, bus_r(addr) & (~CONFIG_DSBL_ANLG_OTPT_MSK) & (~CONFIG_ENBLE_DGTL_OTPT_MSK));
break;
case DIGITAL_ONLY:
FILE_LOG(logINFO, ("Setting Digital Only Readout\n"));
bus_w(addr, bus_r(addr) | CONFIG_DSBL_ANLG_OTPT_MSK | CONFIG_ENBLE_DGTL_OTPT_MSK);
break;
case ANALOG_AND_DIGITAL:
FILE_LOG(logINFO, ("Setting Analog & Digital Readout\n"));
bus_w(addr, (bus_r(addr) & (~CONFIG_DSBL_ANLG_OTPT_MSK)) | CONFIG_ENBLE_DGTL_OTPT_MSK);
break;
default:
FILE_LOG(logERROR, ("Cannot set unknown readout flag. 0x%x\n", val));
return retval;
}
}
// get
uint32_t regval = bus_r(addr);
FILE_LOG(logDEBUG1, ("Config Reg: 0x%08x\n", regval));
// this bit reads analog disable, so inverse
analogEnable = (((regval & CONFIG_DSBL_ANLG_OTPT_MSK) >> CONFIG_DSBL_ANLG_OTPT_OFST) ? 0 : 1);
digitalEnable = ((regval & CONFIG_ENBLE_DGTL_OTPT_MSK) >> CONFIG_ENBLE_DGTL_OTPT_OFST);
if (analogEnable && digitalEnable) {
FILE_LOG(logDEBUG1, ("Getting readout: Analog & Digital\n"));
retval = ANALOG_AND_DIGITAL;
} else if (analogEnable && !digitalEnable) {
FILE_LOG(logDEBUG1, ("Getting readout: Normal\n"));
retval = NORMAL_READOUT;
} else if (!analogEnable && digitalEnable) {
FILE_LOG(logDEBUG1, ("Getting readout: Digital Only\n"));
retval = DIGITAL_ONLY;
} else {
FILE_LOG(logERROR, ("Read unknown readout (Both digital and analog are disabled). "
"Config reg: 0x%x\n", regval));
return retval;
}
// update databytes and allocate ram
if (allocateRAM() == FAIL) {
return -2;
}
return retval;
}
/* parameters - timer */ /* parameters - timer */

View File

@ -120,7 +120,7 @@ void setSpeed(enum speedVariable ind, int val);
int getSpeed(enum speedVariable ind); int getSpeed(enum speedVariable ind);
#endif #endif
#if defined(EIGERD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) #if defined(EIGERD) || defined(CHIPTESTBOARDD)
enum readOutFlags setReadOutFlags(enum readOutFlags val); enum readOutFlags setReadOutFlags(enum readOutFlags val);
#endif #endif

View File

@ -1797,7 +1797,7 @@ int set_readout_flags(int file_des) {
return printSocketReadError(); return printSocketReadError();
FILE_LOG(logDEBUG1, ("Setting readout flags to %d\n", arg)); FILE_LOG(logDEBUG1, ("Setting readout flags to %d\n", arg));
#if defined(JUNGFRAUD) || defined(GOTTHARDD) #if defined(JUNGFRAUD) || defined(GOTTHARDD) || defined(MOENCHD)
functionNotImplemented(); functionNotImplemented();
#else #else
// set & get // set & get
@ -1805,6 +1805,7 @@ int set_readout_flags(int file_des) {
switch(arg) { switch(arg) {
case GET_READOUT_FLAGS: case GET_READOUT_FLAGS:
#ifdef EIGERD
case STORE_IN_RAM: case STORE_IN_RAM:
case CONTINOUS_RO: case CONTINOUS_RO:
case PARALLEL: case PARALLEL:
@ -1812,7 +1813,7 @@ int set_readout_flags(int file_des) {
case SAFE: case SAFE:
case SHOW_OVERFLOW: case SHOW_OVERFLOW:
case NOOVERFLOW: case NOOVERFLOW:
#if defined(CHIPTESTBOARDD) || defined(MOENCHD) #elif CHIPTESTBOARDD
case NORMAL_READOUT: case NORMAL_READOUT:
case DIGITAL_ONLY: case DIGITAL_ONLY:
case ANALOG_AND_DIGITAL: case ANALOG_AND_DIGITAL:
@ -2178,7 +2179,7 @@ int send_update(int file_des) {
n = sendData(file_des,&i64,sizeof(i64),INT64); n = sendData(file_des,&i64,sizeof(i64),INT64);
if (n < 0) return printSocketReadError(); if (n < 0) return printSocketReadError();
#if defined(EIGERD) || defined(CHIPTESTBOARDD) || defined(MOENCHD) #if defined(EIGERD) || defined(CHIPTESTBOARDD)
i32 = setReadOutFlags(GET_READOUT_FLAGS); i32 = setReadOutFlags(GET_READOUT_FLAGS);
n = sendData(file_des,&i32,sizeof(i32),INT32); n = sendData(file_des,&i32,sizeof(i32),INT32);
if (n < 0) return printSocketReadError(); if (n < 0) return printSocketReadError();

View File

@ -1102,7 +1102,7 @@ int slsDetector::updateDetectorNoWait(sls::ClientSocket &client) {
// readout flags // readout flags
if (thisDetector->myDetectorType == EIGER || if (thisDetector->myDetectorType == EIGER ||
thisDetector->myDetectorType == CHIPTESTBOARD || thisDetector->myDetectorType == MOENCH) { thisDetector->myDetectorType == CHIPTESTBOARD) {
n += client.receiveData(&i32, sizeof(i32)); n += client.receiveData(&i32, sizeof(i32));
thisDetector->roFlags = (readOutFlags)i32; thisDetector->roFlags = (readOutFlags)i32;
} }
@ -2449,28 +2449,46 @@ std::string slsDetector::setReceiver(const std::string &receiverIP) {
overwriteFile(thisDetector->receiver_overWriteEnable); overwriteFile(thisDetector->receiver_overWriteEnable);
setTimer(FRAME_PERIOD, thisDetector->timerValue[FRAME_PERIOD]); setTimer(FRAME_PERIOD, thisDetector->timerValue[FRAME_PERIOD]);
setTimer(FRAME_NUMBER, thisDetector->timerValue[FRAME_NUMBER]); setTimer(FRAME_NUMBER, thisDetector->timerValue[FRAME_NUMBER]);
if (thisDetector->myDetectorType != CHIPTESTBOARD && thisDetector->myDetectorType != MOENCH) {
// detector specific
switch(thisDetector->myDetectorType) {
case GOTTHARD:
setTimer(ACQUISITION_TIME, thisDetector->timerValue[ACQUISITION_TIME]); setTimer(ACQUISITION_TIME, thisDetector->timerValue[ACQUISITION_TIME]);
}
if (thisDetector->myDetectorType == EIGER) { break;
setTimer(SUBFRAME_ACQUISITION_TIME, case JUNGFRAU:
thisDetector->timerValue[SUBFRAME_ACQUISITION_TIME]); setTimer(ACQUISITION_TIME, thisDetector->timerValue[ACQUISITION_TIME]);
break;
case EIGER:
setTimer(ACQUISITION_TIME, thisDetector->timerValue[ACQUISITION_TIME]);
setTimer(SUBFRAME_ACQUISITION_TIME, thisDetector->timerValue[SUBFRAME_ACQUISITION_TIME]);
setTimer(SUBFRAME_DEADTIME, thisDetector->timerValue[SUBFRAME_DEADTIME]); setTimer(SUBFRAME_DEADTIME, thisDetector->timerValue[SUBFRAME_DEADTIME]);
}
setDynamicRange(thisDetector->dynamicRange); setDynamicRange(thisDetector->dynamicRange);
if (thisDetector->myDetectorType == CHIPTESTBOARD || thisDetector->myDetectorType == MOENCH) {
setTimer(SAMPLES, thisDetector->timerValue[SAMPLES]);
}
if (thisDetector->myDetectorType == EIGER) {
setFlippedData(X, -1); setFlippedData(X, -1);
activate(-1); activate(-1);
setDeactivatedRxrPaddingMode(thisDetector->receiver_deactivatedPaddingEnable); setDeactivatedRxrPaddingMode(thisDetector->receiver_deactivatedPaddingEnable);
enableGapPixels(thisDetector->gappixels); enableGapPixels(thisDetector->gappixels);
}
if (thisDetector->myDetectorType == EIGER || thisDetector->myDetectorType == CHIPTESTBOARD || thisDetector->myDetectorType == MOENCH) {
enableTenGigabitEthernet(thisDetector->tenGigaEnable); enableTenGigabitEthernet(thisDetector->tenGigaEnable);
setReadOutFlags(GET_READOUT_FLAGS); setReadOutFlags(GET_READOUT_FLAGS);
break;
case CHIPTESTBOARD:
setTimer(SAMPLES, thisDetector->timerValue[SAMPLES]);
enableTenGigabitEthernet(thisDetector->tenGigaEnable);
setReadOutFlags(GET_READOUT_FLAGS);
break;
case MOENCH:
setTimer(SAMPLES, thisDetector->timerValue[SAMPLES]);
enableTenGigabitEthernet(thisDetector->tenGigaEnable);
break;
default:
break;
} }
setReceiverSilentMode(thisDetector->receiver_silentMode); setReceiverSilentMode(thisDetector->receiver_silentMode);
// data streaming // data streaming
setReceiverStreamingFrequency(thisDetector->receiver_read_freq); setReceiverStreamingFrequency(thisDetector->receiver_read_freq);

View File

@ -213,7 +213,7 @@ public:
* @param s number of samples * @param s number of samples
* @param t tengiga enable * @param t tengiga enable
*/ */
virtual void setImageSize(slsDetectorDefs::readOutFlags f, std::vector<slsDetectorDefs::ROI> i, int s, bool t) { virtual void setImageSize(std::vector<slsDetectorDefs::ROI> i, int s, bool t, slsDetectorDefs::readOutFlags f = slsDetectorDefs::GET_READOUT_FLAGS) {
cprintf(RED,"setImageSize is a generic function that should be overloaded by a derived class\n"); cprintf(RED,"setImageSize is a generic function that should be overloaded by a derived class\n");
}; };
@ -535,12 +535,13 @@ public:
ChipTestBoardData(){ ChipTestBoardData(){
myDetectorType = slsDetectorDefs::CHIPTESTBOARD; myDetectorType = slsDetectorDefs::CHIPTESTBOARD;
nPixelsX = 36; // total number of channels nPixelsX = 36; // total number of channels
nPixelsY = 1; // numberofsamples nPixelsY = 1; // number of samples
headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header); headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header);
dataSize = UDP_PACKET_DATA_BYTES; dataSize = UDP_PACKET_DATA_BYTES;
packetSize = headerSizeinPacket + dataSize; packetSize = headerSizeinPacket + dataSize;
packetsPerFrame = 0; // to be calculated //packetsPerFrame = 1;
imageSize = 0; // to be calculated imageSize = nPixelsX * nPixelsY * 2;
packetsPerFrame = ceil((double)imageSize / (double)UDP_PACKET_DATA_BYTES);
maxFramesPerFile = CTB_MAX_FRAMES_PER_FILE; maxFramesPerFile = CTB_MAX_FRAMES_PER_FILE;
fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header); fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header);
defaultFifoDepth = 2500; defaultFifoDepth = 2500;
@ -554,7 +555,7 @@ public:
* @param s number of samples * @param s number of samples
* @param t tengiga enable * @param t tengiga enable
*/ */
void setImageSize(slsDetectorDefs::readOutFlags f, std::vector<slsDetectorDefs::ROI> i, int s, bool t) { void setImageSize(std::vector<slsDetectorDefs::ROI> i, int s, bool t, slsDetectorDefs::readOutFlags f = slsDetectorDefs::GET_READOUT_FLAGS) {
int nchans = 0; int nchans = 0;
if (f != slsDetectorDefs::GET_READOUT_FLAGS) { if (f != slsDetectorDefs::GET_READOUT_FLAGS) {
// analog channels // analog channels
@ -596,7 +597,12 @@ class MoenchData : public GeneralData {
private: private:
/** Structure of an jungfrau ctb packet header */ /** Number of analog channels */
const int NCHAN_ANALOG = 32;
/** Number of bytes per pixel */
const int NUM_BYTES_PER_PIXEL = 2;
/** Structure of an jungfrau ctb packet header (10G Udp) */
typedef struct { typedef struct {
unsigned char emptyHeader[6]; unsigned char emptyHeader[6];
unsigned char reserved[4]; unsigned char reserved[4];
@ -607,23 +613,22 @@ private:
public: public:
/** Bytes Per Adc */
const uint32_t bytesPerAdc = 2;
/** Constructor */ /** Constructor */
MoenchData(){ MoenchData(){
myDetectorType = slsDetectorDefs::MOENCH; myDetectorType = slsDetectorDefs::MOENCH;
nPixelsX = 400; nPixelsX = 32; // total number of channels
nPixelsY = 400; nPixelsY = 1; // number of samples
headerSizeinPacket = 22; headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header);
dataSize = 8192; dataSize = UDP_PACKET_DATA_BYTES;
packetSize = headerSizeinPacket + dataSize; packetSize = headerSizeinPacket + dataSize;
packetsPerFrame = 1; //packetsPerFrame = 1;
imageSize = nPixelsX * nPixelsY * 2; imageSize = nPixelsX * nPixelsY * 2;
packetsPerFrame = ceil((double)imageSize / (double)UDP_PACKET_DATA_BYTES);
frameIndexMask = 0xFFFFFF; frameIndexMask = 0xFFFFFF;
maxFramesPerFile = CTB_MAX_FRAMES_PER_FILE; maxFramesPerFile = CTB_MAX_FRAMES_PER_FILE;
fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header); fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header);
defaultFifoDepth = 2500; defaultFifoDepth = 2500;
standardheader = true;
}; };
/** /**
@ -645,34 +650,42 @@ private:
bunchId = (*((uint64_t*) header->bunchid)); bunchId = (*((uint64_t*) header->bunchid));
} }
/**
* Setting packets per frame changes member variables
* @param ns number of samples
*/
void setNumberofSamples(const uint64_t ns) {
packetsPerFrame = ceil(double(2 * 32 * ns) / dataSize);
nPixelsY = (ns * 2) / 25;/* depends on nroich also?? */
imageSize = nPixelsX * nPixelsY * 2;
};
/** /**
* Setting ten giga enable changes member variables * Set databytes (ctb, moench)
* @param tgEnable true if 10GbE is enabled, else false * @param f readout flags
* @param dr dynamic range * @param r roi
* @param s number of samples
* @param t tengiga enable
*/ */
void SetTenGigaEnable(bool tgEnable, int dr) { void setImageSize(std::vector<slsDetectorDefs::ROI> i, int s, bool t,
dataSize = (tgEnable ? 4096 : 1024); slsDetectorDefs::readOutFlags f = slsDetectorDefs::GET_READOUT_FLAGS) {
int nchans = NCHAN_ANALOG;
// if roi
if (i.size()) {
nchans = abs(i[0].xmax - i[0].xmin);
}
nPixelsX = nchans;
nPixelsY = s;
// 10G
if (t) {
headerSizeinPacket = 22;
dataSize = 8192;
packetSize = headerSizeinPacket + dataSize; packetSize = headerSizeinPacket + dataSize;
packetsPerFrame = (tgEnable ? 4 : 16) * dr; imageSize = nPixelsX * nPixelsY * 2;
imageSize = dataSize*packetsPerFrame; packetsPerFrame = ceil((double)imageSize / (double)packetSize);
}; standardheader = false;
}
/** // 1g udp (via fifo readout)
* Print all variables else {
*/ headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header);
void Print(TLogLevel level = logDEBUG1) const { dataSize = UDP_PACKET_DATA_BYTES;
GeneralData::Print(level); packetSize = headerSizeinPacket + dataSize;
FILE_LOG(logINFO) << "Bytes Per Adc: " << bytesPerAdc; imageSize = nPixelsX * nPixelsY * 2;
packetsPerFrame = ceil((double)imageSize / (double)UDP_PACKET_DATA_BYTES);
standardheader = true;
}
} }
}; };

View File

@ -447,8 +447,8 @@ int slsReceiverImplementation::setReadOutFlags(const readOutFlags f) {
readoutFlags = f; readoutFlags = f;
// side effects // side effects
if (myDetectorType == CHIPTESTBOARD || myDetectorType == MOENCH) { if (myDetectorType == CHIPTESTBOARD) {
generalData->setImageSize(readoutFlags, roi, numberOfSamples, tengigaEnable); generalData->setImageSize(roi, numberOfSamples, tengigaEnable, readoutFlags);
for (const auto& it : dataProcessor) for (const auto& it : dataProcessor)
it->SetPixelDimension(); it->SetPixelDimension();
if (SetupFifoStructure() == FAIL) if (SetupFifoStructure() == FAIL)
@ -642,10 +642,10 @@ int slsReceiverImplementation::setROI(const std::vector<slsDetectorDefs::ROI> i)
framesPerFile = generalData->maxFramesPerFile; framesPerFile = generalData->maxFramesPerFile;
break; break;
case MOENCH: case MOENCH:
generalData->SetROI(i); generalData->setImageSize(roi, numberOfSamples, tengigaEnable);
break; break;
case CHIPTESTBOARD: case CHIPTESTBOARD:
generalData->setImageSize(readoutFlags, roi, numberOfSamples, tengigaEnable); generalData->setImageSize(roi, numberOfSamples, tengigaEnable, readoutFlags);
break; break;
default: default:
break; break;
@ -789,18 +789,13 @@ int slsReceiverImplementation::setNumberofSamples(const uint64_t i) {
if (numberOfSamples != i) { if (numberOfSamples != i) {
numberOfSamples = i; numberOfSamples = i;
switch(myDetectorType) { if(myDetectorType == MOENCH) {
case MOENCH: generalData->setImageSize(roi, numberOfSamples, tengigaEnable);
generalData->setNumberofSamples(i); } else if(myDetectorType == CHIPTESTBOARD) {
break; generalData->setImageSize(roi, numberOfSamples, tengigaEnable, readoutFlags);
case CHIPTESTBOARD: }
generalData->setImageSize(readoutFlags, roi, numberOfSamples, tengigaEnable);
for (const auto& it : dataProcessor) for (const auto& it : dataProcessor)
it->SetPixelDimension(); it->SetPixelDimension();
break;
default:
break;
}
if (SetupFifoStructure() == FAIL) if (SetupFifoStructure() == FAIL)
return FAIL; return FAIL;
} }
@ -811,6 +806,7 @@ int slsReceiverImplementation::setNumberofSamples(const uint64_t i) {
int slsReceiverImplementation::setDynamicRange(const uint32_t i) { int slsReceiverImplementation::setDynamicRange(const uint32_t i) {
// only eiger
if (dynamicRange != i) { if (dynamicRange != i) {
dynamicRange = i; dynamicRange = i;
generalData->SetDynamicRange(i,tengigaEnable); generalData->SetDynamicRange(i,tengigaEnable);
@ -830,7 +826,20 @@ int slsReceiverImplementation::setTenGigaEnable(const bool b) {
if (tengigaEnable != b) { if (tengigaEnable != b) {
tengigaEnable = b; tengigaEnable = b;
//side effects //side effects
switch(myDetectorType) {
case EIGER:
generalData->SetTenGigaEnable(b,dynamicRange); generalData->SetTenGigaEnable(b,dynamicRange);
break;
case MOENCH:
generalData->setImageSize(roi, numberOfSamples, tengigaEnable);
break;
case CHIPTESTBOARD:
generalData->setImageSize(roi, numberOfSamples, tengigaEnable, readoutFlags);
break;
default:
break;
}
if (SetupFifoStructure() == FAIL) if (SetupFifoStructure() == FAIL)
return FAIL; return FAIL;
} }

View File

@ -1947,7 +1947,7 @@ int slsReceiverTCPIPInterface::set_readout_flags() {
if (interface->Server_ReceiveArg(ret, mess, &arg, sizeof(arg), true, receiver) == FAIL) if (interface->Server_ReceiveArg(ret, mess, &arg, sizeof(arg), true, receiver) == FAIL)
return FAIL; return FAIL;
if (myDetectorType == JUNGFRAU || myDetectorType == GOTTHARD) if (myDetectorType == JUNGFRAU || myDetectorType == GOTTHARD || myDetectorType == MOENCH)
functionNotImplemented(); functionNotImplemented();
// base object not null // base object not null