adjusted for jungfrau

This commit is contained in:
Dhanya Maliakal 2017-03-07 14:59:38 +01:00
parent 50f8366bc2
commit 0e4c7a9494
3 changed files with 77 additions and 20 deletions

View File

@ -7,6 +7,7 @@
*@short abstract for setting/getting properties of detector data *@short abstract for setting/getting properties of detector data
*/ */
#include "sls_receiver_defs.h"
#include "receiver_defs.h" #include "receiver_defs.h"
@ -14,6 +15,9 @@ class GeneralData {
public: public:
/** DetectorType */
slsReceiverDefs::detectorType myDetectorType;
/** Number of Pixels in x axis */ /** Number of Pixels in x axis */
uint32_t nPixelsX; uint32_t nPixelsX;
@ -67,8 +71,22 @@ public:
/** Cosntructor */ /** Cosntructor */
GeneralData(): GeneralData():
myDetectorType(slsReceiverDefs::GENERIC),
nPixelsX(0),
nPixelsY(0),
headerSizeinPacket(0),
dataSize(0),
packetSize(0),
packetsPerFrame(0),
imageSize(0),
frameIndexMask(0),
frameIndexOffset(0),
packetIndexMask(0), packetIndexMask(0),
packetIndexOffset(0), packetIndexOffset(0),
maxFramesPerFile(0),
fifoBufferSize(0),
fifoBufferHeaderSize(0),
defaultFifoDepth(0),
threadsPerReceiver(1), threadsPerReceiver(1),
headerPacketSize(0){}; headerPacketSize(0){};
@ -134,7 +152,8 @@ public:
*/ */
virtual void Print() const { virtual void Print() const {
printf("\n\nDetector Data Variables:\n"); printf("\n\nDetector Data Variables:\n");
printf( "Pixels X: %d\n" printf( "myDetectorType:%s\n"
"Pixels X: %d\n"
"Pixels Y: %d\n" "Pixels Y: %d\n"
"Header Size in Packet: %d\n" "Header Size in Packet: %d\n"
"Data Size: %d\n" "Data Size: %d\n"
@ -151,6 +170,7 @@ public:
"Default Fifo Depth: %d\n" "Default Fifo Depth: %d\n"
"Threads Per Receiver: %d\n" "Threads Per Receiver: %d\n"
"Header Packet Size: %d\n", "Header Packet Size: %d\n",
slsReceiverDefs::getDetectorType(myDetectorType).c_str(),
nPixelsX, nPixelsX,
nPixelsY, nPixelsY,
headerSizeinPacket, headerSizeinPacket,
@ -178,6 +198,7 @@ class GotthardData : public GeneralData {
/** Constructor */ /** Constructor */
GotthardData(){ GotthardData(){
myDetectorType = slsReceiverDefs::GOTTHARD;
nPixelsX = 1280; nPixelsX = 1280;
nPixelsY = 1; nPixelsY = 1;
headerSizeinPacket = 4; headerSizeinPacket = 4;
@ -202,6 +223,7 @@ class ShortGotthardData : public GeneralData {
/** Constructor */ /** Constructor */
ShortGotthardData(){ ShortGotthardData(){
myDetectorType = slsReceiverDefs::GOTTHARD;
nPixelsX = 256; nPixelsX = 256;
nPixelsY = 1; nPixelsY = 1;
headerSizeinPacket = 4; headerSizeinPacket = 4;
@ -229,6 +251,7 @@ class PropixData : public GeneralData {
/** Constructor */ /** Constructor */
PropixData(){ PropixData(){
myDetectorType = slsReceiverDefs::PROPIX;
nPixelsX = 22; nPixelsX = 22;
nPixelsY = 22; nPixelsY = 22;
headerSizeinPacket = 4; headerSizeinPacket = 4;
@ -256,6 +279,7 @@ class Moench02Data : public GeneralData {
/** Constructor */ /** Constructor */
Moench02Data(){ Moench02Data(){
myDetectorType = slsReceiverDefs::MOENCH;
nPixelsX = 160; nPixelsX = 160;
nPixelsY = 160; nPixelsY = 160;
headerSizeinPacket = 4; headerSizeinPacket = 4;
@ -288,6 +312,7 @@ class Moench03Data : public GeneralData {
/** Constructor */ /** Constructor */
Moench03Data(){ Moench03Data(){
myDetectorType = slsReceiverDefs::MOENCH;
nPixelsX = 400; nPixelsX = 400;
nPixelsY = 400; nPixelsY = 400;
headerSizeinPacket = 22; headerSizeinPacket = 22;
@ -315,6 +340,7 @@ class JCTBData : public GeneralData {
/** Constructor */ /** Constructor */
JCTBData(){ JCTBData(){
myDetectorType = slsReceiverDefs::JUNGFRAUCTB;
nPixelsX = 32; nPixelsX = 32;
nPixelsY = 128; nPixelsY = 128;
headerSizeinPacket = 22; headerSizeinPacket = 22;
@ -358,6 +384,7 @@ private:
/** Constructor */ /** Constructor */
JungfrauData(){ JungfrauData(){
myDetectorType = slsReceiverDefs::JUNGFRAU;
nPixelsX = (256*4); nPixelsX = (256*4);
nPixelsY = 256; nPixelsY = 256;
headerSizeinPacket = 22; headerSizeinPacket = 22;
@ -401,7 +428,7 @@ private:
subFrameNumber = -1; subFrameNumber = -1;
jfrau_packet_header_t* header = (jfrau_packet_header_t*)(packetData); jfrau_packet_header_t* header = (jfrau_packet_header_t*)(packetData);
frameNumber = (uint64_t)(*( (uint32_t*) header->frameNumber)); frameNumber = (uint64_t)(*( (uint32_t*) header->frameNumber));
packetNumber = packetsPerFrame - 1 -(uint32_t)(*( (uint8_t*) header->packetNumber)); packetNumber = packetsPerFrame - 1 -(uint32_t)(*( (uint8_t*) header->packetNumber));//old firmware (not needed in new firmware)
bunchId = (*((uint64_t*) header->bunchid)); bunchId = (*((uint64_t*) header->bunchid));
} }
@ -443,6 +470,7 @@ private:
/** Constructor */ /** Constructor */
EigerData(){ EigerData(){
myDetectorType = slsReceiverDefs::EIGER;
nPixelsX = (256*2); nPixelsX = (256*2);
nPixelsY = 256; nPixelsY = 256;
headerSizeinPacket = 8; headerSizeinPacket = 8;
@ -470,7 +498,7 @@ private:
void GetHeaderInfo(int index, char* packetData, uint64_t& frameNumber, uint32_t& packetNumber) const { void GetHeaderInfo(int index, char* packetData, uint64_t& frameNumber, uint32_t& packetNumber) const {
eiger_packet_footer_t* footer = (eiger_packet_footer_t*)(packetData + footerOffset); eiger_packet_footer_t* footer = (eiger_packet_footer_t*)(packetData + footerOffset);
frameNumber = (uint64_t)((*( (uint64_t*) footer)) & frameIndexMask); frameNumber = (uint64_t)((*( (uint64_t*) footer)) & frameIndexMask);
packetNumber = (uint32_t)(*( (uint16_t*) footer->packetNumber))-1; packetNumber = ((uint32_t)(*( (uint16_t*) footer->packetNumber)))-1;
} }
/** /**
@ -489,7 +517,7 @@ private:
subFrameNumber = -1; subFrameNumber = -1;
eiger_packet_footer_t* footer = (eiger_packet_footer_t*)(packetData + footerOffset); eiger_packet_footer_t* footer = (eiger_packet_footer_t*)(packetData + footerOffset);
frameNumber = (uint64_t)((*( (uint64_t*) footer)) & frameIndexMask); frameNumber = (uint64_t)((*( (uint64_t*) footer)) & frameIndexMask);
packetNumber = (uint32_t)(*( (uint16_t*) footer->packetNumber))-1; packetNumber = ((uint32_t)(*( (uint16_t*) footer->packetNumber)))-1;
if (dynamicRange == 32) { if (dynamicRange == 32) {
eiger_packet_header_t* header = (eiger_packet_header_t*) (packetData); eiger_packet_header_t* header = (eiger_packet_header_t*) (packetData);
subFrameNumber = (uint64_t) *( (uint32_t*) header->subFrameNumber); subFrameNumber = (uint64_t) *( (uint32_t*) header->subFrameNumber);

View File

@ -258,16 +258,21 @@ void Listener::ThreadExecution() {
return; return;
} }
//error check //error check, (should not be here) if not transmitting yet (previous if) rc should be > 0
if (rc <= 0) { if (rc <= 0) {
cprintf(BG_RED,"Error:(Weird), UDP Sockets not shut down, but received nothing\n"); if (carryOverFlag) {
fifo->FreeAddress(buffer); uint64_t fnum=0;uint32_t pnum=0;
generalData->GetHeaderInfo(index, carryOverPacket, fnum, pnum);
if (fnum < currentFrameIndex)
cprintf(BG_RED,"Error:(Weird Early self shut down), Frame number less than current frame number\n");
}else
cprintf(BG_RED,"Error:(Weird Early self shut down), UDP Sockets not shut down, but received nothing\n");
StopListening(buffer);
return; return;
} }
(*((uint32_t*)buffer)) = rc; (*((uint32_t*)buffer)) = rc;
//for those returning earlier (*((uint64_t*)(buffer + FIFO_HEADER_NUMBYTES ))) = currentFrameIndex; //for those returning earlier
(*((uint64_t*)(buffer + FIFO_HEADER_NUMBYTES ))) = currentFrameIndex;
currentFrameIndex++; currentFrameIndex++;
//push into fifo //push into fifo
@ -295,6 +300,9 @@ uint32_t Listener::ListenToAnImage(char* buf) {
int dsize = generalData->dataSize; int dsize = generalData->dataSize;
bool isHeaderEmpty = true; bool isHeaderEmpty = true;
//only for jungfrau as we look only at pnum
uint32_t expectpnum = 0;
//reset to -1 //reset to -1
memset(buf,0xFF,dsize); memset(buf,0xFF,dsize);
@ -305,6 +313,8 @@ uint32_t Listener::ListenToAnImage(char* buf) {
//check if its the current image packet //check if its the current image packet
generalData->GetHeaderInfo(index, carryOverPacket, *dynamicRange, fnum, pnum, snum, bid); generalData->GetHeaderInfo(index, carryOverPacket, *dynamicRange, fnum, pnum, snum, bid);
if (fnum != currentFrameIndex) { if (fnum != currentFrameIndex) {
if (fnum < currentFrameIndex)
return 0;
return generalData->imageSize; return generalData->imageSize;
} }
carryOverFlag = false; carryOverFlag = false;
@ -315,15 +325,20 @@ uint32_t Listener::ListenToAnImage(char* buf) {
(*((uint64_t*)(buf - FILE_FRAME_HEADER_SIZE + FILE_FRAME_HDR_FNUM_SIZE + FILE_FRAME_HDR_SNUM_SIZE))) = bid; (*((uint64_t*)(buf - FILE_FRAME_HEADER_SIZE + FILE_FRAME_HDR_FNUM_SIZE + FILE_FRAME_HDR_SNUM_SIZE))) = bid;
isHeaderEmpty = false; isHeaderEmpty = false;
} }
expectpnum = pnum+1; //for jungfrau
} }
//until last packet
while (pnum < (generalData->packetsPerFrame-1)) { while (pnum < (generalData->packetsPerFrame-1)) {
//listen to new packet //listen to new packet
rc += udpSocket->ReceiveDataOnly(listeningPacket); int curr_rc = udpSocket->ReceiveDataOnly(listeningPacket);
if (rc <= 0) return 0; if(curr_rc <= 0) {
if (rc <= 0) return 0; //empty image
return generalData->imageSize; //empty packet now, but not empty image
}
rc += curr_rc;
//update parameters //update parameters
numPacketsCaught++; //record immediately to get more time before socket shutdown numPacketsCaught++; //record immediately to get more time before socket shutdown
@ -331,14 +346,26 @@ uint32_t Listener::ListenToAnImage(char* buf) {
generalData->GetHeaderInfo(index, listeningPacket, *dynamicRange, fnum, pnum, snum, bid); generalData->GetHeaderInfo(index, listeningPacket, *dynamicRange, fnum, pnum, snum, bid);
lastCaughtFrameIndex = fnum; lastCaughtFrameIndex = fnum;
#ifdef VERBOSE #ifdef VERBOSE
if (!index && !pnum) if (!index)
cprintf(GREEN,"Listening %d: fnum:%lld, pnum:%d\n", index, (long long int)fnum, pnum); cprintf(GREEN,"Listening %d: fnum:%lld, pnum:%d\n", index, (long long int)fnum, pnum);
#endif #endif
if (!measurementStartedFlag) if (!measurementStartedFlag)
RecordFirstIndices(fnum); RecordFirstIndices(fnum);
//future packet
if (fnum != currentFrameIndex) {
//future packet (jungfrau) look at packet numbers
if (generalData->myDetectorType == JUNGFRAU) {
if (pnum < expectpnum) {
cprintf(RED,"setting carry over flag to true\n");
carryOverFlag = true;
memcpy(carryOverPacket,listeningPacket, generalData->packetSize);
return generalData->imageSize;
}
}
//future packet by looking at image number (all other detectors)
else if (fnum != currentFrameIndex) {
cprintf(RED,"setting carry over flag to true\n");
carryOverFlag = true; carryOverFlag = true;
memcpy(carryOverPacket,listeningPacket, generalData->packetSize); memcpy(carryOverPacket,listeningPacket, generalData->packetSize);
return generalData->imageSize; return generalData->imageSize;
@ -352,6 +379,7 @@ uint32_t Listener::ListenToAnImage(char* buf) {
(*((uint64_t*)(buf - FILE_FRAME_HEADER_SIZE + FILE_FRAME_HDR_FNUM_SIZE + FILE_FRAME_HDR_SNUM_SIZE))) = bid; (*((uint64_t*)(buf - FILE_FRAME_HEADER_SIZE + FILE_FRAME_HDR_FNUM_SIZE + FILE_FRAME_HDR_SNUM_SIZE))) = bid;
isHeaderEmpty = false; isHeaderEmpty = false;
} }
expectpnum = pnum+1; //for jungfrau
} }
return generalData->imageSize; return generalData->imageSize;

View File

@ -562,15 +562,16 @@ void UDPStandardImplementation::stopReceiver(){
for (int i = 0; i < numThreads; i++) { for (int i = 0; i < numThreads; i++) {
tot += dataProcessor[i]->GetNumFramesCaught(); tot += dataProcessor[i]->GetNumFramesCaught();
if (dataProcessor[i]->GetNumFramesCaught() < numberOfFrames) { uint64_t missingpackets = numberOfFrames*generalData->packetsPerFrame-listener[i]->GetTotalPacketsCaught();
if (missingpackets) {
cprintf(RED, "\n[Port %d]\n",udpPortNum[i]); cprintf(RED, "\n[Port %d]\n",udpPortNum[i]);
cprintf(RED, "Missing Packets\t\t: %lld\n",(long long int)numberOfFrames*generalData->packetsPerFrame-listener[i]->GetTotalPacketsCaught()); cprintf(RED, "Missing Packets\t\t: %lld\n",(long long int)missingpackets);
cprintf(RED, "Frames Caught\t\t: %lld\n",(long long int)dataProcessor[i]->GetNumFramesCaught()); cprintf(RED, "Frames Processed\t: %lld\n",(long long int)dataProcessor[i]->GetNumFramesCaught());
cprintf(RED, "Last Frame Caught\t: %lld\n",(long long int)listener[i]->GetLastFrameIndexCaught()); cprintf(RED, "Last Frame Caught\t: %lld\n",(long long int)listener[i]->GetLastFrameIndexCaught());
}else{ }else{
cprintf(GREEN, "\n[Port %d]\n",udpPortNum[i]); cprintf(GREEN, "\n[Port %d]\n",udpPortNum[i]);
cprintf(GREEN, "Missing Packets\t\t: %lld\n",(long long int)numberOfFrames*generalData->packetsPerFrame-listener[i]->GetTotalPacketsCaught()); cprintf(GREEN, "Missing Packets\t\t: %lld\n",(long long int)missingpackets);
cprintf(GREEN, "Frames Caught\t\t: %lld\n",(long long int)dataProcessor[i]->GetNumFramesCaught()); cprintf(GREEN, "Frames Processed\t: %lld\n",(long long int)dataProcessor[i]->GetNumFramesCaught());
cprintf(GREEN, "Last Frame Caught\t: %lld\n",(long long int)listener[i]->GetLastFrameIndexCaught()); cprintf(GREEN, "Last Frame Caught\t: %lld\n",(long long int)listener[i]->GetLastFrameIndexCaught());
} }
} }