jungfrau works

This commit is contained in:
Dhanya Maliakal
2015-11-27 15:57:19 +01:00
parent 0d86439589
commit 3b0e2e611c
7 changed files with 320 additions and 62 deletions

View File

@ -251,7 +251,7 @@ int UDPStandardImplementation::setupFifoStructure(){
int64_t i;
int oldNumberofJobsPerBuffer = numberofJobsPerBuffer;
//eiger always listens to 1 packet at a time
if(myDetectorType == EIGER){
if((myDetectorType == EIGER) || (myDetectorType = JUNGFRAU)){
numberofJobsPerBuffer = 1;
FILE_LOG(logDEBUG) << "Info: 1 packet per buffer";
}
@ -288,6 +288,7 @@ int UDPStandardImplementation::setupFifoStructure(){
case GOTTHARD: fifoSize = GOTTHARD_FIFO_SIZE; break;
case MOENCH: fifoSize = MOENCH_FIFO_SIZE; break;
case PROPIX: fifoSize = PROPIX_FIFO_SIZE; break;
case JUNGFRAU: fifoSize = JFRAU_FIFO_SIZE; break;
case EIGER: fifoSize = EIGER_FIFO_SIZE * packetsPerFrame; break;//listens to 1 packet at a time and size depends on packetsperframe
default: break;
}
@ -717,7 +718,6 @@ int UDPStandardImplementation::setDetectorType(const detectorType d){
footerOffset = EIGER_PACKET_HEADER_SIZE + oneDataSize;
break;
case JUNGFRAUCTB:
case JUNGFRAU:
packetsPerFrame = JCTB_PACKETS_PER_FRAME;
onePacketSize = JCTB_ONE_PACKET_SIZE;
//oneDataSize = Not applicable;
@ -730,6 +730,19 @@ int UDPStandardImplementation::setDetectorType(const detectorType d){
fifoSize = JCTB_FIFO_SIZE;
//footerOffset = Not applicable;
break;
case JUNGFRAU:
packetsPerFrame = JFRAU_PACKETS_PER_FRAME;
onePacketSize = JFRAU_ONE_PACKET_SIZE;
oneDataSize = JFRAU_DATA_BYTES;
frameSize = JFRAU_BUFFER_SIZE;
bufferSize = JFRAU_BUFFER_SIZE;
frameIndexMask = JFRAU_FRAME_INDEX_MASK;
frameIndexOffset = JFRAU_FRAME_INDEX_OFFSET;
packetIndexMask = JFRAU_PACKET_INDEX_MASK;
maxPacketsPerFile = JFRAU_MAX_FRAMES_PER_FILE * JFRAU_PACKETS_PER_FRAME;
fifoSize = JFRAU_FIFO_SIZE;
//footerOffset = Not applicable;
break;
default:
FILE_LOG(logERROR) << "This is an unknown receiver type " << (int)d;
return FAIL;
@ -1297,9 +1310,9 @@ int UDPStandardImplementation::setupWriter(){
if (rawDataReadyCallBack){
FILE_LOG(logINFO) << "Data Write has been defined externally";
}
}else if(!fileWriteEnable)
}else if(!fileWriteEnable){
FILE_LOG(logINFO) << "Data will not be saved";
}
//creating first file
@ -1571,6 +1584,7 @@ int UDPStandardImplementation::prepareAndListenBuffer(int ithread, int lSize, in
int receivedSize = udpSocket[ithread]->ReceiveDataOnly(buffer[ithread] + HEADER_SIZE_NUM_TOT_PACKETS + cSize, lSize + cSize);
//throw away packets that is not one packet size, need to check status if socket is shut down
while(status != TRANSMITTING && myDetectorType == EIGER && receivedSize != onePacketSize) {
if(receivedSize != EIGER_HEADER_LENGTH)
@ -1584,13 +1598,19 @@ int UDPStandardImplementation::prepareAndListenBuffer(int ithread, int lSize, in
totalListeningFrameCount[ithread] += (receivedSize/onePacketSize);
#ifdef MANUALDEBUG
eiger_packet_header_t* header = (eiger_packet_header_t*) (buffer[ithread]+HEADER_SIZE_NUM_TOT_PACKETS);
eiger_packet_footer_t* footer = (eiger_packet_footer_t*)(buffer[ithread] + footerOffset + HEADER_SIZE_NUM_TOT_PACKETS);
cprintf(GREEN,"thread:%d subframenum:%d oldpacketnum:%d new pnum:%d\n",
ithread,
(*( (unsigned int*) header->subFameNumber)),
(*( (uint8_t*) header->dynamicRange)),
(*( (uint16_t*) footer->packetNumber)));
if(myDetectorType == JUNGFRAU){
jfrau_packet_header_t* header = (jfrau_packet_header_t*)(buffer[ithread] + HEADER_SIZE_NUM_TOT_PACKETS);
cprintf(RED,"framenumber:%llu\n",(long long unsigned int)(*( (uint64_t*) header->frameNumber)));
cprintf(RED,"packetnumber:%llu\n",(long long unsigned int)(*( (uint64_t*) header->packetNumber)));
}else if(myDetectorType == EIGER){
eiger_packet_header_t* header = (eiger_packet_header_t*) (buffer[ithread]+HEADER_SIZE_NUM_TOT_PACKETS);
eiger_packet_footer_t* footer = (eiger_packet_footer_t*)(buffer[ithread] + footerOffset + HEADER_SIZE_NUM_TOT_PACKETS);
cprintf(GREEN,"thread:%d subframenum:%d oldpacketnum:%d new pnum:%d\n",
ithread,
(*( (unsigned int*) header->subFrameNumber)),
(*( (uint8_t*) header->dynamicRange)),
(*( (uint16_t*) footer->packetNumber)));
}
#endif
@ -1609,10 +1629,15 @@ void UDPStandardImplementation::startFrameIndices(int ithread){
FILE_LOG(logDEBUG) << __AT__ << " called";
//determine startFrameIndex
jfrau_packet_header_t* header=0;
switch(myDetectorType){
case EIGER:
startFrameIndex = 0; //frame number always resets
break;
case JUNGFRAU:
header = (jfrau_packet_header_t*)(buffer[ithread] + HEADER_SIZE_NUM_TOT_PACKETS);
startFrameIndex = (*( (uint64_t*) header->frameNumber));
break;
default:
if(shortFrameEnable < 0){
startFrameIndex = (((((uint32_t)(*((uint32_t*)(buffer[ithread] + HEADER_SIZE_NUM_TOT_PACKETS))))+1)
@ -1741,8 +1766,10 @@ uint32_t UDPStandardImplementation::processListeningBuffer(int ithread, int cSiz
int lastPacketOffset; //the offset of the last packet
uint32_t lastFrameHeader; //frame number of last packet in buffer
uint64_t lastFrameHeader64; //frame number of last packet in buffer
uint32_t packetCount = (packetsPerFrame/numberofListeningThreads) * numberofJobsPerBuffer; //packets received
cSize = 0; //reset size
jfrau_packet_header_t* header;
switch(myDetectorType){
case GOTTHARD:
@ -1802,6 +1829,44 @@ uint32_t UDPStandardImplementation::processListeningBuffer(int ithread, int cSiz
}
break;
case JUNGFRAU:
lastPacketOffset = (((numberofJobsPerBuffer * packetsPerFrame - 1) * onePacketSize) + HEADER_SIZE_NUM_TOT_PACKETS);
#ifdef DEBUG4
header = (jfrau_packet_header_t*) (buffer[ithread]+HEADER_SIZE_NUM_TOT_PACKETS);
cprintf(BLUE, "Listening_Thread: First Header:%llu\t First Packet:%llu\n",
(long long unsigned int)(*( (uint64_t*) header->frameNumber)),
(long long unsigned int)(*( (uint64_t*) header->packetNumber)));
#endif
header = (jfrau_packet_header_t*) (buffer[ithread]+lastPacketOffset);
#ifdef DEBUG4
cprintf(BLUE, "Listening_Thread: Last Header:%llu\t Last Packet:%llu\n",
(long long unsigned int)(*( (uint64_t*) header->frameNumber)),
(long long unsigned int)(*( (uint64_t*) header->packetNumber)));
#endif
//jungfrau last packet value is 0, so find the last packet and store the others in a temp storage
if(*( (uint64_t*) header->packetNumber)){
cprintf(RED,"entering missing packet zone\n");
lastFrameHeader64 = (*( (uint64_t*) header->frameNumber));
cSize += onePacketSize;
lastPacketOffset -= onePacketSize;
--packetCount;
while (lastFrameHeader64 == (*( (uint64_t*) header->frameNumber))){
cSize += onePacketSize;
lastPacketOffset -= onePacketSize;
header = (jfrau_packet_header_t*) (buffer[ithread]+lastPacketOffset);
#ifdef DEBUG4
cprintf(RED,"new header:%llu new packet:%llu\n",
(long long unsigned int)(*( (uint64_t*) header->frameNumber)),
(long long unsigned int)(*( (uint64_t*) header->packetNumber)));
#endif
--packetCount;
}
memcpy(temp, buffer[ithread]+(lastPacketOffset+onePacketSize), cSize);
}
break;
default:
cprintf(RED,"Listening_Thread %d: Error: This detector %s is not implemented in the receiver\n",
ithread, getDetectorType(myDetectorType).c_str());
@ -2406,19 +2471,26 @@ void UDPStandardImplementation::handleWithoutDataCompression(int ithread, char*
//get frame number (eiger already gets it when it does packet to packet processing)
if (myDetectorType != EIGER){
uint64_t tempframenumber = ((uint32_t)(*((uint32_t*)(wbuffer[0] + HEADER_SIZE_NUM_TOT_PACKETS))));
//for gotthard and normal frame, increment frame number to separate fnum and pnum
if (myDetectorType == PROPIX ||(myDetectorType == GOTTHARD && shortFrameEnable == -1))
tempframenumber++;
//get frame number
currentFrameNumber = (tempframenumber & frameIndexMask) >> frameIndexOffset;
if(myDetectorType != EIGER){
if(myDetectorType == JUNGFRAU){
jfrau_packet_header_t* header = (jfrau_packet_header_t*)(wbuffer[0] + HEADER_SIZE_NUM_TOT_PACKETS);
currentFrameNumber = (*( (uint64_t*) header->frameNumber));
}else{
uint64_t tempframenumber = ((uint32_t)(*((uint32_t*)(wbuffer[0] + HEADER_SIZE_NUM_TOT_PACKETS))));
//for gotthard and normal frame, increment frame number to separate fnum and pnum
if (myDetectorType == PROPIX ||(myDetectorType == GOTTHARD && shortFrameEnable == -1))
tempframenumber++;
//get frame number
currentFrameNumber = (tempframenumber & frameIndexMask) >> frameIndexOffset;
}
//set indices
acquisitionIndex = currentFrameNumber - startAcquisitionIndex;
frameIndex = currentFrameNumber - startFrameIndex;
}
//callback to write data
if (cbAction < DO_EVERYTHING){
switch(myDetectorType){