moench03OnTheFlyAnalysis multipthreaded with interpolation works

This commit is contained in:
2017-10-12 10:31:11 +02:00
parent d8803ca5e4
commit 10e57319bf
15 changed files with 1189 additions and 168 deletions

View File

@ -5,6 +5,11 @@
#include "slsDetectorData.h"
#include "pedestalSubtraction.h"
#include "commonModeSubtraction.h"
#include "tiffIO.h"
#ifndef FRAMEMODE_DEF
#define FRAMEMODE_DEF
enum frameMode { eFrame, ePedestal, eFlat };
#endif
template <class dataType> class analogDetector {
@ -13,6 +18,7 @@ template <class dataType> class analogDetector {
public:
/**
@ -30,7 +36,7 @@ template <class dataType> class analogDetector {
analogDetector(slsDetectorData<dataType> *d, int sign=1,
commonModeSubtraction *cm=NULL, int nnx=-1, int nny=-1) : det(d), nx(nnx), ny(nny), stat(NULL), cmSub(cm), iframe(-1), dataSign(sign){
commonModeSubtraction *cm=NULL, int nped=1000, int nnx=-1, int nny=-1, double *gm=NULL) : det(d), nx(nnx), ny(nny), stat(NULL), cmSub(cm), iframe(-1), dataSign(sign), gmap(gm) {
if (det)
det->getDetectorSize(nx,ny);
@ -38,6 +44,9 @@ template <class dataType> class analogDetector {
stat=new pedestalSubtraction*[ny];
for (int i=0; i<ny; i++) {
stat[i]=new pedestalSubtraction[nx];
for (int ix=0; ix<nx; ix++) {
stat[i][ix].SetNPedestals(nped);
}
}
@ -45,8 +54,83 @@ template <class dataType> class analogDetector {
/**
destructor. Deletes the cluster structure and the pdestalSubtraction array
*/
virtual ~analogDetector() {for (int i=0; i<ny; i++) delete [] stat[i]; delete [] stat;};
virtual ~analogDetector() {for (int i=0; i<ny; i++) delete [] stat[i]; delete [] stat; };
/**
clone
*/
analogDetector(analogDetector* orig) {
/* copy construction from orig*/
det=orig->det;
nx=orig->nx;
ny=orig->ny;
dataSign=orig->dataSign;
iframe=orig->iframe;
gmap=orig->gmap;
cmSub=orig->cmSub;
stat=new pedestalSubtraction*[ny];
for (int i=0; i<ny; i++) {
stat[i]=new pedestalSubtraction[nx];
}
int nped=orig->SetNPedestals();
//cout << nped << " " << orig->getPedestal(ix,iy) << orig->getPedestalRMS(ix,iy) << endl;
for (int iy=0; iy<ny; iy++) {
for (int ix=0; ix<nx; ix++) {
stat[iy][ix].SetNPedestals(nped);
setPedestal(ix,iy,orig->getPedestal(ix,iy),orig->getPedestalRMS(ix,iy),orig->GetNPedestals(ix,iy));
}
}
}
virtual analogDetector *Clone() {
return new analogDetector(this);
}
int getDataSize(){return det->getDataSize();};
/**
set gain map
*/
double *setGainMap(double *gm) {gmap=gm; return gmap;};
/**
return gain map
*/
double *getGainMap() {return gmap;};
double *readGainMap(const char * imgname) {
uint32 nnx, nny;
float *gm=ReadFromTiff( imgname, nny, nnx);
if (gm) {
if (gmap) delete [] gmap;
gmap=new double[nnx*nny];
for (int ix=0; ix<nnx; ix++) {
for (int iy=0; iy<nny; iy++) {
gmap[iy*nnx+ix]=gm[iy*nnx+ix];
}
}
return gmap;
}
return NULL;
}
void *writeGainMap(const char * imgname) {
float *gm=NULL;
if (gmap) {
gm=new float[nx*ny];
for (int ix=0; ix<nx; ix++) {
for (int iy=0; iy<ny; iy++) {
gm[iy*nx+ix]=gmap[iy*nx+ix];
}
}
return WriteToTiff(gm, imgname, ny, nx);
}
return NULL;
}
/** resets the pedestalSubtraction array and the commonModeSubtraction */
void newDataSet(){iframe=-1; for (int iy=0; iy<ny; iy++) for (int ix=0; ix<nx; ix++) stat[iy][ix].Clear(); if (cmSub) cmSub->Clear(); };
@ -108,11 +192,91 @@ template <class dataType> class analogDetector {
\param iy pixel y coordinate
\param val value to set
*/
virtual void setPedestal(int ix, int iy, double val, double rms=0){if (ix>=0 && ix<nx && iy>=0 && iy<ny) stat[iy][ix].setPedestal(val,rms);};
virtual void setPedestal(int ix, int iy, double val, double rms=0, int m=-1){if (ix>=0 && ix<nx && iy>=0 && iy<ny) stat[iy][ix].setPedestal(val,rms, m);};
/**
sets pedestal
\param ix pixel x coordinate
\param iy pixel y coordinate
\param val value to set
*/
virtual void setPedestalRMS(int ix, int iy, double rms=0){if (ix>=0 && ix<nx && iy>=0 && iy<ny) stat[iy][ix].setPedestalRMS(rms);};
void *writePedestals(const char * imgname) {
float *gm=NULL;
gm=new float[nx*ny];
for (int ix=0; ix<nx; ix++) {
for (int iy=0; iy<ny; iy++) {
if (cmSub)
gm[iy*nx+ix]=stat[iy][ix].getPedestal()-cmSub->getCommonMode();
else
gm[iy*nx+ix]=stat[iy][ix].getPedestal();
}
}
WriteToTiff(gm, imgname, ny, nx);
delete [] gm;
return NULL;
}
int readPedestals(const char * imgname) {
uint32 nnx, nny;
float *gm=ReadFromTiff( imgname, nny, nnx);
if (nnx>nx) nnx=nx;
if (nny>ny) nny=ny;
if (gm) {
for (int ix=0; ix<nnx; ix++) {
for (int iy=0; iy<nny; iy++) {
stat[iy][ix].setPedestal(gm[iy*nx+ix],-1,-1);
}
}
delete [] gm;
return 1;
}
return NULL;
}
void *writePedestalRMS(const char * imgname) {
float *gm=NULL;
gm=new float[nx*ny];
for (int ix=0; ix<nx; ix++) {
for (int iy=0; iy<ny; iy++) {
gm[iy*nx+ix]=stat[iy][ix].getPedestalRMS();
}
}
WriteToTiff(gm, imgname, ny, nx);
delete [] gm;
return NULL;
}
int readPedestalRMS(const char * imgname) {
uint32 nnx, nny;
float *gm=ReadFromTiff( imgname, nny, nnx);
if (nnx>nx) nnx=nx;
if (nny>ny) nny=ny;
if (gm) {
for (int ix=0; ix<nnx; ix++) {
for (int iy=0; iy<nny; iy++) {
stat[iy][ix].setPedestalRMS(gm[iy*nx+ix]);
}
}
delete [] gm;
return 1;
}
return 0;
}
virtual void addToPedestal(char *data) {
@ -137,6 +301,7 @@ template <class dataType> class analogDetector {
double val;
if (ix>=0 && ix<nx && iy>=0 && iy<ny) {
if (det)
val=dataSign*det->getValue(data, ix, iy);
else
@ -165,30 +330,42 @@ template <class dataType> class analogDetector {
return val;
};
virtual double subtractPedestal(char *data, int ix, int iy=0) {
double g=1.;
if (ix>=0 && ix<nx && iy>=0 && iy<ny) {
if (gmap) {
g=gmap[iy*nx+ix];
if (g==0) g=-1.;
}
if (det)
return dataSign*det->getValue(data, ix, iy)-getPedestal(ix,iy);
return (dataSign*det->getValue(data, ix, iy)-getPedestal(ix,iy))/g;
else
return ((double*)data)[iy*nx+ix]-getPedestal(ix,iy);
return (((double*)data)[iy*nx+ix]-getPedestal(ix,iy))/g;
}
};
virtual int getNPhotons(char *data, int ix, int iy=0, int thr=-1) {
if (ix>=0 && ix<nx && iy>=0 && iy<ny) {
if (thr<=0) thr=-1*thr*getPedestalRMS(ix,iy);
double g=1.;
if (ix>=0 && ix<nx && iy>=0 && iy<ny) {
if (gmap) {
g=gmap[iy*nx+ix];
if (g==0) g=-1.;
}
if (thr<=0) thr=-1*thr*getPedestalRMS(ix,iy)/g;
if (det)
return (dataSign*det->getValue(data, ix, iy)-getPedestal(ix,iy))/thr;
return (dataSign*det->getValue(data, ix, iy)-getPedestal(ix,iy))/g/thr;
else
return (((double*)data)[(iy)*nx+ix]-getPedestal(ix,iy))/thr;
return (((double*)data)[(iy)*nx+ix]-getPedestal(ix,iy))/g/thr;
}
return 0;
@ -226,6 +403,13 @@ template <class dataType> class analogDetector {
return stat[0][0].SetNPedestals();
};
int GetNPedestals(int ix, int iy) {
if (ix>=0 && ix<nx && iy>=0 && iy<ny)
return stat[iy][ix].GetNPedestals();
else
return -1;
};
double getROI(char *data, int xmin, int xmax, int ymin=0, int ymax=1) {
double val=0;
@ -235,9 +419,19 @@ template <class dataType> class analogDetector {
val+=subtractPedestal(data, ix, iy);
return val;
}
};
virtual void processData(char *data, frameMode i=eFrame, int *val=NULL) {
switch(i) {
case ePedestal:
addToPedestal(data);
break;
default:
getNPhotons(data,-1,val);
}
};
protected:
@ -248,7 +442,7 @@ template <class dataType> class analogDetector {
commonModeSubtraction *cmSub;/**< commonModeSubtraction class */
int dataSign; /**< sign of the data i.e. 1 if photon is positive, -1 if negative */
int iframe; /**< frame number (not from file but incremented within the dataset every time newFrame is called */
double *gmap;
};
#endif