eiger mapping for 32 bit done

This commit is contained in:
Dhanya Maliakal
2015-04-14 17:13:09 +02:00
parent 70c98a663d
commit 1f6c5c26b4
3 changed files with 87 additions and 37 deletions

View File

@ -19,8 +19,8 @@ public:
*/ */
eigerHalfModuleData(int dr, int np, int bsize, int dsize, double c=0): slsReceiverData<uint32_t>(xpixels, ypixels, np, bsize), eigerHalfModuleData(int dr, int np, int bsize, int dsize, bool top, double c=0): slsReceiverData<uint32_t>(xpixels, ypixels, np, bsize),
xtalk(c), dynamicRange(dr), bufferSize(bsize), dataSize(dsize){ xtalk(c), bufferSize(bsize), dataSize(dsize), dynamicRange(dr), numberOfPackets(np){
int **dMap; int **dMap;
@ -42,29 +42,60 @@ public:
int iData1 = 0, iData2 = 0; int iData1 = 0, iData2 = 0;
int iPort; int iPort;
for (int ir=0; ir<ypixels; ir++) {
for (int ic=0; ic<xpixels; ic++) { if(top){
iPort = ic / (xpixels/2); for (int ir=0; ir<ypixels; ir++) {
if(!iPort){ for (int ic=0; ic<xpixels; ic++) {
dMap[ir][ic] = iPacket1; iPort = ic / (xpixels/2);
iPacket1 += (dynamicRange / 8); if(!iPort){
iData1 +=(dynamicRange / 8); dMap[ir][ic] = iPacket1;
if(iData1 >= dataSize){ iPacket1 += (dynamicRange / 8);
iPacket1 += 16; iData1 +=(dynamicRange / 8);
iData1 = 0; if(iData1 >= dataSize){
} iPacket1 += 16;
}else{ iData1 = 0;
dMap[ir][ic] = iPacket2; }
iPacket2 += (dynamicRange / 8); }else{
iData2 +=(dynamicRange / 8); dMap[ir][ic] = iPacket2;
if(iData2 >= dataSize){ iPacket2 += (dynamicRange / 8);
iPacket2 += 16; iData2 +=(dynamicRange / 8);
iData2 = 0; if(iData2 >= dataSize){
iPacket2 += 16;
iData2 = 0;
}
} }
} }
} }
} }
/*
else{
iPacket1 = (totalNumberOfBytes/2) - 1040 - 8;
iPacket2 = totalNumberOfBytes - 1040 - 8;
for (int ir=0; ir<ypixels; ir++) {
for (int ic=0; ic<xpixels; ic++) {
iPort = ic / (xpixels/2);
if(!iPort){
dMap[ir][ic] = iPacket1;
iPacket1 += (dynamicRange / 8);//increment now but decrement before by 1024 before and after
iData1 +=(dynamicRange / 8);
if(iData1 >= dataSize){
iPacket1 += 16;
iData1 = 0;
}
}else{
dMap[ir][ic] = iPacket2;
iPacket2 += (dynamicRange / 8);
iData2 +=(dynamicRange / 8);
if(iData2 >= dataSize){
iPacket2 += 16;
iData2 = 0;
}
}
}
}
}
*/
@ -87,7 +118,7 @@ public:
\returns frame number \returns frame number
*/ */
int getFrameNumber(char *buff){ int getFrameNumber(char *buff){
return htonl(*(unsigned int*)((eiger_image_header *)((char*)(buff)))->fnum); return(*(unsigned int*)(((eiger_packet_header *)((char*)buff))->num1));
}; };
@ -96,7 +127,31 @@ public:
\returns packet number \returns packet number
*/ */
int getPacketNumber(char *buff){ int getPacketNumber(char *buff){
return htonl(*(unsigned int*)((eiger_packet_header *)((char*)(buff)))->num2); /*other way roud if its a bottom*/
#ifdef VERY_DEBUG
cprintf(RED, "\n0x%x - %d - %d",
(*(uint8_t*)(((eiger_packet_header *)((char*)(buff)))->num3)),
(*(uint8_t*)(((eiger_packet_header *)((char*)(buff)))->num4)),
(*(uint16_t*)(((eiger_packet_header *)((char*)(buff)))->num2)));
#endif
//32 bit packet number written in num2
if(dynamicRange == 32){
//both ports have same packet numbers, so reconstruct
if((*(uint8_t*)(((eiger_packet_header *)((char*)buff))->num3))){
return ((*(uint16_t*)(((eiger_packet_header *)((char*)buff))->num2))+(numberOfPackets/2) +1);
}else{
return ((*(uint16_t*)(((eiger_packet_header *)((char*)buff))->num2))+1);
}
}
else{
//both ports have same packet numbers, so reconstruct
if((*(uint8_t*)(((eiger_packet_header *)((char*)buff))->num3))){
return ((*(uint8_t*)(((eiger_packet_header *)((char*)buff))->num4))+(numberOfPackets/2) +1);
}else{
return ((*(uint8_t*)(((eiger_packet_header *)((char*)buff))->num4))+1);
}
}
}; };
@ -146,21 +201,16 @@ private:
const int bufferSize; const int bufferSize;
const int dataSize; const int dataSize;
const int dynamicRange; const int dynamicRange;
const int numberOfPackets;
/** structure of an eiger image header*/
typedef struct
{
unsigned char header_before[20];
unsigned char fnum[4];
unsigned char header_after[24];
} eiger_image_header;
/** structure of an eiger image header*/ /** structure of an eiger image header*/
typedef struct typedef struct
{ {
unsigned char num1[4]; unsigned char num1[4];
unsigned char num2[4]; unsigned char num2[2];
unsigned char num3[1];
unsigned char num4[1];
} eiger_packet_header; } eiger_packet_header;
}; };

View File

@ -211,14 +211,14 @@ class slsDetectorData {
*/ */
virtual dataType getChannel(char *data, int ix, int iy, int dr) { virtual dataType getChannel(char *data, int ix, int iy, int dr) {
dataType m=0, d=0; dataType m=0;
uint64_t t; uint64_t t;
int numBytes,divFactor,newix,pixelval; int numBytes,divFactor,newix,pixelval;
if (ix>=0 && ix<nx && iy>=0 && iy<ny && dataMap[iy][ix]>=0 && dataMap[iy][ix]<dataSize) { if (ix>=0 && ix<nx && iy>=0 && iy<ny && dataMap[iy][ix]>=0 && dataMap[iy][ix]<dataSize) {
m=dataMask[iy][ix]; m=dataMask[iy][ix];
//cout <<"ix:"<<dec<<ix<<" iy:"<<iy<<endl;
numBytes = (nx * iy + ix); numBytes = (nx * iy + ix);
divFactor=2; divFactor=2;
if(dr == 4) divFactor = 16; if(dr == 4) divFactor = 16;
@ -228,10 +228,10 @@ class slsDetectorData {
pixelval = numBytes % divFactor; pixelval = numBytes % divFactor;
newix = ix - pixelval; newix = ix - pixelval;
//cout <<"pixelval:"<<pixelval<<" newix:"<<newix<<endl; //cout <<"pixelval:"<<dec <<pixelval<<" newix:"<<newix<<endl;
//cout <<"64:"<< hex<<((uint64_t)(*((uint64_t*)(((char*)data)+(dataMap[iy][newix])))))<<endl; // cout <<"64:"<< hex<<((uint64_t)(*((uint64_t*)(((char*)data)+(dataMap[iy][newix])))))<<endl;
t = (be64toh((uint64_t)(*((uint64_t*)(((char*)data)+(dataMap[iy][newix])))))); t = (be64toh((uint64_t)(*((uint64_t*)(((char*)data)+(dataMap[iy][newix]))))));
//cout<<"t:"<<t<<endl; // cout<<"t:"<<hex<<t<<endl;
}else }else
cprintf(RED,"outside limits\n"); cprintf(RED,"outside limits\n");

View File

@ -67,7 +67,7 @@ public:
while (dd<=(dsize-packetSize)) { while (dd<=(dsize-packetSize)) {
pnum=getPacketNumber(p); pnum=getPacketNumber(p);
fn=getFrameNumber(p); fn=getFrameNumber(p);
//cout <<"pnum:"<<pnum<<" fn:"<<fn<<"\t";
if (pnum<1 || pnum>nPackets) { if (pnum<1 || pnum>nPackets) {
cout << "Bad packet number " << pnum << " frame "<< fn << endl; cout << "Bad packet number " << pnum << " frame "<< fn << endl;