Merge branch 'master' of gitorious.psi.ch:sls_det_software/sls_detector_calibration

Conflicts:
	slsDetectorData.h
This commit is contained in:
cartier_s 2015-05-28 14:29:45 +02:00
commit 88ec090ee6
8 changed files with 601 additions and 80 deletions

View File

@ -0,0 +1,291 @@
#ifndef EIGERMODULEDATA_H
#define EIGERMODULEDATA_H
#include "slsReceiverData.h"
class eigerHalfModuleData : public slsReceiverData<uint32_t> {
public:
/**
Implements the slsReceiverData structure for the eiger prototype read out by a half module i.e. using the slsReceiver
(256*256 pixels, 512 packets for 16 bit mode, 256 for 8, 128 for 4, 1024 for 32, 1040 etc.)
\param d dynamic range
\param c crosstalk parameter for the output buffer
*/
eigerHalfModuleData(int dr, int np, int bsize, int dsize, bool top, double c=0): slsReceiverData<uint32_t>(xpixels, ypixels, np, bsize),
xtalk(c), bufferSize(bsize), dataSize(dsize), dynamicRange(dr), numberOfPackets(np), top(top){
int **dMap;
uint32_t **dMask;
dMap=new int*[ypixels];
dMask=new uint32_t*[ypixels];
for (int i = 0; i < ypixels; i++) {
dMap[i] = new int[xpixels];
dMask[i] = new uint32_t[xpixels];
}
//Map
int totalNumberOfBytes = 1040 * dynamicRange * 16 *2; //for both 1g and 10g
int iPacket1 = 8;
int iPacket2 = (totalNumberOfBytes/2) + 8;
int iData1 = 0, iData2 = 0;
int increment = (dynamicRange/8);
int ic_increment = 1;
if (dynamicRange == 4) {
increment = 1;
ic_increment = 2;
}
int iPort;
if(top){
for (int ir=0; ir<ypixels; ir++) {
for (int ic=0; ic<xpixels; ic = ic + ic_increment) {
iPort = ic / (xpixels/2);
if(!iPort){
dMap[ir][ic] = iPacket1;
iPacket1 += increment;
iData1 += increment;
//increment header
if(iData1 >= dataSize){
iPacket1 += 16;
iData1 = 0;
}
}else{
dMap[ir][ic] = iPacket2;
iPacket2 += increment;
iData2 += increment;
//increment header
if(iData2 >= dataSize){
iPacket2 += 16;
iData2 = 0;
}
}
}
}
}
//bottom
else{
iData1 = 0; iData2 = 0;
int numbytesperlineperport = 1024;
if (dynamicRange == 8)
numbytesperlineperport = 512;
else if (dynamicRange == 4)
numbytesperlineperport = 256;
else if (dynamicRange == 32)
numbytesperlineperport = 2048;
iPacket1 = (totalNumberOfBytes/2) - numbytesperlineperport - 8;
iPacket2 = totalNumberOfBytes - numbytesperlineperport - 8;
if (dynamicRange == 32){
iPacket1 -= 16;
iPacket2 -= 16;
}
for (int ir=0; ir<ypixels; ir++) {
for (int ic=0; ic<xpixels; ic = ic + ic_increment) {
iPort = ic / (xpixels/2);
if(!iPort){
dMap[ir][ic] = iPacket1;
iPacket1 += increment;
iData1 += increment;
if(dynamicRange == 32){
if(iData1 == numbytesperlineperport){
iPacket1 -= (numbytesperlineperport*2 + 16*3);
iData1 = 0;
}
if(iData1 == dataSize){
iPacket1 += 16;
}
}else if((iData1 % numbytesperlineperport) == 0){
iPacket1 -= (numbytesperlineperport*2);
if(iData1 == dataSize){
iPacket1 -= 16;
iData1 = 0;
}
}
}
//other port
else{
dMap[ir][ic] = iPacket2;
iPacket2 += increment;
iData2 += increment;
if(dynamicRange == 32){
if(iData2 == numbytesperlineperport){
iPacket2 -= (numbytesperlineperport*2 + 16*3);
iData2 = 0;
}
if(iData2 == dataSize){
iPacket2 += 16;
}
}else if((iData2 % numbytesperlineperport) == 0){
iPacket2 -= (numbytesperlineperport*2);
if(iData2 == dataSize){
iPacket2 -= 16;
iData2 = 0;
}
}
}
}
}
}
//Mask
for(int ir=0; ir<ypixels; ++ir)
for(int ic=0; ic<xpixels; ++ic)
dMask[ir][ic] = 0x0;
setDataMap(dMap);
setDataMask(dMask);
};
/** Returns the frame number for the given dataset.
\param buff pointer to the dataset
\returns frame number
*/
int getFrameNumber(char *buff){
return(*(unsigned int*)(((eiger_packet_header *)((char*)buff))->num1));
};
/** gets the packets number (last packet is labelled with 0 and is replaced with 40)
\param buff pointer to the memory
\returns packet number
*/
int getPacketNumber(char *buff){
#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, ports interchanged for bottom
if((*(uint8_t*)(((eiger_packet_header *)((char*)buff))->num3))){
if (top)
return ((*(uint16_t*)(((eiger_packet_header *)((char*)buff))->num2))+(numberOfPackets/2) +1);
else
return ((*(uint16_t*)(((eiger_packet_header *)((char*)buff))->num2))+1);
}else{
if (top)
return ((*(uint16_t*)(((eiger_packet_header *)((char*)buff))->num2))+1);
else
return ((*(uint16_t*)(((eiger_packet_header *)((char*)buff))->num2))+(numberOfPackets/2) +1);
}
}
else{
//both ports have same packet numbers, so reconstruct
if((*(uint8_t*)(((eiger_packet_header *)((char*)buff))->num3))){
if (top)
return ((*(uint8_t*)(((eiger_packet_header *)((char*)buff))->num4))+(numberOfPackets/2) +1);
else
return ((*(uint8_t*)(((eiger_packet_header *)((char*)buff))->num4))+1);
}else{
if (top)
return ((*(uint8_t*)(((eiger_packet_header *)((char*)buff))->num4))+1);
else
return ((*(uint8_t*)(((eiger_packet_header *)((char*)buff))->num4))+(numberOfPackets/2) +1);
}
}
};
/**
returns the pixel value as double correcting for the output buffer crosstalk
\param data pointer to the memory
\param ix coordinate in the x direction
\param iy coordinate in the y direction
\returns channel value as double
*/
double getValue(char *data, int ix, int iy=0) {
// cout << "##" << (void*)data << " " << ix << " " <<iy << endl;
if (xtalk==0)
return slsDetectorData<uint32_t>::getValue(data, ix, iy);
else
return slsDetectorData<uint32_t>::getValue(data, ix, iy)-xtalk*slsDetectorData<uint32_t>::getValue(data, ix-1, iy);
};
/** sets the output buffer crosstalk correction parameter
\param c output buffer crosstalk correction parameter to be set
\returns current value for the output buffer crosstalk correction parameter
*/
double setXTalk(double c) {xtalk=c; return xtalk;}
/** gets the output buffer crosstalk parameter
\returns current value for the output buffer crosstalk correction parameter
*/
double getXTalk() {return xtalk;}
private:
double xtalk; /**<output buffer crosstalk correction parameter */
const static int xpixels = 1024;
const static int ypixels = 256;
const int bufferSize;
const int dataSize;
const int dynamicRange;
const int numberOfPackets;
bool top;
/** structure of an eiger image header*/
typedef struct
{
unsigned char num1[4];
unsigned char num2[2];
unsigned char num3[1];
unsigned char num4[1];
} eiger_packet_header;
};
#endif

View File

@ -0,0 +1,155 @@
#ifndef JUNGFRAU10MODULEDATA_H
#define JUNGFRAU10MODULEBDATA_H
#include "slsDetectorData.h"
class jungfrau10ModuleData : public slsDetectorData<uint16_t> {
private:
int iframe;
int nadc;
int sc_width;
int sc_height;
public:
/**
Implements the slsReceiverData structure for the moench02 prototype read out by a module i.e. using the slsReceiver
(160x160 pixels, 40 packets 1286 large etc.)
\param c crosstalk parameter for the output buffer
*/
jungfrau10ModuleData(int ns=16384): slsDetectorData<uint16_t>(256*4, 256*2, 256*256*8*2, NULL, NULL, NULL) , iframe(0), nadc(32), sc_width(64), sc_height(256) {
int row, col;
int isample;
int iadc;
int ix, iy;
int ichip;
// cout << sizeof(uint16_t) << endl;
for (iadc=0; iadc<nadc; iadc++) {
ichip=iadc/4;
for (int i=0; i<sc_width*sc_height; i++) {
if (ichip%2==0) {
row=sc_height+i/sc_width;
col=(ichip/2)*256+iadc%4*sc_width+(i%sc_width);
} else {
row=sc_height-1-i/sc_width;
col=((ichip/2)*256+iadc%4*sc_width)+sc_width-(i%sc_width)-1;
}
/* if (iadc<nadc/2) { */
/* row=sc_height+i/sc_width; */
/* col=iadc*sc_width+(i%sc_width); */
/* } else { */
/* row=sc_height-1-i/sc_width; */
/* col=(nx-1)-((iadc-16)*sc_width)-(i%sc_width); */
/* } */
if (row<0 || row>=ny || col<0 || col>=nx) {
cout << "Wrong row, column " << row << " " << col << " " << iadc << " " << i << endl;
} else
dataMap[row][col]=(nadc*i+iadc)*2;
if (dataMap[row][col]<0 || dataMap[row][col]>=dataSize)
cout << "Error: pointer " << dataMap[row][col] << " out of range " << row << " " << col <<" " << iadc << " " << i << endl;
else {
xmap[nadc*i+iadc]=col;
ymap[nadc*i+iadc]=row;
}
}
}
};
/**
Returns the frame number for the given dataset. Purely virtual func.
\param buff pointer to the dataset
\returns frame number
*/
int getFrameNumber(char *buff){(void)buff; return iframe;};
/**
Returns the packet number for the given dataset. purely virtual func
\param buff pointer to the dataset
\returns packet number number
virtual int getPacketNumber(char *buff)=0;
*/
/**
Loops over a memory slot until a complete frame is found (i.e. all packets 0 to nPackets, same frame number). purely virtual func
\param data pointer to the memory to be analyzed
\param ndata reference to the amount of data found for the frame, in case the frame is incomplete at the end of the memory slot
\param dsize size of the memory slot to be analyzed
\returns pointer to the beginning of the last good frame (might be incomplete if ndata smaller than dataSize), or NULL if no frame is found
*/
char *findNextFrame(char *data, int &ndata, int dsize){ndata=dsize; setDataSize(dsize); return data;};
/**
Loops over a file stream until a complete frame is found (i.e. all packets 0 to nPackets, same frame number). Can be overloaded for different kind of detectors!
\param filebin input file stream (binary)
\returns pointer to the begin of the last good frame, NULL if no frame is found or last frame is incomplete
*/
char *readNextFrame(ifstream &filebin){
// int afifo_length=0;
uint16_t *afifo_cont;
int ib=0;
if (filebin.is_open()) {
afifo_cont=new uint16_t[dataSize/2];
while (filebin.read(((char*)afifo_cont)+ib,2)) {
ib+=2;
if (ib==dataSize) break;
}
if (ib>0) {
iframe++;
// cout << ib << "-" << endl;
return (char*)afifo_cont;
} else {
delete [] afifo_cont;
return NULL;
}
}
return NULL;
};
};
#endif

View File

@ -36,9 +36,6 @@ class moench02CtbData : public slsDetectorData<uint16_t> {
int iadc;
int ix, iy;
xmap=new int[nx*ny];
ymap=new int[nx*ny];
@ -47,30 +44,13 @@ class moench02CtbData : public slsDetectorData<uint16_t> {
col=adc_nr[iadc]+(i%sc_width);
row=i/sc_width;
dataMap[row][col]=(32*i+iadc)*2;
if (dataMap[row][col]<0 || dataMap[row][col]>=2*160*160)
if (dataMap[row][col]<0 || dataMap[row][col]>=dataSize) {
cout << "Error: pointer " << dataMap[row][col] << " out of range "<< endl;
}
}
}
for (int i=0; i<nx*ny; i++) {
isample=i/32;
iadc=i%nadc;
ix=isample%sc_width;
iy=isample/sc_width;
if (iadc<(nadc/2)) {
xmap[i]=adc_nr[iadc]+ix;
ymap[i]=ny/2-1-iy;
} else {
xmap[i]=adc_nr[iadc]+ix;
ymap[i]=ny/2+iy;
}
}
iframe=0;
// cout << "data struct created" << endl;

View File

@ -9,7 +9,6 @@ class moench03CtbData : public slsDetectorData<uint16_t> {
private:
int iframe;
int *xmap, *ymap;
int nadc;
int sc_width;
int sc_height;
@ -39,8 +38,6 @@ class moench03CtbData : public slsDetectorData<uint16_t> {
int iadc;
int ix, iy;
xmap=new int[nx*ny];
ymap=new int[nx*ny];
@ -83,8 +80,6 @@ class moench03CtbData : public slsDetectorData<uint16_t> {
// cout << "data struct created" << endl;
};
void getPixel(int ip, int &x, int &y) {if (ip>=0 && ip<nx*ny) {x=xmap[ip]; y=ymap[ip];}};
/**
@ -139,7 +134,7 @@ class moench03CtbData : public slsDetectorData<uint16_t> {
}
if (ib>0) {
iframe++;
cout << ib << "-" << endl;
// cout << ib << "-" << endl;
return (char*)afifo_cont;
} else {
delete [] afifo_cont;

View File

@ -27,7 +27,7 @@ using namespace std;
#define NR 400
#define MY_DEBUG 1
//#define MY_DEBUG 1
#ifdef MY_DEBUG
#include <TCanvas.h>
@ -47,7 +47,7 @@ TH2F *readImage(ifstream &filebin, TH2F *h2=NULL, TH2F *hped=NULL) {
h2=new TH2F("h2","",400,0,400,400,0,400);
h2->SetStats(kFALSE);
}
cout << "." << endl;
// cout << "." << endl;
for (int ix=0; ix<400; ix++) {
for (int iy=0; iy<400; iy++) {
// cout << decoder->getDataSize() << " " << decoder->getValue(buff,ix,iy)<< endl;
@ -77,7 +77,7 @@ TH2F *readImage(char *fname, int iframe=0, TH2F *hped=NULL) {
if (hh==NULL) break;
hh=readImage(filebin, h2, hped );
if (hh)
cout << "="<< endl;
;// cout << "="<< endl;
else {
delete h2;
return NULL;
@ -114,7 +114,7 @@ TH2F *calcPedestal(char *fformat, int runmin, int runmax){
}
}
delete [] buff;
cout << "="<< endl;
//cout << "="<< endl;
ii++;
}
if (filebin.is_open())
@ -146,8 +146,6 @@ Loops over data file to find single photons, fills the tree (and writes it to fi
\param nbins number of bins for spectrum hists
\param hmin histo minimum for spectrum hists
\param hmax histo maximum for spectrum hists
\param sign sign of the spectrum to find hits
\param hc readout correlation coefficient with previous pixel
\param xmin minimum x coordinate
\param xmax maximum x coordinate
\param ymin minimum y coordinate
@ -156,7 +154,9 @@ Loops over data file to find single photons, fills the tree (and writes it to fi
\returns pointer to histo stack with cluster spectra
*/
THStack *moench03ReadData(char *fformat, char *tit, int runmin, int runmax, int nbins=1500, int hmin=-500, int hmax=1000, int sign=1, double hc=0, int xmin=1, int xmax=NC-1, int ymin=1, int ymax=NR-1, int cmsub=0, int hitfinder=1) {
THStack *moench03ReadData(char *fformat, char *tit, int runmin, int runmax, int nbins=1500, int hmin=-500, int hmax=1000, int xmin=1, int xmax=NC-1, int ymin=1, int ymax=NR-1, int cmsub=0, int hitfinder=1) {
double hc=0;
int sign=1;
moench03CtbData *decoder=new moench03CtbData();
cout << "decoder allocated " << endl;
@ -173,7 +173,7 @@ THStack *moench03ReadData(char *fformat, char *tit, int runmin, int runmax, int
int iev=0;
int nph=0;
singlePhotonDetector<uint16_t> *filter=new singlePhotonDetector<uint16_t>(decoder, 3, 5, sign, cmSub, 10, 100);
singlePhotonDetector<uint16_t> *filter=new singlePhotonDetector<uint16_t>(decoder, 3, 5, sign, cmSub, 100, 10);
cout << "filter allocated " << endl;
char *buff;
@ -270,11 +270,8 @@ THStack *moench03ReadData(char *fformat, char *tit, int runmin, int runmax, int
nph=0;
while ((buff=decoder->readNextFrame(filebin))) {
filter->newFrame();
if (hitfinder) {
filter->newFrame();
//calculate pedestals and common modes
if (cmsub) {
// cout << "cm" << endl;
for (ix=xmin-1; ix<xmax+1; ix++)
@ -282,25 +279,26 @@ THStack *moench03ReadData(char *fformat, char *tit, int runmin, int runmax, int
thisEvent=filter->getEventType(buff, ix, iy,0);
}
}
}
// if (hitfinder) {
// //calculate pedestals and common modes
// }
// cout << "new frame " << endl;
for (ix=xmin-1; ix<xmax+1; ix++)
for (iy=ymin-1; iy<ymax+1; iy++) {
// cout << ix << " " << iy << endl;
thisEvent=filter->getEventType(buff, ix, iy, cmsub);
#ifdef MY_DEBUG
if (hitfinder) {
// if (iev%10==0)
he->SetBinContent(ix+1-xmin, iy+1-ymin, (int)thisEvent);
}
#endif
thisEvent=filter->getEventType(buff, ix, iy, cmsub);
// if (nf>10) {
h1->Fill(filter->getClusterTotal(1), iy+NR*ix);
if (hitfinder) {
#ifdef MY_DEBUG
// if (iev%10==0)
he->SetBinContent(ix+1-xmin, iy+1-ymin, (int)thisEvent);
#endif
if (hitfinder) {
if (thisEvent==PHOTON_MAX ) {
nph++;
@ -315,7 +313,10 @@ THStack *moench03ReadData(char *fformat, char *tit, int runmin, int runmax, int
}
}
} // else {
// filter->addToPedestal(decoder->getValue(buff,ix,iy, cmsub));
// }
// }
@ -323,7 +324,7 @@ THStack *moench03ReadData(char *fformat, char *tit, int runmin, int runmax, int
//////////////////////////////////////////////////////////
#ifdef MY_DEBUG
cout << iev << " " << h1->GetEntries() << " " << h2->GetEntries() << endl;
// cout << iev << " " << h1->GetEntries() << " " << h2->GetEntries() << endl;
// if (iev%10==0) {
// myC->Modified();
// myC->Update();
@ -338,10 +339,10 @@ THStack *moench03ReadData(char *fformat, char *tit, int runmin, int runmax, int
#endif
nf++;
cout << "=" ;
// cout << "=" ;
delete [] buff;
}
cout << nph << endl;
// cout << nph << endl;
if (filebin.is_open())
filebin.close();
else

View File

@ -12,31 +12,31 @@ void readMoench03Data(char *tit, int sign=1){
TFile *fout;
THStack *hs;
sprintf(fname,"/scratch/roberto/photons.root");
sprintf(fname,"/mnt/moenchnas/big_moench_xbox_20150223/Mo.root");
fout=new TFile(fname,"RECREATE");
sprintf(fname,"/scratch/roberto/run_%%d.raw");
sprintf(fname,"/mnt/moenchnas/big_moench_xbox_20150223/Mo_f0_%%d.raw");
hs=moench03ReadData(fname,"photons",136,1135,1500,-500,2500,1,0.,1,399,1,399, 0,1);
// cout << "returned" << endl;
// hs->SetName(tit);
// hs->SetTitle(tit);
// cout << "name/title set" << endl;
hs=moench03ReadData(fname,"Mo",25133,25187,1500,-500,2500,1,399,1,399, 0,1);
cout << "returned" << endl;
hs->SetName(tit);
hs->SetTitle(tit);
cout << "name/title set" << endl;
// if (hs->GetHists()) {
// for (int i=0; i<3; i++) {
// if (hs->GetHists()->At(i)) {
// cout << i << " " ;
// (TH2F*)(hs->GetHists()->At(i))->Write();
// }
// }
// cout << " histos written " << endl;
// } else
// cout << "no hists in stack " << endl;
if (hs->GetHists()) {
for (int i=0; i<3; i++) {
if (hs->GetHists()->At(i)) {
cout << i << " " ;
(TH2F*)(hs->GetHists()->At(i))->Write();
}
}
cout << " histos written " << endl;
} else
cout << "no hists in stack " << endl;
// fout->Close();
fout->Close();

View File

@ -18,7 +18,8 @@ class slsDetectorData {
int **dataMap; /**< Array of size nx*ny storing the pointers to the data in the dataset (as offset)*/
dataType **dataMask; /**< Array of size nx*ny storing the polarity of the data in the dataset (should be 0 if no inversion is required, 0xffffffff is inversion is required) */
int **dataROIMask; /**< Array of size nx*ny 1 if channel is good (or in the ROI), 0 if bad channel (or out of ROI) */
int *xmap;
int *ymap;
public:
@ -39,6 +40,8 @@ class slsDetectorData {
slsDetectorData(int npx, int npy, int dsize, int **dMap=NULL, dataType **dMask=NULL, int **dROI=NULL): nx(npx), ny(npy), dataSize(dsize) {
xmap=new int[nx*ny];
ymap=new int[nx*ny];
dataMask=new dataType*[ny];
for(int i = 0; i < ny; i++) {
@ -56,6 +59,8 @@ class slsDetectorData {
dataROIMask[i][j]=1;
}
setDataMap(dMap);
setDataMask(dMask);
setDataROIMask(dROI);
@ -71,9 +76,11 @@ class slsDetectorData {
delete [] dataMap;
delete [] dataMask;
delete [] dataROIMask;
delete [] xmap;
delete [] ymap;
}
virtual void getPixel(int ip, int &x, int &y) {x=ip; y=0;};
virtual void getPixel(int ip, int &x, int &y) {x=xmap[ip]; y=ymap[ip];};
@ -85,6 +92,7 @@ class slsDetectorData {
void setDataMap(int **dMap=NULL) {
<<<<<<< HEAD
if (dMap==NULL) {
@ -100,6 +108,28 @@ class slsDetectorData {
}
}
=======
int ip;
if (dMap==NULL) {
for (int iy=0; iy<ny; iy++)
for (int ix=0; ix<nx; ix++)
dataMap[iy][ix]=(iy*nx+ix)*sizeof(dataType);
} else {
//cout << "set dmap "<< dataMap << " " << dMap << endl;
for (int iy=0; iy<ny; iy++){
// cout << iy << endl;
for (int ix=0; ix<nx; ix++) {
dataMap[iy][ix]=dMap[iy][ix];
// cout << ix << " " << iy << endl;
/*ip=dataMap[ix][iy]/sizeof(dataType);
xmap[ip]=ix;
ymap[ip]=iy;Annaa*/
}
}
}
// cout << "nx:" <<nx << " ny:" << ny << endl;
>>>>>>> 844c207d55aa5279626c496c677446de61103a30
};
@ -197,8 +227,62 @@ class slsDetectorData {
return d^m;
};
/**
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)
\param ix pixel number in the x direction
\param iy pixel number in the y direction
\param dr dynamic range
\returns data for the selected channel, with inversion if required
*/
virtual dataType getChannel(char *data, int ix, int iy, int dr) {
dataType m=0;
uint64_t t;
int numBytes,divFactor,newix,pixelval;
//cout <<"ix:"<<ix<<" nx:"<<nx<<" iy:"<<ny<<" ny:"<<ny<<" datamap[iy][ix]:"<< dataMap[iy][ix] <<"datasize:"<< dataSize <<endl;
if (ix>=0 && ix<nx && iy>=0 && iy<ny && dataMap[iy][ix]>=0 && dataMap[iy][ix]<dataSize) {
m=dataMask[iy][ix];
numBytes = (nx * iy + ix);
divFactor=2;
if(dr == 4) divFactor = 16;
else if (dr == 8) divFactor = 8;
else if (dr == 16) divFactor = 4;
pixelval = numBytes % divFactor;
newix = ix - pixelval;
//cout <<"pixelval:"<<pixelval<<" newix:"<<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]))))));
//cout<<"t:"<<t<<endl;
}else
cprintf(RED,"outside limits\n");
if(dr == 4)
//uint8_t value = t >> (pixelval*4); cout <<"value:"<< value << endl;
return ((t >> (pixelval*4)) & 0xf)^m;
else if(dr == 8)
//uint8_t value = t >> (pixelval*8); cout <<"value:"<< value << endl;
return ((t >> (pixelval*8)) & 0xff)^m;
else if(dr == 16){
//uint16_t value = t >> (pixelval*16); cout <<"value:"<< value << endl;
return ((t >> (pixelval*16)) & 0xffff)^m;
}else{
//uint32_t value = t >> (pixelval*32); cout <<"value:"<< value << endl;
return ((t >> (pixelval*32)) & 0xffffffff)^m;
}
};
/**
Returns the value of the selected channel for the given dataset as double.
\param data pointer to the dataset (including headers etc)
\param ix pixel number in the x direction
@ -208,6 +292,20 @@ class slsDetectorData {
*/
virtual double getValue(char *data, int ix, int iy=0) {return (double)getChannel(data, ix, iy);};
/**
Returns the value of the selected channel for the given dataset as double.
\param data pointer to the dataset (including headers etc)
\param ix pixel number in the x direction
\param iy pixel number in the y direction
\param dr dynamic range
\returns data for the selected channel, with inversion if required as double
*/
virtual double getValue(char *data, int ix, int iy, int dr) {
return ((double)getChannel(data, ix, iy, dr));
};
/**
Returns the frame number for the given dataset. Purely virtual func.

View File

@ -67,7 +67,7 @@ public:
while (dd<=(dsize-packetSize)) {
pnum=getPacketNumber(p);
fn=getFrameNumber(p);
//cout <<"pnum:"<<pnum<<" fn:"<<fn<<"\t";
if (pnum<1 || pnum>nPackets) {
cout << "Bad packet number " << pnum << " frame "<< fn << endl;
@ -90,7 +90,7 @@ public:
dd+=packetSize;
np++;
// cout << pnum << " " << fn << " " << np << " " << dd << " " << dsize << endl;
if (np==nPackets)
if (np==nPackets){
if (pnum==nPackets) {
// cout << "Frame found!" << endl;
break;
@ -98,6 +98,7 @@ public:
cout << "Too many packets for this frame! "<< fnum << " " << pnum << endl;
retval=NULL;
}
}
}
if (np<nPackets) {
if (np>0)