diff --git a/examples/moench03_T1_lab.config b/examples/moench03_T1_lab.config index 4886a7986..f2d309bf3 100644 --- a/examples/moench03_T1_lab.config +++ b/examples/moench03_T1_lab.config @@ -1,4 +1,4 @@ -hostname bchip119 +hostname bchip085+ patword 0000 0000000000000000 patword 0001 0000000000000000 @@ -428,16 +428,16 @@ patwaittime2 0 #0:rx_hostname mpc2011 ####mx-test-1 -0:rx_udpip 10.1.1.120 +0:rx_udpip 10.1.1.100 0:detectorip 10.1.1.19 0:rx_udpport 32410 ####gui listening to (on receiver pc) -zmqip 129.129.202.146 +zmqip 129.129.202.92 zmqport 30001 ####data streaming out of -rx_zmqip 10.1.4.120 +rx_zmqip 10.1.1.100 rx_zmqport 30003 -0:rx_hostname mx-test-1 +0:rx_hostname pcmoench01 diff --git a/slsDetectorCalibration/Stat.h b/slsDetectorCalibration/Stat.h new file mode 100644 index 000000000..196f5bbb7 --- /dev/null +++ b/slsDetectorCalibration/Stat.h @@ -0,0 +1,45 @@ +class Stat + { + public: + + Stat() : n(0), m(0.), m2(0.) {} + + void Clear() + { + n = 0; + m=0; + m2=0; + } + + void Push(double x) + { + + m+=x; + m2+=x*x; + n++; + } + + int NumDataValues() const + { + return n; + } + + double Mean() const + { + return (n > 0) ? m/n : 0.0; + } + + double Variance() const + { + return ( (n >0 ) ? (m2/n-m*m/(n*n)) : 0.0 ); + } + + double StandardDeviation() const + { + return sqrt( Variance() ); + } + + private: + int n; + double m, m2; + }; diff --git a/slsDetectorCalibration/commonModeSubtractionNew.h b/slsDetectorCalibration/commonModeSubtractionNew.h new file mode 100644 index 000000000..255500644 --- /dev/null +++ b/slsDetectorCalibration/commonModeSubtractionNew.h @@ -0,0 +1,116 @@ +#ifndef COMMONMODESUBTRACTION_H +#define COMMONMODESUBTRACTION_H + +#include + +class commonModeSubtraction { + + /** @short class to calculate the common mode of the pedestals based on an approximated moving average*/ + + public: + + /** constructor + \param nn number of samples for the moving average to calculate the average common mode + \param iroi number of regions on which one can calculate the common mode separately. Defaults to 1 i.e. whole detector + + */ + commonModeSubtraction(int iroi=1, int ns=3) : nROI(iroi), nsigma(ns) { + mean=new double[nROI]; + mean2=new double[nROI]; + nCm=new double[nROI]; + }; + + /** destructor - deletes the moving average(s) and the sum of pedestals calculator(s) */ + virtual ~commonModeSubtraction() {delete [] mean; delete [] mean2; delete [] nCm;}; + + + /** clears the moving average and the sum of pedestals calculation - virtual func*/ + virtual void Clear(){ + for (int i=0; i0) cmStat[i].Calc(cmPed[i]/nCm[i]); + nCm[i]=0; + mean[i]=0; + mean2[i]=0; + }}; + + /** adds the pixel to the sum of pedestals -- virtual func must be overloaded to define the regions of interest + \param val value to add + \param ix pixel x coordinate + \param iy pixel y coordinate + */ + virtual void addToCommonMode(double val, int ix=0, int iy=0) { + + int iroi=getROI(ix,iy); + // if (iroi==0) val=100; + // else val=-100; + // if (isc>=0 && isc=0 && iroi=0 && iroi0) + return mean[iroi]/nCm[iroi]; + } + return 0; + }; + + /** gets the common mode i.e. the difference between the current average sum of pedestals mode and the average pedestal + \param ix pixel x coordinate + \param iy pixel y coordinate + \return the difference between the current average sum of pedestals and the average pedestal + */ + virtual double getCommonModeRMS(int ix=0, int iy=0) { + int iroi=getROI(ix,iy); + if (iroi>=0 && iroi0) + return sqrt(mean2[iroi]/nCm[iroi]-(mean[iroi]/nCm[iroi])*(mean[iroi]/nCm[iroi])); + } + return 0; + }; + + /** + gets the common mode ROI for pixel ix, iy -should be overloaded! + */ + virtual int getROI(int ix, int iy){ (void) ix; (void) iy; return 0;}; + + + + protected: + double *mean; /** { for (ib=0; ib { ii++; }//end for - cout << "Decoded "<readFlatField(fname); - interp->prepareInterpolation(ok, MAX_ITERATIONS); + interp->prepareInterpolation(ok);//, MAX_ITERATIONS); +#endif // return 0; #endif #ifdef FF @@ -146,8 +153,9 @@ int main(int argc, char *argv[]) { if (nframes==0) f0=lastframe; nframes++; } - quad=interp->calcQuad(cl.get_cluster(), sum, totquad, sDum); - if (sum>cmin && totquad/sum>0.8 && totquad/sum<1.2 && sumcalcQuad(cl.get_cluster(), sum, totquad, sDum); + quad=interp->calcEta(cl.get_cluster(), etax, etay, sum, totquad, sDum); + if (sum>cmin && totquad/sum>0.8 && totquad/sum<1.2 && sum200 && sum<580) { // interp->getInterpolatedPosition(cl.x,cl.y, totquad,quad,cl.get_cluster(),int_x, int_y); @@ -155,16 +163,32 @@ int main(int argc, char *argv[]) { // 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->getInterpolatedPosition(cl.x,cl.y, cl.get_cluster(),int_x, int_y); + interp->getInterpolatedPosition(cl.x,cl.y, etax, etay, quad,int_x, int_y); // cout <<"**************"<< endl; // cout << cl.x << " " << cl.y << " " << sum << endl; // cl.print(); // cout << int_x << " " << int_y << endl; // cout <<"**************"<< endl; - interp->addToImage(int_x, int_y); + // if (etax!=0 && etay!=0 && etax!=1 && etay!=1) + interp->addToImage(int_x, int_y); + if (int_x<0 || int_y<0 || int_x>400 || int_y>400) { + cout <<"**************"<< endl; + cout << cl.x << " " << cl.y << " " << sum << endl; + cl.print(); + cout << int_x << " " << int_y << endl; + cout <<"**************"<< endl; + } #endif #ifdef FF - interp->addToFlatField(cl.get_cluster(), etax, etay); + // interp->addToFlatField(cl.get_cluster(), etax, etay); +// #ifdef UCL +// if (cl.x>50) +// #endif +// if (etax!=0 && etay!=0 && etax!=1 && etay!=1) + interp->addToFlatField(etax, etay); + // if (etax==0 || etay==0) cout << cl.x << " " << cl.y << endl; + #endif // #ifdef SOLEIL // } @@ -179,12 +203,12 @@ int main(int argc, char *argv[]) { interp->writeFlatField(outfname); #endif - } + } + } - } + } - } fclose(f); #ifdef FF interp->writeFlatField(outfname); @@ -203,7 +227,7 @@ int main(int argc, char *argv[]) { } } } - cout << "Read " << nframes << " frames (first frame: " << f0 << " last frame: " << lastframe << " delta:" << lastframe-f0 << ")"< + +//#include "moench03T1ZmqData.h" +//#define DOUBLE_SPH +//#define MANYFILES + +#ifdef DOUBLE_SPH +#include "single_photon_hit_double.h" +#endif + +#ifndef DOUBLE_SPH +#include "single_photon_hit.h" +#endif + +//#include "etaInterpolationPosXY.h" +#include "noInterpolation.h" +#include "etaInterpolationCleverAdaptiveBins.h" +//#include "etaInterpolationRandomBins.h" +using namespace std; +#define NC 400 +#define NR 400 +#define MAX_ITERATIONS (nSubPixels*100) +#define MAX_EBINS 100 +#define XTALK + +int main(int argc, char *argv[]) { + +#ifndef FF + if (argc<9) { + cout << "Wrong usage! Should be: "<< argv[0] << " infile etafile outfile runmin runmax ns cmin cmax" << endl; + return 1; + } +#endif + +#ifdef FF + if (argc<7) { + cout << "Wrong usage! Should be: "<< argv[0] << " infile etafile runmin runmax cmin cmax" << endl; + return 1; + } +#endif + int iarg=4; + char infname[10000]; + char fname[10000]; + char outfname[10000]; +#ifndef FF + iarg=4; +#endif + +#ifdef FF + iarg=3; +#endif + int runmin=atoi(argv[iarg++]); + int runmax=atoi(argv[iarg++]); + cout << "Run min: " << runmin << endl; + cout << "Run max: " << runmax << endl; + + int nsubpix=4; +#ifndef FF + nsubpix=atoi(argv[iarg++]); + cout << "Subpix: " << nsubpix << endl; +#endif + float cmin=atof(argv[iarg++]); + float cmax=atof(argv[iarg++]); + cout << "Energy min: " << cmin << endl; + cout << "Energy max: " << cmax << endl; + int n_ebins=1; + if (argc>iarg) + n_ebins=atoi(argv[iarg++]); + //int etabins=500; + int etabins=1000;//nsubpix*2*100; + double etamin=-1, etamax=2; + //double etamin=-0.1, etamax=1.1; + double eta3min=-2, eta3max=2; + int quad; + double sum, totquad; + double sDum[2][2]; + double etax, etay, int_x, int_y; + double eta3x, eta3y, int3_x, int3_y, noint_x, noint_y; + int ok; + int f0=-1; + int ix, iy, isx, isy; + int nframes=0, lastframe=-1; + double d_x, d_y, res=5, xx, yy; + int nph=0, badph=0, totph=0; + FILE *f=NULL; + +#ifdef DOUBLE_SPH + single_photon_hit_double cl(3,3); +#endif + +#ifndef DOUBLE_SPH + single_photon_hit cl(3,3); +#endif + + int nSubPixels=nsubpix; + + int iebin=0; + double eb_size=(cmax-cmin)/n_ebins; +#ifndef NOINTERPOLATION + // eta2InterpolationPosXY *interp[MAX_EBINS]; + eta2InterpolationCleverAdaptiveBins *interp[MAX_EBINS]; + for (int i=0; i< n_ebins; i++) { + //interp[i]=new eta2InterpolationPosXY(NC, NR, nsubpix, etabins, etamin, etamax); + interp[i]=new eta2InterpolationCleverAdaptiveBins(NC, NR, nsubpix, etabins, etamin, etamax); + } +#endif +#ifdef NOINTERPOLATION + noInterpolation *interp=new noInterpolation(NC, NR, nsubpix); +#endif + + + +#ifndef FF +#ifndef NOINTERPOLATION + cout << "read ff " << argv[2] << endl; + for (int i=0; i< n_ebins; i++) { + sprintf(fname,argv[2],i); + interp[i]->readFlatField(fname); + interp[i]->prepareInterpolation(ok);//, MAX_ITERATIONS); + } +#endif + // return 0; +#endif +#ifdef FF + cout << "Will write eta file " << argv[2] << endl; +#endif + + int *img; + float *totimg=new float[NC*NR*nsubpix*nsubpix]; + for (ix=0; ixcalcQuad(cl.get_cluster(), sum, totquad, sDum); + quad=interp[0]->calcEta(cl.get_cluster(), etax, etay, sum, totquad, sDum); + if (sum>cmin && totquad/sum>0.8 && totquad/sum<1.2 && sum=0 && iebin200 && 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[iebin]->getInterpolatedPosition(cl.x,cl.y, etax, etay, quad,int_x, int_y); + // cout <<"**************"<< endl; + // cout << cl.x << " " << cl.y << " " << sum << endl; + // cl.print(); + // cout << int_x << " " << int_y << endl; + // cout <<"**************"<< endl; + if (etax!=0 && etay!=0 && etax!=1 && etay!=1) + interp[iebin]->addToImage(int_x, int_y); +#endif +#ifdef FF + // interp->addToFlatField(cl.get_cluster(), etax, etay); +#ifdef UCL + if (cl.x>50) +#endif + if (etax!=0 && etay!=0 && etax!=1 && etay!=1) + interp[iebin]->addToFlatField(etax, etay); + // if (etax==0 || etay==0) cout << cl.x << " " << cl.y << endl; + +#endif +// #ifdef SOLEIL +// } +// #endif + + if (nph%1000000==0) cout << nph << endl; + if (nph%10000000==0) { +#ifndef FF + for (int i=0; iwriteInterpolatedImage(outfname); + } +#endif +#ifdef FF + for (int i=0; iwriteFlatField(outfname); + } +#endif + + } + } + + } + + } + fclose(f); +#ifdef FF + for (int i=0; iwriteFlatField(outfname); + } +#endif + +#ifndef FF + for (int i=0; iwriteInterpolatedImage(outfname); + img=interp[i]->getInterpolatedImage(); + for (ix=0; ixclearInterpolatedImage(); + } + cout << "Read " << nframes << " frames (first frame: " << f0 << " last frame: " << lastframe << " delta:" << lastframe-f0 << ")"<writeFlatField(outfname); +#endif + + cout << "Filled " << nph << " (/"<< totph <<") " << endl; + return 0; +} + diff --git a/slsDetectorCalibration/moenchExecutables/moenchZmqProcess.cpp b/slsDetectorCalibration/moenchExecutables/moenchZmqProcess.cpp index 186b71c23..19cd832b1 100644 --- a/slsDetectorCalibration/moenchExecutables/moenchZmqProcess.cpp +++ b/slsDetectorCalibration/moenchExecutables/moenchZmqProcess.cpp @@ -69,7 +69,6 @@ int main(int argc, char *argv[]) { time_t begin,end,finished; - if (argc > 4) { socketip2 = argv[3]; portnum2 = atoi(argv[4]); @@ -113,6 +112,7 @@ int main(int argc, char *argv[]) { int multisize=size; int dataSize=size; + char dummybuff[size]; @@ -685,6 +685,10 @@ int main(int argc, char *argv[]) { mt->pushData(buff); mt->nextThread(); mt->popFree(buff); + } else { + cprintf(RED, "Incomplete frame: received only %d packet\n", packetNumber); + length = zmqsocket->ReceiveData(0, dummybuff, size); + } diff --git a/slsDetectorCalibration/singlePhotonDetector.h b/slsDetectorCalibration/singlePhotonDetector.h index 573d90140..0ff15b03f 100644 --- a/slsDetectorCalibration/singlePhotonDetector.h +++ b/slsDetectorCalibration/singlePhotonDetector.h @@ -562,10 +562,10 @@ int *getClusters(char *data, int *ph=NULL) { static void writeClusters(FILE *f, single_photon_hit *cl, int nph, int fn=0){ -#ifndef OLDFORMAT - if (fwrite((void*)&fn, 1, sizeof(int), f)) - if (fwrite((void*)&nph, 1, sizeof(int), f)) -#endif +/* #ifndef OLDFORMAT */ +/* if (fwrite((void*)&fn, 1, sizeof(int), f)) */ +/* if (fwrite((void*)&nph, 1, sizeof(int), f)) */ +/* #endif */ for (int i=0; iwrite(f); }; void writeClusters(FILE *f, int fn=0){ diff --git a/slsDetectorCalibration/single_photon_hit.h b/slsDetectorCalibration/single_photon_hit.h index 0bbc23aef..7bb53120f 100644 --- a/slsDetectorCalibration/single_photon_hit.h +++ b/slsDetectorCalibration/single_photon_hit.h @@ -39,14 +39,16 @@ class single_photon_hit { //fwrite((void*)this, 1, 3*sizeof(int)+4*sizeof(double)+sizeof(quad), myFile); // if (fwrite((void*)this, 1, sizeof(int)+2*sizeof(int16_t), myFile)) -#ifdef OLDFORMAT - if (fwrite((void*)&iframe, 1, sizeof(int), myFile)) -#endif + //#ifdef OLDFORMAT + if (fwrite((void*)&iframe, 1, sizeof(int), myFile)) {}; + //#endif #ifndef WRITE_QUAD + //printf("no quad "); if (fwrite((void*)&x, 2, sizeof(int16_t), myFile)) return fwrite((void*)data, 1, dx*dy*sizeof(int), myFile); #endif #ifdef WRITE_QUAD + // printf("quad "); int qq[4]; switch(quad) { case TOP_LEFT: @@ -102,18 +104,43 @@ class single_photon_hit { size_t read(FILE *myFile) { //fread((void*)this, 1, 3*sizeof(int)+4*sizeof(double)+sizeof(quad), myFile); -#ifdef OLDFORMAT - if (fread((void*)&iframe, 1, sizeof(int), myFile)) -#endif + //#ifdef OLDFORMAT + if (fread((void*)&iframe, 1, sizeof(int), myFile)) {} + //#endif #ifndef WRITE_QUAD + // printf( "no quad \n"); if (fread((void*)&x, 2, sizeof(int16_t), myFile)) return fread((void*)data, 1, dx*dy*sizeof(int), myFile); #endif #ifdef WRITE_QUAD int qq[4]; + // printf( "quad \n"); if (fread((void*)&x, 2, sizeof(int16_t), myFile)) if (fread((void*)qq, 1, 4*sizeof(int), myFile)) { + quad=TOP_RIGHT; + int mm=qq[0]; + for (int i=1; i<4; i++) { + if (qq[i]0 && getFPGASignal(i)=0 && t>=0 && rot<0) { - ret=GATE_WITH_START_TRIGGER; - } else if (g<0 && t>=0 && rot<0) { + if (bus_r(EXT_SIGNAL_REG)&0x1) ret=TRIGGER_EXPOSURE; - } else if (g>=0 && t<0 && rot<0) { - ret=GATE_FIX_NUMBER; - } else if (g<0 && t<0 && rot>0) { - ret=TRIGGER_READOUT; - } else if (g<0 && t<0 && rot<0) { + else ret=AUTO_TIMING; - } + + // timingMode=ret; diff --git a/slsDetectorSoftware/jctbDetectorServer/gitInfo.txt b/slsDetectorSoftware/jctbDetectorServer/gitInfo.txt index bb85eb2b5..430dc823b 100644 --- a/slsDetectorSoftware/jctbDetectorServer/gitInfo.txt +++ b/slsDetectorSoftware/jctbDetectorServer/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsDetectorSoftware/jctbDetectorServer URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repsitory UUID: 2815458652a93d861e8bd082e537ac63d945f3fb -Revision: 31 +Repsitory UUID: 9e5ec6a57bf206fe9384260fc4040867a9bbd71c +Revision: 33 Branch: developer -Last Changed Author: Anna_Bergamaschi -Last Changed Rev: 4057 -Last Changed Date: 2018-12-06 10:55:32.000000002 +0100 ./server_funcs.c +Last Changed Author: Erik_Frojdh +Last Changed Rev: 4065 +Last Changed Date: 2019-01-30 17:38:35.000000002 +0100 ./firmware_funcs.c diff --git a/slsDetectorSoftware/jctbDetectorServer/gitInfoMoench.h b/slsDetectorSoftware/jctbDetectorServer/gitInfoMoench.h index a033256cf..4a97bf6f0 100644 --- a/slsDetectorSoftware/jctbDetectorServer/gitInfoMoench.h +++ b/slsDetectorSoftware/jctbDetectorServer/gitInfoMoench.h @@ -1,6 +1,6 @@ #define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git" -#define GITREPUUID "2815458652a93d861e8bd082e537ac63d945f3fb" -#define GITAUTH "Anna_Bergamaschi" -#define GITREV 0x4057 -#define GITDATE 0x20181206 +#define GITREPUUID "9e5ec6a57bf206fe9384260fc4040867a9bbd71c" +#define GITAUTH "Erik_Frojdh" +#define GITREV 0x4065 +#define GITDATE 0x20190130 #define GITBRANCH "developer" diff --git a/slsDetectorSoftware/slsDetector/slsDetectorActions.cpp b/slsDetectorSoftware/slsDetector/slsDetectorActions.cpp index bdcc6cebd..6e8eaf632 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorActions.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorActions.cpp @@ -176,31 +176,33 @@ int slsDetectorActions::setScan(int iscan, string script, int nvalues, double *v if (par!="") strcpy(scanParameter[iscan],par.c_str()); - if (nvalues>=0) { - if (nvalues==0) - scanMode[iscan]=noScan; - else { - nScanSteps[iscan]=nvalues; + if (nvalues>=0) { + // cout << "nvalues " << nvalues << endl; + if (nvalues==0) + scanMode[iscan]=noScan; + else { + nScanSteps[iscan]=nvalues; if (nvalues>MAX_SCAN_STEPS) nScanSteps[iscan]=MAX_SCAN_STEPS; - } + } } - if (values && scanMode[iscan]>0 ) { - for (int iv=0; iv0 ) { + for (int iv=0; iv=0) - scanPrecision[iscan]=precision; - - if (scanMode[iscan]>0){ + if (precision>=0) + scanPrecision[iscan]=precision; + + if (scanMode[iscan]>0){ *actionMask |= 1<< (iscan+MAX_ACTIONS); - } else { - *actionMask &= ~(1 << (iscan+MAX_ACTIONS)); - } - + } else { + *actionMask &= ~(1 << (iscan+MAX_ACTIONS)); + } + setTotalProgress(); diff --git a/slsReceiverSoftware/src/Listener.cpp b/slsReceiverSoftware/src/Listener.cpp index 8dcd6586c..8ba49bfb1 100644 --- a/slsReceiverSoftware/src/Listener.cpp +++ b/slsReceiverSoftware/src/Listener.cpp @@ -64,12 +64,9 @@ Listener::Listener(int ind, detectorType dtype, Fifo*& f, runStatus* s, Listener::~Listener() { - if (udpSocket){ - delete udpSocket; - sem_post(&semaphore_socket); - sem_destroy(&semaphore_socket); - } - + if (udpSocket) delete udpSocket; + sem_post(&semaphore_socket); + sem_destroy(&semaphore_socket); if (carryOverPacket) delete [] carryOverPacket; if (listeningPacket) delete [] listeningPacket; ThreadObject::DestroyThread(); @@ -560,14 +557,20 @@ uint32_t Listener::ListenToAnImage(char* buf) { lastCaughtFrameIndex = fnum; -#ifdef VERBOSE + //#ifdef VERBOSE //if (!index) cprintf(GREEN,"Listening %d: currentfindex:%lu, fnum:%lu, pnum:%u numpackets:%u\n", index,currentFrameIndex, fnum, pnum, numpackets); -#endif + //#endif if (!measurementStartedFlag) RecordFirstIndices(fnum); + if (pnum >= pperFrame ) { + cprintf(RED,"bad packet, throwing away. packets caught so far: %d\n", numpackets); + + return 0; // bad packet + } + //future packet by looking at image number (all other detectors) if (fnum != currentFrameIndex) { //cprintf(RED,"setting carry over flag to true num:%llu nump:%u\n",fnum, numpackets ); @@ -603,6 +606,7 @@ uint32_t Listener::ListenToAnImage(char* buf) { memcpy(buf + fifohsize + (pnum * dsize) - 2, listeningPacket + hsize, dsize+2); break; case JUNGFRAUCTB: + if (pnum == (pperFrame-1)) memcpy(buf + fifohsize + (pnum * dsize), listeningPacket + hsize, corrected_dsize); else