added data structures for mythen3.01 and adcsar2 for jctb

This commit is contained in:
bergamaschi 2017-03-03 13:10:14 +01:00
parent fd42fad045
commit 73ec3903bf
3 changed files with 206 additions and 22 deletions

View File

@ -0,0 +1,99 @@
#ifndef MYTHEN301JCTBDATA_H
#define MYTHEN301JCTBDATA_H
class mythen3_01_jctbData : public slsDetectorData<short unsigned int> {
public:
mythen3_01_jctbData( int nch=64*3,int dr=24, int off=5): slsDetectorData<short unsigned int>(64*3,1,dr*8*nch,NULL,NULL,NULL), dynamicRange(dr), serialOffset(off), frameNumber(0), numberOfCounters(nch) {};
virtual void getPixel(int ip, int &x, int &y) {x=-1; y=-1;};
virtual short unsigned int getChannel(char *data, int ix, int iy=0) {
int ret=-1;
short unsigned int *val=mythen03_frame(data,dynamicRange,numberOfCounters,serialOffset);
if (ix>=0 && ix<numberOfCounters) ret=val[ix];
delete [] val;
return ret;
};
virtual int getFrameNumber(char *buff) {return frameNumber;};
virtual char *findNextFrame(char *data, int &ndata, int dsize) {
ndata=dsize;
return data;
}
virtual char *readNextFrame(ifstream &filebin) {
char *data=NULL;
if (filebin.is_open()) {
data=new char[dataSize];
filebin.read(data,dataSize);
}
return data;
}
virtual short unsigned int **getData(char *ptr, int dsize=-1) {
short unsigned int **val;
val=new short unsigned int*[1];
val[0]=mythen03_frame(ptr,dynamicRange,nx,serialOffset);
return val;
}
static short unsigned int* mythen03_frame(char *ptr, int dr=24, int nch=64*3, int off=5) {
int iarg;
int64_t word;
short unsigned int* val=new short unsigned int[nch];
int bit[64];
int nb=2;
int ioff=0;
int idr=0;
int ib=0;
int iw=0;
bit[0]=19;
bit[1]=8;
idr=0;
for (ib=0; ib<nch; ib++) {
val[ib]=0;
}
for (iw=0; iw<nch/nb; iw) {
word=*((int64_t*)(ptr+8));
if (ioff<off) ioff++;
else {
if (idr<16) {
for (ib=0; ib<nb; ib++) {
if (word&(1<<bit[ib])) val[iw+nch*ib/nb]|=(1<<idr);
}//end for()
}
idr++;
if (idr==dr) {
idr=0;
iw++;
}//end if()
}//end else()
}//end for
return val;
}
virtual int setFrameNumber(int f=0) {if (f>=0) frameNumber=f; return frameNumber; };
virtual int setDynamicRange(int d=-1) {if (d>0 && d<=24) dynamicRange=d; return dynamicRange;};
virtual int setSerialOffset(int d=-1) {if (d>=0) serialOffset=d; return serialOffset;};
virtual int setNumberOfCounters(int d=-1) {if (d>=0) numberOfCounters=d; return numberOfCounters;};
private:
int dynamicRange;
int serialOffset;
int frameNumber;
int numberOfCounters;
};
#endif

View File

@ -0,0 +1,63 @@
#ifndef ADCSAR2_JCTBDATA_H
#define ADCSAR2_JCTBDATA_H
class adcSar2_jctbData : public slsDetectorData<short unsigned int> {
public:
adcSar2_jctbData(int nsamples=1000): slsDetectorData<short unsigned int>(nsamples,1,nsamples*8,NULL,NULL,NULL){};
virtual void getPixel(int ip, int &x, int &y) {x=ip/8; y=1;};
virtual short unsigned int getChannel(char *data, int ix, int iy=0) {
int adcvalue=0;
int vv1= *((int16_t*) (data+8*ix));
int vv2= *((int16_t*) (data+8*ix+2));
for (int jj=0;jj<8;jj++){
adcvalue=adcvalue+ (((vv1>>(jj*2)) & 0x1)<<(jj));
}
for (int jj=0;jj<4;jj++){
adcvalue=adcvalue+ (((vv2>>(jj*2)) & 0x1)<<(jj+8));
}
return adcvalue;
};
virtual int getFrameNumber(char *buff) {return frameNumber;};
virtual char *findNextFrame(char *data, int &ndata, int dsize) {
ndata=dsize;
return data;
}
virtual char *readNextFrame(ifstream &filebin) {
char *data=NULL;
if (filebin.is_open()) {
data=new char[dataSize];
filebin.read(data,dataSize);
}
return data;
}
/* virtual int **getData(char *ptr, int dsize=-1) { */
/* int **val; */
/* val=new int*[1]; */
/* val[0]=mythen03_frame(ptr,dynamicRange,nx,serialOffset); */
/* return val; */
/* } */
virtual int setFrameNumber(int f=0) {if (f>=0) frameNumber=f; return frameNumber; };
private:
int frameNumber;
};
#endif

View File

@ -44,23 +44,27 @@ class slsDetectorData {
ymap=new int[dsize/sizeof(dataType)];
dataMask=new dataType*[ny];
for(int i = 0; i < ny; i++) {
dataMask[i] = new dataType[nx];
}
dataMap=new int*[ny];
for(int i = 0; i < ny; i++) {
dataMap[i] = new int[nx];
}
// if (dataMask==NULL) {
dataMask=new dataType*[ny];
for(int i = 0; i < ny; i++) {
dataMask[i] = new dataType[nx];
}
// }
dataROIMask=new int*[ny];
for(int i = 0; i < ny; i++) {
dataROIMask[i] = new int[nx];
for (int j=0; j<nx; j++)
dataROIMask[i][j]=1;
}
// if (dataMap==NULL) {
dataMap=new int*[ny];
for(int i = 0; i < ny; i++) {
dataMap[i] = new int[nx];
}
// }
// if (dataROIMask==NULL) {
dataROIMask=new int*[ny];
for(int i = 0; i < ny; i++) {
dataROIMask[i] = new int[nx];
for (int j=0; j<nx; j++)
dataROIMask[i][j]=1;
}
// }
setDataMap(dMap);
setDataMask(dMask);
@ -70,9 +74,9 @@ class slsDetectorData {
virtual ~slsDetectorData() {
for(int i = 0; i < ny; i++) {
delete [] dataMap[i];
delete [] dataMask[i];
delete [] dataROIMask[i];
delete [] dataMap[i];
delete [] dataMask[i];
delete [] dataROIMask[i];
}
delete [] dataMap;
delete [] dataMask;
@ -81,9 +85,6 @@ class slsDetectorData {
delete [] ymap;
}
virtual void getPixel(int ip, int &x, int &y) {x=xmap[ip]; y=ymap[ip];};
/**
defines the data map (as offset) - no error checking if datasize and offsets are compatible!
@ -187,6 +188,27 @@ class slsDetectorData {
int setDataSize(int d) {dataSize=d; return dataSize;};
virtual void getPixel(int ip, int &x, int &y) {x=xmap[ip]; y=ymap[ip];};
virtual dataType **getData(char *ptr, int dsize=-1) {
dataType **data;
int ix,iy;
data=new dataType*[ny];
for(int i = 0; i < ny; i++) {
data[i]=new dataType[nx];
}
if (dsize<=0 || dsize>dataSize) dsize=dataSize;
for (int ip=0; ip<(dsize/sizeof(dataType)); ip++) {
getPixel(ip,ix,iy);
if (ix>=0 && ix<nx && iy>=0 && iy<ny) {
data[iy][ix]=getChannel(ptr,ix,iy);
}
}
return data;
};
/**
Returns the value of the selected channel for the given dataset. Virtual function, can be overloaded.
\param data pointer to the dataset (including headers etc)