fixed probelem with multiThreadedInterpolatingDetector

This commit is contained in:
bergamaschi 2018-10-16 17:17:24 +02:00
parent 4aa720eecb
commit 38a6393dde
5 changed files with 85 additions and 93 deletions

View File

@ -127,7 +127,6 @@ class interpolatingDetector : public singlePhotonDetector {
return interp->getInterpolatedImage();
else
return analogDetector<uint16_t>::getImage();
//cout << "null " << endl;
}
#ifdef MYROOT1
@ -179,7 +178,8 @@ int addFrame(char *data, int *ph=NULL, int ff=0) {
double int_x, int_y;
double eta_x, eta_y;
if (interp) {
pthread_mutex_lock(fi);
cout << "int" << endl;
pthread_mutex_lock(fi);
for (nph=0; nph<nphFrame; nph++) {
if (ff) {
interp->addToFlatField((clusters+nph)->quadTot,(clusters+nph)->quad,(clusters+nph)->get_cluster(),eta_x, eta_y);
@ -214,7 +214,7 @@ int addFrame(char *data, int *ph=NULL, int ff=0) {
if (interp)
addFrame(data,val,1);
else
singlePhotonDetector::processData(data,val);
singlePhotonDetector::processData(data,val);
break;
default:
if (interp)

View File

@ -0,0 +1,17 @@
ZMQLIB=../../slsReceiverSoftware/include
INCDIR= -I$(ZMQLIB) -I. -I../dataStructures ../tiffIO.cpp -I../ -I../interpolations/
LDFLAG= -L/usr/lib64/ -lpthread -lm -lstdc++ -lzmq -pthread -lrt -ltiff -L$(ZMQLIB) -O3
#-L../../bin -lhdf5 -L.
#DESTDIR?=../bin
all: moenchZmqProcess
moenchZmqProcess: moenchZmqProcess.cpp clean
g++ -o moenchZmqProcess moenchZmqProcess.cpp $(LDFLAG) $(INCDIR) $(LIBHDF5) $(LIBRARYCBF) -DNEWZMQ -DINTERP
clean:
rm -f moenchZmqProcess

View File

@ -143,10 +143,13 @@ int main(int argc, char *argv[]) {
nframes++;
}
quad=interp->calcQuad(cl.get_cluster(), sum, totquad, sDum);
if (sum>cmin && totquad/sum>0.8 && totquad/sum<1.2 && totquad<cmax && quad<cmax) {
if (sum>cmin && totquad/sum>0.8 && totquad/sum<1.2 && sum<cmax ) {
nph++;
// if (sum>200 && sum<580) {
// interp->getInterpolatedPosition(cl.x,cl.y, totquad,quad,cl.get_cluster(),int_x, int_y);
#ifdef SOLEIL
if (cl.x>210 && cl.x<240 && cl.y>210 && cl.y<240) {
#endif
#ifndef FF
interp->getInterpolatedPosition(cl.x,cl.y, cl.get_cluster(),int_x, int_y);
interp->addToImage(int_x, int_y);
@ -154,7 +157,9 @@ int main(int argc, char *argv[]) {
#ifdef FF
interp->addToFlatField(cl.get_cluster(), etax, etay);
#endif
#ifdef SOLEIL
}
#endif
if (nph%1000000==0) cout << nph << endl;
if (nph%100000000==0) {

View File

@ -109,18 +109,25 @@ int main(int argc, char *argv[]) {
//analogDetector<uint16_t> *filter=new analogDetector<uint16_t>(det,1,NULL,1000);
// singlePhotonDetector *filter=new singlePhotonDetector(det,3, 5, 1, 0, 1000, 10);
#ifndef INTERP
singlePhotonDetector *filter=new singlePhotonDetector(det,3, 5, 1, 0, 1000, 10);
multiThreadedCountingDetector *mt=new multiThreadedCountingDetector(filter,nthreads,fifosize);
// multiThreadedAnalogDetector *mt=new multiThreadedAnalogDetector(filter,nthreads,fifosize);
#endif
#ifdef INTERP
eta2InterpolationPosXY *interp=new eta2InterpolationPosXY(npx, npy, nSubPixels, etabins, etamin, etamax);
if (etafname) interp->readFlatField(etafname);
interpolatingDetector *filter=new interpolatingDetector(det,interp, 5, 1, 0, 1000, 10);
cout << " filter" <<endl;
multiThreadedInterpolatingDetector *mt=new multiThreadedInterpolatingDetector(filter,nthreads,fifosize);
#endif
char* buff;
// multiThreadedCountingDetector *mt=new multiThreadedCountingDetector(filter,nthreads,fifosize);
// multiThreadedAnalogDetector *mt=new multiThreadedAnalogDetector(filter,nthreads,fifosize);
multiThreadedInterpolatingDetector *mt=new multiThreadedInterpolatingDetector(filter,nthreads,fifosize);
mt->setFrameMode(eFrame);
mt->StartThreads();
mt->popFree(buff);
@ -302,12 +309,15 @@ int main(int argc, char *argv[]) {
sprintf(ofname,"%s_%d_ped.tiff",fname,fileindex);
mt->writePedestal(ofname);
cout << "Writing pedestal to " << ofname << endl;
} else if (fMode==eFlat) {
mt->prepareInterpolation(ok);
sprintf(ofname,"%s_%d_eta.tiff",fname,fileindex);
mt->writeFlatField(ofname);
}
#ifdef INTERP
else if (fMode==eFlat) {
mt->prepareInterpolation(ok);
sprintf(ofname,"%s_%d_eta.tiff",fname,fileindex);
mt->writeFlatField(ofname);
cout << "Writing eta to " << ofname << endl;
}
}
#endif
else {
sprintf(ofname,"%s_%d.tiff",fname,fileindex);
mt->writeImage(ofname);
@ -334,7 +344,9 @@ int main(int argc, char *argv[]) {
// cout << ix << " " << ped[ix] << endl;
}
} else if (fMode==eFlat) {
}
#ifdef INTERP
else if (fMode==eFlat) {
int nb;
double emi, ema;
int *ff=mt->getFlatField(nb, emi, ema);
@ -345,6 +357,7 @@ int main(int argc, char *argv[]) {
dout[ix]=ff[ix];
}
}
#endif
else {
detimage=mt->getImage(nnx,nny,nns);
cprintf(MAGENTA,"Get image!\n");
@ -483,7 +496,9 @@ int main(int argc, char *argv[]) {
// cprintf(MAGENTA, "Resetting pedestal\n");
fMode=ePedestal;
isPedestal=1;
} else if (frameMode_s == "flatfield") {
}
#ifdef INTERP
else if (frameMode_s == "flatfield") {
fMode=eFlat;
isFlat=1;
} else if (frameMode_s == "newFlatfield") {
@ -492,6 +507,7 @@ int main(int argc, char *argv[]) {
cprintf(MAGENTA, "Resetting flatfield\n");
fMode=eFlat;
}
#endif
else {
fMode=eFrame;
isPedestal=0;
@ -553,15 +569,22 @@ int main(int argc, char *argv[]) {
if (doc.HasMember("detectorMode")) {
if (doc["detectorMode"].IsString()) {
detectorMode_s=doc["detectorMode"].GetString();
#ifdef INTERP
if (detectorMode_s == "interpolating"){
dMode=eInterpolating;
mt->setInterpolation(interp);
} else if (detectorMode_s == "counting"){
} else
#endif
if (detectorMode_s == "counting"){
dMode=ePhotonCounting;
#ifdef INTERP
mt->setInterpolation(NULL);
#endif
} else {
dMode=eAnalog;
#ifdef INTERP
mt->setInterpolation(NULL);
#endif
}
}

View File

@ -10,74 +10,6 @@
using namespace std;
/* class threadedInterpolatingDetector : public threadedCountingDetector */
/* { */
/* public: */
/* threadedInterpolatingDetector(interpolatingDetector *d, int fs=10000) : threadedCountingDetector(d,fs) {}; */
/* virtual void prepareInterpolation(int &ok){ */
/* slsInterpolation *interp=((interpolatingDetector*)det)->getInterpolation(); */
/* if (interp) */
/* interp->prepareInterpolation(ok); */
/* } */
/* virtual int *getFlatField(){ */
/* slsInterpolation *interp=((interpolatingDetector*)det)->getInterpolation(); */
/* if (interp) */
/* return interp->getFlatField(); */
/* else */
/* return NULL; */
/* } */
/* virtual int *setFlatField(int *ff, int nb, double emin, double emax){ */
/* slsInterpolation *interp=((interpolatingDetector*)det)->getInterpolation(); */
/* if (interp) */
/* return interp->setFlatField(ff, nb, emin, emax); */
/* else */
/* return NULL; */
/* } */
/* void *writeFlatField(const char * imgname) { */
/* slsInterpolation *interp=((interpolatingDetector*)det)->getInterpolation(); */
/* if (interp) */
/* interp->writeFlatField(imgname); */
/* } */
/* void *readFlatField(const char * imgname, int nb=-1, double emin=1, double emax=0){ */
/* slsInterpolation *interp=((interpolatingDetector*)det)->getInterpolation(); */
/* if (interp) */
/* interp->readFlatField(imgname, nb, emin, emax); */
/* } */
/* virtual int *getFlatField(int &nb, double emi, double ema){ */
/* slsInterpolation *interp=((interpolatingDetector*)det)->getInterpolation(); */
/* int *ff=NULL; */
/* if (interp) { */
/* ff=interp->getFlatField(nb,emi,ema); */
/* } */
/* return ff; */
/* } */
/* virtual slsInterpolation *getInterpolation() { */
/* return ((interpolatingDetector*)det)->getInterpolation(); */
/* } */
/* virtual void resetFlatField() { ((interpolatingDetector*)det)->resetFlatField();}; */
/* virtual int setNSubPixels(int ns) { return ((interpolatingDetector*)det)->setNSubPixels(ns);}; */
/* virtual slsInterpolation *setInterpolation(slsInterpolation *f){ */
/* cout << "thr" << endl; */
/* return ((interpolatingDetector*)det)->setInterpolation(f); */
/* }; */
/* protected: */
/* interpolatingDetector *det; */
/* }; */
class multiThreadedInterpolatingDetector : public multiThreadedCountingDetector
{
@ -125,13 +57,9 @@ public:
*/
virtual slsInterpolation *setInterpolation(slsInterpolation *f){
int ok;
// for (int i=0; i<nThreads; i++) {
cout << "mt" << endl;
return (dets[0])->setInterpolation(f);
//dets[i]->setMutex(&fmutex);
// }
//dets[0]->prepareInterpolation(ok);
//return (slsInterpolation*)((interpolatingDetector*)dets[0])->getInterpolation();
for (int i=0; i<nThreads; i++)
(dets[i])->setInterpolation(f);
return (dets[0])->getInterpolation();
};
virtual slsInterpolation *getInterpolation(){
@ -141,6 +69,25 @@ public:
virtual int *getImage(int &nnx, int &nny, int &ns) {
if (getInterpolation()==NULL) return multiThreadedAnalogDetector::getImage(nnx,nny,ns);
//if one interpolates, the whole image is stored in detector 0;
int *img;
// int nnx, nny, ns;
// int nnx, nny, ns;
int nn=dets[0]->getImageSize(nnx, nny,ns);
if (image) {
delete image;
image=NULL;
}
image=new int[nn];
img=dets[0]->getImage();
for (int i=0; i<nn; i++) {
image[i]=img[i];
}
return image;
};
};