mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-04-23 15:00:02 +02:00
Added jungfrau1.0 data structure (bad) and added xmap, ymap and getPixel method to the slsDetectorData base class
This commit is contained in:
parent
8a79e94fa8
commit
985b4d71b4
154
slsDetectorCalibration/jungfrau10ModuleData.h
Normal file
154
slsDetectorCalibration/jungfrau10ModuleData.h
Normal file
@ -0,0 +1,154 @@
|
||||
#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, ns*2*32, NULL, NULL) , nadc(32), sc_width(64), sc_height(256) {
|
||||
|
||||
|
||||
|
||||
int row, col;
|
||||
|
||||
int isample;
|
||||
int iadc;
|
||||
int ix, iy;
|
||||
|
||||
|
||||
|
||||
cout << nx << " " << ny << " " << dataSize << endl;
|
||||
|
||||
for (iadc=0; iadc<nadc; iadc++) {
|
||||
for (int i=0; i<sc_width*sc_height; i++) {
|
||||
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=(ny-1)-(iadc-16)*sc_width-(i%sc_width);
|
||||
}
|
||||
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 "<< endl;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
for (int i=0; i<nx*ny; i++) {
|
||||
isample=i/nadc;
|
||||
iadc=i%nadc;
|
||||
ix=isample%sc_width;
|
||||
iy=isample/sc_width;
|
||||
if (iadc<(nadc/2)) {
|
||||
xmap[i]=iadc*sc_width+ix;//adc_nr[iadc]+ix;
|
||||
ymap[i]=ny/2+iy;
|
||||
} else {
|
||||
xmap[i]=(ny-1)-(iadc-16)*sc_width-ix;//adc_nr[iadc]+ix;
|
||||
ymap[i]=ny/2-1-iy;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
iframe=0;
|
||||
// cout << "data struct created" << endl;
|
||||
};
|
||||
|
||||
|
||||
|
||||
/**
|
||||
|
||||
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
|
@ -47,9 +47,11 @@ 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++) {
|
||||
|
@ -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;
|
||||
|
@ -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,8 +154,10 @@ 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
|
||||
|
@ -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();
|
||||
|
||||
|
||||
|
||||
|
@ -19,6 +19,8 @@ class slsDetectorData {
|
||||
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:
|
||||
|
||||
@ -56,6 +58,16 @@ class slsDetectorData {
|
||||
dataROIMask[i][j]=1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
xmap=new int[dataSize/sizeof(dataType)];
|
||||
ymap=new int[dataSize/sizeof(dataType)];
|
||||
|
||||
for (int i=0 ; i<dataSize/sizeof(dataType); i++) {
|
||||
xmap[i]=-1;
|
||||
ymap[i]=-1;
|
||||
}
|
||||
|
||||
setDataMap(dMap);
|
||||
setDataMask(dMask);
|
||||
setDataROIMask(dROI);
|
||||
@ -64,17 +76,20 @@ 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;
|
||||
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) {if (ip>=0 && ip<dataSize) {x=xmap[ip]; y=ymap[ip];} else {x=-1; y=-1;};};
|
||||
|
||||
|
||||
|
||||
/**
|
||||
@ -89,14 +104,19 @@ class slsDetectorData {
|
||||
|
||||
if (dMap==NULL) {
|
||||
for (int iy=0; iy<ny; iy++)
|
||||
for (int ix=0; ix<nx; ix++)
|
||||
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++)
|
||||
for (int ix=0; ix<nx; ix++) {
|
||||
dataMap[iy][ix]=dMap[iy][ix];
|
||||
cout << ix << " " << iy << endl;
|
||||
if (dMap[iy][ix]<dataSize) {
|
||||
xmap[dMap[iy][ix]/sizeof(dataType)]=ix;
|
||||
ymap[dMap[iy][ix]/sizeof(dataType)]=iy;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user