From e7af4d75180992bf57a6368df445bc8afe4e054e Mon Sep 17 00:00:00 2001 From: Anna Bergamaschi Date: Fri, 9 Aug 2019 12:01:26 +0200 Subject: [PATCH 01/14] removed measurments from ctb gui --- ctbGui/ctbAcquisition.cpp | 5 +- ctbGui/ctbPattern.cpp | 52 +++++++++---------- ctbGui/ctbPattern.h | 4 +- .../dataStructures/deserializer.h | 4 +- 4 files changed, 32 insertions(+), 33 deletions(-) diff --git a/ctbGui/ctbAcquisition.cpp b/ctbGui/ctbAcquisition.cpp index 6a6c82086..4f7cf87a5 100755 --- a/ctbGui/ctbAcquisition.cpp +++ b/ctbGui/ctbAcquisition.cpp @@ -1133,13 +1133,12 @@ void ctbAcquisition::changePlot(){ if (rb2D->IsOn()) { if (h2DMapDig) h2DMapDig->Draw("colz"); + else if (h1DMap) + h1DMap->Draw(); } else if (bitStack) bitStack->Draw("NOSTACK"); else cout << "bitStack is NULL" << endl; - - - } diff --git a/ctbGui/ctbPattern.cpp b/ctbGui/ctbPattern.cpp index 4823f8570..e25974988 100755 --- a/ctbGui/ctbPattern.cpp +++ b/ctbGui/ctbPattern.cpp @@ -510,24 +510,24 @@ ctbPattern::ctbPattern(TGVerticalFrame *page, multiSlsDetector *det) e->Connect("ReturnPressed()","ctbPattern",this,"setCycles()"); - sprintf(tit, "Number of measurements: "); + // sprintf(tit, "Number of measurements: "); - label= new TGLabel(hframe, tit); - hframe->AddFrame(label,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 1, 1, 1, 1)); - label->MapWindow(); - label->SetTextJustify(kTextLeft); + // label= new TGLabel(hframe, tit); + // hframe->AddFrame(label,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 1, 1, 1, 1)); + // label->MapWindow(); + // label->SetTextJustify(kTextLeft); - eMeasurements = new TGNumberEntry(hframe, 0, 9,999, TGNumberFormat::kNESInteger, - TGNumberFormat::kNEANonNegative, - TGNumberFormat::kNELNoLimits); - hframe->AddFrame( eMeasurements,new TGLayoutHints(kLHintsTop | kLHintsExpandX, 1, 1, 1, 1)); - eMeasurements->MapWindow(); - eMeasurements->Resize(150,30); - e= eMeasurements->TGNumberEntry::GetNumberEntry(); - e->Connect("ReturnPressed()","ctbPattern",this,"setMeasurements()"); + // eMeasurements = new TGNumberEntry(hframe, 0, 9,999, TGNumberFormat::kNESInteger, + // TGNumberFormat::kNEANonNegative, + // TGNumberFormat::kNELNoLimits); + // hframe->AddFrame( eMeasurements,new TGLayoutHints(kLHintsTop | kLHintsExpandX, 1, 1, 1, 1)); + // eMeasurements->MapWindow(); + // eMeasurements->Resize(150,30); + // e= eMeasurements->TGNumberEntry::GetNumberEntry(); + // e->Connect("ReturnPressed()","ctbPattern",this,"setMeasurements()"); hframe=new TGHorizontalFrame(this, 800,800); @@ -910,14 +910,14 @@ try { eCycles->SetNumber(n); - try { - myDet->setTimer(slsDetectorDefs::MEASUREMENTS_NUMBER,-1); - } catch (...) { + // try { + // myDet->setTimer(slsDetectorDefs::MEASUREMENTS_NUMBER,-1); + // } catch (...) { - cout << "Do nothing for this error" << endl; - } + // cout << "Do nothing for this error" << endl; + // } - eMeasurements->SetNumber(n); + // eMeasurements->SetNumber(n); start=-1; stop=-1; @@ -1049,14 +1049,14 @@ void ctbPattern::setCycles() { } } -void ctbPattern::setMeasurements() { - try { - myDet->setTimer(slsDetectorDefs::MEASUREMENTS_NUMBER,eFrames->GetNumber()); - } catch (...) { +// void ctbPattern::setMeasurements() { +// try { +// myDet->setTimer(slsDetectorDefs::MEASUREMENTS_NUMBER,eFrames->GetNumber()); +// } catch (...) { - cout << "Do nothing for this error" << endl; - } -} +// cout << "Do nothing for this error" << endl; +// } +// } diff --git a/ctbGui/ctbPattern.h b/ctbGui/ctbPattern.h index fdfc0412b..b6fa45baa 100755 --- a/ctbGui/ctbPattern.h +++ b/ctbGui/ctbPattern.h @@ -100,7 +100,7 @@ private: TGNumberEntry *eFrames; TGNumberEntry *ePeriod; TGNumberEntry *eCycles; - TGNumberEntry *eMeasurements; + // TGNumberEntry *eMeasurements; TGNumberEntry *eAdcPipeline; TGNumberEntry *eDBitPipeline; @@ -139,7 +139,7 @@ public: void setDBitPipeline(); void setFrames(); void setCycles(); - void setMeasurements(); + // void setMeasurements(); void setPeriod(); diff --git a/slsDetectorCalibration/dataStructures/deserializer.h b/slsDetectorCalibration/dataStructures/deserializer.h index de32eb75e..ef4007637 100644 --- a/slsDetectorCalibration/dataStructures/deserializer.h +++ b/slsDetectorCalibration/dataStructures/deserializer.h @@ -67,11 +67,11 @@ class deserializer : public slsDetectorData { } wp=(int64_t*)ptr; - for (iw=0; iw Date: Fri, 9 Aug 2019 12:57:29 +0200 Subject: [PATCH 02/14] fixed callback args and return types, removed set online --- ctbGui/ctbAcquisition.cpp | 17 +++++++++-------- ctbGui/ctbAcquisition.h | 4 ++-- ctbGui/ctbGui.cpp | 2 +- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/ctbGui/ctbAcquisition.cpp b/ctbGui/ctbAcquisition.cpp index 4f7cf87a5..1b385fe3e 100755 --- a/ctbGui/ctbAcquisition.cpp +++ b/ctbGui/ctbAcquisition.cpp @@ -773,9 +773,10 @@ void ctbAcquisition::setCanvas(TCanvas* c) { myCanvas->AddExec("dynamic",Form("((ctbAcquisition*)0x%x)->canvasClicked()",this)); // myCanvas->AddExec("ex","canvasClicked()"); } -int ctbAcquisition::dataCallback(detectorData *data, int index, int dum, void* pArgs) { +void ctbAcquisition::dataCallback(detectorData *data, long unsigned int index, unsigned int dum, void* pArgs) { - return ((ctbAcquisition*)pArgs)->plotData(data,index); + // return + ((ctbAcquisition*)pArgs)->plotData(data,index); } @@ -836,8 +837,8 @@ sample1 (dbit0 + dbit1 +...)if (cmd == "rx_dbitlist") { // cout <<"global plot is " << globalPlot << endl; - cout << "*******************************************" <progressIndex << " npoints:" << data->npoints << " npy: " << data->npy << " " << data->fileName << " bytes: " << data->databytes << " dr:"<< data->dynamicRange << " fi: " << data ->fileIndex << endl; + // cout << "*******************************************" <progressIndex << " npoints:" << data->npoints << " npy: " << data->npy << " " << data->fileName << " bytes: " << data->databytes << " dr:"<< data->dynamicRange << " fi: " << data ->fileIndex << endl; if (globalPlot || cbGetPedestal->IsOn()) { //#ifdef TESTADC // cout <<"------"<< index << " " << ip << " " << data->npoints << endl; @@ -904,7 +905,7 @@ sample1 (dbit0 + dbit1 +...)if (cmd == "rx_dbitlist") { i=0; - char *d_data= data->cvalues+2*nadc*nAnalogSamples; + char *d_data= data->data+2*nadc*nAnalogSamples; char dval; @@ -914,7 +915,7 @@ sample1 (dbit0 + dbit1 +...)if (cmd == "rx_dbitlist") { for (int x=0; xgetValue(data->cvalues,x,y); + aval=dataStructure->getValue(data->data,x,y); if (cbGetPedestal->IsOn()) { if (photonFinder) { @@ -934,7 +935,7 @@ sample1 (dbit0 + dbit1 +...)if (cmd == "rx_dbitlist") { if (h2DMapDig) - h2DMapDig->SetBinContent(x+1,y+1,dataStructure->getGain(data->cvalues,x,y)); + h2DMapDig->SetBinContent(x+1,y+1,dataStructure->getGain(data->data,x,y)); } @@ -1684,7 +1685,7 @@ void* ctbAcquisition::ThreadHandle(void *arg) } - int ctbAcquisition::progressCallback(double f,void* arg) { + void ctbAcquisition::progressCallback(double f,void* arg) { // ctbAcquisition *acq = static_cast(arg); diff --git a/ctbGui/ctbAcquisition.h b/ctbGui/ctbAcquisition.h index 1f18dd2e5..12abd313e 100755 --- a/ctbGui/ctbAcquisition.h +++ b/ctbGui/ctbAcquisition.h @@ -191,8 +191,8 @@ class ctbAcquisition : public TGGroupFrame { void setGraph (int i ,int en, Pixel_t col); void setBitGraph (int i ,int en, Pixel_t col); void startAcquisition(); - static int progressCallback(double,void*); - static int dataCallback(detectorData*, int,int, void*); + static void progressCallback(double,void*); + static void dataCallback(detectorData*, long unsigned int, unsigned int, void*); int StopFlag; int plotData(detectorData*, int); diff --git a/ctbGui/ctbGui.cpp b/ctbGui/ctbGui.cpp index e5df8b6db..3cec6ea0d 100755 --- a/ctbGui/ctbGui.cpp +++ b/ctbGui/ctbGui.cpp @@ -64,7 +64,7 @@ int main(int argc, char **argv) { /****** Create detector ****************/ multiSlsDetector *myDet=new multiSlsDetector(id); - myDet->setOnline(slsDetectorDefs::ONLINE_FLAG); + // myDet->setOnline(slsDetectorDefs::ONLINE_FLAG); //cout << id << " " << myDet << " " << myDet->setOnline() << endl; if (cf) { From 846d2702430c93b31fef4560a2ef44f4cf7a7890 Mon Sep 17 00:00:00 2001 From: Anna Bergamaschi Date: Tue, 13 Aug 2019 16:06:32 +0200 Subject: [PATCH 03/14] Implemenging common mode and ghost corrections for moench03 (and generalized) --- slsDetectorCalibration/analogDetector.h | 84 ++++++++++++++----- .../commonModeSubtractionNew.h | 16 +++- .../moench03T1ReceiverDataNew.h | 77 ++++++++++++++++- .../dataStructures/moench03T1ZmqDataNew.h | 77 ++++++++++++++++- slsDetectorCalibration/ghostSummation.h | 61 ++++++++++++++ .../interpolatingDetector.h | 4 +- slsDetectorCalibration/moench03CommonMode.h | 67 ++++++++------- .../moench03GhostSummation.h | 57 +++++++++++++ .../moenchExecutables/moenchPhotonCounter.cpp | 51 +++++++---- .../moenchExecutables/moenchZmqProcess.cpp | 23 +++-- slsDetectorCalibration/singlePhotonDetector.h | 6 +- 11 files changed, 437 insertions(+), 86 deletions(-) create mode 100644 slsDetectorCalibration/ghostSummation.h create mode 100644 slsDetectorCalibration/moench03GhostSummation.h diff --git a/slsDetectorCalibration/analogDetector.h b/slsDetectorCalibration/analogDetector.h index 49197f0a6..f98f4bf78 100644 --- a/slsDetectorCalibration/analogDetector.h +++ b/slsDetectorCalibration/analogDetector.h @@ -6,7 +6,8 @@ #include #include "slsDetectorData.h" #include "pedestalSubtraction.h" -#include "commonModeSubtraction.h" +#include "commonModeSubtractionNew.h" +#include "ghostSummation.h" #include "tiffIO.h" #include "slsInterpolation.h" @@ -61,7 +62,7 @@ template class analogDetector { analogDetector(slsDetectorData *d, int sign=1, - 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), id(0) { + commonModeSubtraction *cm=NULL, int nped=1000, int nnx=-1, int nny=-1, double *gm=NULL, ghostSummation *gs=NULL) : det(d), nx(nnx), ny(nny), stat(NULL), cmSub(cm), iframe(-1), dataSign(sign), gmap(gm), ghSum(gs), id(0) { if (det) det->getDetectorSize(nx,ny); @@ -118,7 +119,7 @@ template class analogDetector { dataSign=orig->dataSign; iframe=orig->iframe; gmap=orig->gmap; - cmSub=orig->cmSub; + // cmSub=orig->cmSub; id=orig->id; xmin=orig->xmin; xmax=orig->xmax; @@ -153,7 +154,9 @@ template class analogDetector { hs9=(TH2F*)(orig->hs9)->Clone();//new TH2F("hs","hs",(orig->hs)-getNbins,-500,9500,nx*ny,-0.5,nx*ny-0.5); #endif #endif - + if (orig->cmSub) cmSub=(orig->cmSub)->Clone(); + if (orig->ghSum) ghSum=(orig->ghSum)->Clone(); + else ghSum=NULL; } @@ -275,6 +278,9 @@ template class analogDetector { /** resets the commonModeSubtraction and increases the frame index */ virtual void newFrame(){iframe++; if (cmSub) cmSub->newFrame();}; + + /** resets the commonModeSubtraction and increases the frame index */ + virtual void newFrame(char *data){iframe++; if (cmSub) cmSub->newFrame(); calcGhost(data);}; /** sets the commonModeSubtraction algorithm to be used @@ -289,6 +295,11 @@ template class analogDetector { commonModeSubtraction *getCommonModeSubtraction() {return cmSub;}; + ghostSummation *getGhostSummation(){return ghSum;}; + ghostSummation *setGhostSummation(ghostSummation *gs){ghSum=gs; return ghSum;}; + + + /** sets the sign of the data \param sign 1 means positive values for photons, -1 negative, 0 gets @@ -306,9 +317,15 @@ template class analogDetector { */ virtual void addToPedestal(double val, int ix, int iy=0, int cm=0){ if (ix>=0 && ix=0 && iy0) { val-= getCommonMode(ix, iy); } + // cout << val << " " ; + val+=getGhost(ix,iy); + // cout << val ; + // cout << endl; stat[iy][ix].addToPedestal(val); /* if (cmSub && cm>0) { */ /* if (det) if (det->isGood(ix, iy)==0) return; */ @@ -324,23 +341,29 @@ template class analogDetector { virtual void addToCommonMode(char *data){ + // cout << "+"<< endl; if (cmSub) { + // cout << "*" << endl; for (int iy=ymin; iy0) - if (det->isGood(ix,iy)) + // if (det->isGood(ix,iy)) { addToCommonMode(data, ix, iy); - } + // cout << ":"; + // } } + } //cout << "cm " << getCommonMode(0,0) << " " << getCommonMode(1,0) << endl; } } + virtual void addToCommonMode(char *data, int ix, int iy=0){ if (cmSub) { if (det) if (det->isGood(ix, iy)==0) return; if (getNumpedestals(ix,iy)>0){ cmSub->addToCommonMode(subtractPedestal(data,ix,iy,0), ix, iy); - // cout << ix << " " < class analogDetector { \param cm 0 (default) without common mode subtraction, 1 with common mode subtraction (if defined) \returns pedestal value */ - virtual double getPedestal(int ix, int iy, int cm=0){ + virtual double getPedestal (int ix, int iy, int cm=0){ if (ix>=0 && ix=0 && iy0) return stat[iy][ix].getPedestal()+getCommonMode(ix,iy); @@ -482,7 +505,10 @@ template class analogDetector { } + virtual void calcGhost(char *data, int ix, int iy=1) {if (ghSum) ghSum->calcGhost(data, ix, iy);}; + virtual void calcGhost(char *data){if (ghSum) ghSum->calcGhost(data);}; + virtual double getGhost(int ix, int iy) {if (ghSum) return ghSum->getGhost(ix, iy); return 0;}; /** write 32bit tiff file with detector image data @@ -691,9 +717,12 @@ template class analogDetector { virtual void addToPedestal(char *data, int cm=0) { // cout << "add to pedestal " << endl; - newFrame(); + newFrame(data); - if (cmSub) { + //calcGhost(data); + + + if (cmSub && cm) { addToCommonMode(data); } @@ -702,7 +731,8 @@ template class analogDetector { for (int iy=ymin; iyisGood(ix,iy)) { - addToPedestal(data,ix,iy,1); + // addToPedestal(data,ix,iy,1); + addToPedestal(data,ix,iy,cm); //if (ix==10 && iy==10) // cout < class analogDetector { val=dataSign*det->getValue(data, ix, iy); else val=((double*)data)[iy*nx+ix]; - + // cout << val << endl; + val+=getGhost(ix,iy); /* if (ix==10 && iy==10) */ /* cout << ix << " " << iy << " " << val ; */ /* if (ix==100 && iy==100) */ /* cout << ix << " " << iy << " " << val; */ addToPedestal(val,ix,iy); + // cout << val << endl; /* if (ix==10 && iy==10) */ /* cout <<" " << getPedestal(ix,iy)<< endl; */ /* if (ix==100 && iy==100) */ @@ -818,15 +850,17 @@ template class analogDetector { virtual int *subtractPedestal(char *data, int *val=NULL, int cm=0) { - newFrame(); + newFrame(data); if (val==NULL) val=image;//new double[nx*ny]; - for (int iy=ymin; iyisGood(ix,iy)) - val[iy*nx+ix]+=subtractPedestal(data, ix, iy,cm); + //calcGhost(data); + + for (int iy=ymin; iyisGood(ix,iy)) + val[iy*nx+ix]+=subtractPedestal(data, ix, iy,cm); } } return val; @@ -861,6 +895,8 @@ template class analogDetector { } else val= (((double*)data)[iy*nx+ix]-getPedestal(ix,iy))/g; + val+=getGhost(ix,iy)/g; + #ifdef ROOTSPECTRUM hs->Fill(val,(iy-ymin)*(xmax-xmin)+(ix-xmin)); #ifdef ROOTCLUST @@ -949,10 +985,10 @@ template class analogDetector { double val; if (nph==NULL) nph=image; - newFrame(); + newFrame(data); + //calcGhost(data); addToCommonMode(data); - for (int iy=ymin; iyisGood(ix,iy)) @@ -1032,13 +1068,16 @@ template class analogDetector { if (ymi<0) ymi=ymin; if (yma<0) yma=ymax; - for (int iy=ymi; iyisGood(ix,iy)) { if (ix>=0 && ix=0 && iy *ghSum;/**< ghostSummation class */ int *image; int id; //int xmin, xmax, ymin, ymax; int xmin; /**< minimum x of the region of interest */ diff --git a/slsDetectorCalibration/commonModeSubtractionNew.h b/slsDetectorCalibration/commonModeSubtractionNew.h index 255500644..5e32fd960 100644 --- a/slsDetectorCalibration/commonModeSubtractionNew.h +++ b/slsDetectorCalibration/commonModeSubtractionNew.h @@ -23,6 +23,13 @@ class commonModeSubtraction { /** destructor - deletes the moving average(s) and the sum of pedestals calculator(s) */ virtual ~commonModeSubtraction() {delete [] mean; delete [] mean2; delete [] nCm;}; + /* commonModeSubtraction(commonModeSubtraction *cs) { */ + /* if (cs) new commonModeSubtraction(cs->getNRoi(), cs->nsigma); */ + /* } */ + + virtual commonModeSubtraction *Clone() { + new commonModeSubtraction(this->nROI, this->nsigma); + } /** clears the moving average and the sum of pedestals calculation - virtual func*/ virtual void Clear(){ @@ -52,7 +59,9 @@ class commonModeSubtraction { // if (iroi==0) val=100; // else val=-100; // if (isc>=0 && isc=0 && iroi=0 && iroi0) + if (nCm[iroi]>0) return mean[iroi]/nCm[iroi]; } return 0; @@ -96,8 +105,7 @@ class commonModeSubtraction { 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;}; - - + int getNRoi(){return nROI;}; protected: double *mean; /** { int sc_height; const int nSamples; + double ghost[200][25]; public: @@ -64,7 +65,7 @@ class moench03T1ReceiverDataNew : public slsDetectorData { \param c crosstalk parameter for the output buffer */ - moench03T1ReceiverDataNew(int ns=5000): slsDetectorData(400, 400, ns*2*32+sizeof(sls_detector_header)), nSamples(ns) { + moench03T1ReceiverDataNew(int ns=5000): slsDetectorData(400, 400, ns*2*32+sizeof(sls_detector_header)), nSamples(ns) { int nadc=32; int sc_width=25; @@ -106,6 +107,11 @@ class moench03T1ReceiverDataNew : public slsDetectorData { } } } + // double ghost[200][25]; + + for (int ix=0; ix<25; ix++) + for (int iy=0; iy<200; iy++) + ghost[iy][ix]=0.; int ipacket; int ibyte; @@ -142,6 +148,73 @@ class moench03T1ReceiverDataNew : public slsDetectorData { }; + + /** + 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 + \returns data for the selected channel, with inversion if required as double + + */ + virtual double getValue(char *data, int ix, int iy=0) { + /* cout << " x "<< ix << " y"<< iy << " val " << getChannel(data, ix, iy)<< endl;*/ + /* double val=0, vout=getChannel(data, ix, iy); */ + /* int x1=ix%25; */ + /* for (int ix=0; ix<16; ix++) { */ + /* for (int ii=0; ii<2; ii++) { */ + /* val+=getChannel(data,x1+25*ix,iy); */ + /* val+=getChannel(data,x1+25*ix,399-iy); */ + /* } */ + /* } */ + /* vout+=0.0008*val-6224; */ + /* return vout; //(double)getChannel(data, ix, iy); + */ + uint16_t val=getChannel(data, ix, iy)&0x3fff; + return val; + }; + + + + virtual void calcGhost(char *data, int ix, int iy) { + double val=0; + /* for (int ix=0; ix<25; ix++){ */ + /* for (int iy=0; iy<200; iy++) { */ + val=0; + // cout << "** "; + for (int isc=0; isc<16; isc++) { + // for (int ii=0; ii<2; ii++) { + val+=getChannel(data,ix+25*isc,iy); + // cout << "(" << isc << "," << val << " " ; + val+=getChannel(data,ix+25*isc,399-iy); + // cout << val << " " ; + // } + } + ghost[iy][ix]=val;//-6224; + // cout << " --"<< endl; + /* } */ + /* } */ + // cout << "*" << endl; + + } + + + + virtual void calcGhost(char *data) { + for (int ix=0; ix<25; ix++){ + for (int iy=0; iy<200; iy++) { + calcGhost(data, ix,iy); + } + } + // cout << "*" << endl; + } + + + double getGhost(int ix, int iy) { + if (iy<200) return ghost[iy][ix%25]; + if (iy<400) return ghost[399-iy][ix%25]; + return 0; + }; /** @@ -278,8 +351,6 @@ class moench03T1ReceiverDataNew : public slsDetectorData { } - - //int getPacketNumber(int x, int y) {return dataMap[y][x]/packetSize;}; }; diff --git a/slsDetectorCalibration/dataStructures/moench03T1ZmqDataNew.h b/slsDetectorCalibration/dataStructures/moench03T1ZmqDataNew.h index 1622e2792..479170ea1 100644 --- a/slsDetectorCalibration/dataStructures/moench03T1ZmqDataNew.h +++ b/slsDetectorCalibration/dataStructures/moench03T1ZmqDataNew.h @@ -14,6 +14,9 @@ class moench03T1ZmqDataNew : public slsDetectorData { const int nSamples; const int offset; + double ghost[200][25]; + double xtalk; + public: @@ -25,7 +28,7 @@ class moench03T1ZmqDataNew : public slsDetectorData { \param c crosstalk parameter for the output buffer */ - moench03T1ZmqDataNew(int ns=5000): slsDetectorData(400, 400, ns*32*2+sizeof(int)), nSamples(ns), offset(sizeof(int)) { + moench03T1ZmqDataNew(int ns=5000): slsDetectorData(400, 400, ns*32*2+sizeof(int)), nSamples(ns), offset(sizeof(int)), xtalk(0.00021) { int nadc=32; int sc_width=25; @@ -100,12 +103,84 @@ class moench03T1ZmqDataNew : public slsDetectorData { + for (int ix=0; ix<25; ix++) + for (int iy=0; iy<200; iy++) + ghost[iy][ix]=0.; + // iframe=0; // cout << "data struct created" << endl; }; + double getXTalk(){return xtalk;}; + void setXTalk(double g) {xtalk=g;}; + + /** + 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 + \returns data for the selected channel, with inversion if required as double + + */ + virtual double getValue(char *data, int ix, int iy=0) { + /* cout << " x "<< ix << " y"<< iy << " val " << getChannel(data, ix, iy)<< endl;*/ + /* double val=0, vout=getChannel(data, ix, iy); */ + /* int x1=ix%25; */ + /* for (int ix=0; ix<16; ix++) { */ + /* for (int ii=0; ii<2; ii++) { */ + /* val+=getChannel(data,x1+25*ix,iy); */ + /* val+=getChannel(data,x1+25*ix,399-iy); */ + /* } */ + /* } */ + /* vout+=0.0008*val-6224; */ + /* return vout; //(double)getChannel(data, ix, iy); + */ + return ((double)getChannel(data, ix, iy))+xtalk*getGhost(iy,iy); + }; + + + + virtual void calcGhost(char *data, int ix, int iy) { + double val=0; + /* for (int ix=0; ix<25; ix++){ */ + /* for (int iy=0; iy<200; iy++) { */ + val=0; + for (int isc=0; isc<16; isc++) { + for (int ii=0; ii<2; ii++) { + val+=getChannel(data,ix+25*isc,iy); + // cout << val << " " ; + val+=getChannel(data,ix+25*isc,399-iy); + // cout << val << " " ; + } + } + ghost[iy][ix]=val;//-6224; + // cout << endl; + /* } */ + /* } */ + // cout << "*" << endl; + + } + + + + virtual void calcGhost(char *data) { + for (int ix=0; ix<25; ix++){ + for (int iy=0; iy<200; iy++) { + calcGhost(data, ix,iy); + } + } + // cout << "*" << endl; + } + + + double getGhost(int ix, int iy) { + if (iy<200) return ghost[iy][ix%25]; + if (iy<400) return ghost[399-iy][ix%25]; + return 0; + }; + /** diff --git a/slsDetectorCalibration/ghostSummation.h b/slsDetectorCalibration/ghostSummation.h new file mode 100644 index 000000000..02bb0a359 --- /dev/null +++ b/slsDetectorCalibration/ghostSummation.h @@ -0,0 +1,61 @@ +#ifndef GHOSTSUMMATION_H +#define GHOSTSUMMATION_H + +#include +#include "slsDetectorData.h" + +template class ghostSummation { + + /** @short virtual calss to handle ghosting*/ + + public: + + /** constructor + \param xt crosstalk + */ + ghostSummation(slsDetectorData *d, double xt) : xtalk(xt),det(d) { + if (det) + det->getDetectorSize(nx,ny); + ghost=new double[nx*ny]; + }; + + ghostSummation(ghostSummation *orig) { + xtalk=orig->xtalk; + det=orig->det; + ghost=new double[nx*ny]; + + } + ~ghostSummation() {delete [] ghost;}; + + virtual ghostSummation *Clone() { + new ghostSummation(this); + } + + double getXTalk(){return xtalk;}; + void setXTalk(double g) {xtalk=g;}; + + virtual double calcGhost(char *data, int ix, int iy=1){ghost[iy*nx+ix]=0;}; + + virtual void calcGhost(char *data){ + for (int iy=0; iy=nx || iy<0 || iy>=ny) return 0; + return ghost[iy*nx+ix]; + } + + protected: + double xtalk; + slsDetectorData *det; + double *ghost; + int nx, ny; + +}; + + + + + +#endif diff --git a/slsDetectorCalibration/interpolatingDetector.h b/slsDetectorCalibration/interpolatingDetector.h index f5ce437bd..dc9002caa 100644 --- a/slsDetectorCalibration/interpolatingDetector.h +++ b/slsDetectorCalibration/interpolatingDetector.h @@ -46,8 +46,8 @@ class interpolatingDetector : public singlePhotonDetector { int sign=1, commonModeSubtraction *cm=NULL, int nped=1000, - int nd=100, int nnx=-1, int nny=-1) : - singlePhotonDetector(d, 3,nsigma,sign, cm, nped, nd, nnx, nny) , interp(inte), id(0) { + int nd=100, int nnx=-1, int nny=-1, double *gm=NULL, ghostSummation *gs=NULL) : + singlePhotonDetector(d, 3,nsigma,sign, cm, nped, nd, nnx, nny, gm, gs) , interp(inte), id(0) { //cout << "**"<< xmin << " " << xmax << " " << ymin << " " << ymax << endl; fi=new pthread_mutex_t ; diff --git a/slsDetectorCalibration/moench03CommonMode.h b/slsDetectorCalibration/moench03CommonMode.h index 7c950a9e4..f4e3b1f43 100644 --- a/slsDetectorCalibration/moench03CommonMode.h +++ b/slsDetectorCalibration/moench03CommonMode.h @@ -1,43 +1,52 @@ #ifndef MOENCH03COMMONMODE_H #define MOENCH03COMMONMODE_H -#include "commonModeSubtraction.h" +#include "commonModeSubtractionNew.h" -class moench03CommonMode : public commonModeSubtraction { +class commonModeSubtractionColumn: public commonModeSubtraction{ +public: + commonModeSubtractionColumn(int nr=200) : commonModeSubtraction(800), rows(nr) {}; + virtual int getROI(int ix, int iy){return ix+(iy/200)*400;}; + + virtual void addToCommonMode(double val, int ix=0, int iy=0) { + if (ix399-rows) { + int iroi=getROI(ix,iy); + if (iroi>=0 && iroi=0 && isc=0 && isc0) return cmPed[isc]/nCm[isc]-cmStat[isc].Mean(); - } - return 0; - }; }; diff --git a/slsDetectorCalibration/moench03GhostSummation.h b/slsDetectorCalibration/moench03GhostSummation.h new file mode 100644 index 000000000..64ec787dd --- /dev/null +++ b/slsDetectorCalibration/moench03GhostSummation.h @@ -0,0 +1,57 @@ +#ifndef MOENCH03GHOSTSUMMATION_H +#define MOENCH03GHOSTSUMMATION_H + +#include "ghostSummation.h" + +class moench03GhostSummation : public ghostSummation { + + /** @short virtual calss to handle ghosting*/ + + public: + + /** constructor + \param xt crosstalk + */ + moench03GhostSummation(slsDetectorData *d, double xt) : ghostSummation(d, xt) {} + + virtual void calcGhost(char *data){ + for (int iy=0; iy<200; iy++){ + for (int ix=0; ix<25; ix++){ + calcGhost(data,ix,iy); + } + } + }; + + + virtual double calcGhost(char *data, int x, int y=0){ + int ix=x%25; + int iy=y; + if (y>=200) iy=399-y; + if (iy<0 || ix<0) return 0; + double val=0; + val=0; + for (int isc=0; isc<16; isc++) { + val+=det->getChannel(data,ix+25*isc,iy); + // cout << val << " " ; + val+=det->getChannel(data,ix+25*isc,399-iy); + // cout << val << " " ; + } + ghost[iy*nx+ix]=xtalk*val; + return ghost[iy*nx+ix]; + }; + + + virtual double getGhost(int ix, int iy) { + if (iy >=0 && iy<200) return ghost[iy*nx+(ix%25)]; + if (iy<400) return ghost[(399-iy)*nx+(ix%25)]; + return 0; + }; + + +}; + + + + + +#endif diff --git a/slsDetectorCalibration/moenchExecutables/moenchPhotonCounter.cpp b/slsDetectorCalibration/moenchExecutables/moenchPhotonCounter.cpp index 6ce266150..8c8c82b20 100644 --- a/slsDetectorCalibration/moenchExecutables/moenchPhotonCounter.cpp +++ b/slsDetectorCalibration/moenchExecutables/moenchPhotonCounter.cpp @@ -1,6 +1,6 @@ //#include "ansi.h" #include - +#define CORR //#define VERSION_V1 @@ -28,8 +28,11 @@ //#include "etaInterpolationPosXY.h" // #include "linearInterpolation.h" // #include "noInterpolation.h" -#include "multiThreadedAnalogDetector.h" +#include "multiThreadedCountingDetector.h" +//#include "multiThreadedAnalogDetector.h" #include "singlePhotonDetector.h" +#include "moench03GhostSummation.h" +#include "moench03CommonMode.h" //#include "interpolatingDetector.h" #include @@ -89,7 +92,18 @@ int main(int argc, char *argv[]) { decoder->getDetectorSize(nx,ny); - singlePhotonDetector *filter=new singlePhotonDetector(decoder,csize, nsigma, 1, 0, nped, 200); + int ncol_cm=20; + double xt_ghost=0.00045; + moench03CommonMode *cm=NULL; + moench03GhostSummation *gs; + double *gainmap=NULL; +#ifdef CORR + cout << "Applying common mode and ghost correction " << endl; + cm=new moench03CommonMode(ncol_cm); + gs=new moench03GhostSummation(decoder, xt_ghost); +#endif + + singlePhotonDetector *filter=new singlePhotonDetector(decoder,csize, nsigma, 1, cm, nped, 200, -1, -1, gainmap, gs); int size = 327680;////atoi(argv[3]); @@ -171,9 +185,10 @@ int main(int argc, char *argv[]) { if (thr>0) { cout << "threshold is " << thr << endl; - //#ifndef ANALOG +#ifndef ANALOG filter->setThreshold(thr); - //#endif +#endif + cf=0; } else cf=1; @@ -181,17 +196,13 @@ int main(int argc, char *argv[]) { filter->setROI(xmin,xmax,ymin,ymax); -#ifdef SOLEIL - filter->setROI(150,210,170,230); - nframes=-1; -#endif std::time(&end_time); cout << std::ctime(&end_time) << endl; char* buff; - multiThreadedAnalogDetector *mt=new multiThreadedAnalogDetector(filter,nthreads,fifosize); - + // multiThreadedAnalogDetector *mt=new multiThreadedAnalogDetector(filter,nthreads,fifosize); + multiThreadedCountingDetector *mt=new multiThreadedCountingDetector(filter,nthreads,fifosize); #ifndef ANALOG mt->setDetectorMode(ePhotonCounting); cout << "Counting!" << endl; @@ -204,7 +215,7 @@ int main(int argc, char *argv[]) { mt->setDetectorMode(eAnalog); cout << "Analog!" << endl; cf=0; - // thr1=thr; + thr1=thr; #endif // } @@ -240,7 +251,7 @@ int main(int argc, char *argv[]) { mt->nextThread(); mt->popFree(buff); ifr++; - if (ifr%10000==0) + if (ifr%100==0) cout << ifr << " " << ff << " " << np << endl; } else cout << ifr << " " << ff << " " << np << endl; @@ -308,7 +319,7 @@ int main(int argc, char *argv[]) { // // // cout << " " << (void*)buff; mt->popFree(buff); ifr++; - if (ifr%1000==0) cout << ifr << " " << ff << endl; + if (ifr%100==0) cout << ifr << " " << ff << endl; if (nframes>0) { if (ifr%nframes==0) { //The name has an additional "_fXXXXX" at the end, where "XXXXX" is the initial frame number of the image (0,1000,2000...) @@ -334,9 +345,10 @@ int main(int argc, char *argv[]) { if (nframes>0) { sprintf(ffname,"%s/%s_f%05d.tiff",outdir,fformat,ifile); sprintf(imgfname,ffname,irun); + } else { + sprintf(ffname,"%s/%s.tiff",outdir,fformat); + sprintf(imgfname,ffname,irun); } - sprintf(ffname,"%s/%s.tiff",outdir,fformat); - sprintf(imgfname,ffname,irun); cout << "Writing tiff to " << imgfname << " " << thr1 <writeImage(imgfname, thr1); mt->clearImage(); @@ -351,6 +363,13 @@ int main(int argc, char *argv[]) { } else cout << "Could not open "<< fname << " for reading " << endl; } + if (nframes<0){ + sprintf(ffname,"%s/%s.tiff",outdir,fformat); + strcpy(imgfname,ffname); + cout << "Writing tiff to " << imgfname << " " << thr1 <writeImage(imgfname, thr1); + } + return 0; diff --git a/slsDetectorCalibration/moenchExecutables/moenchZmqProcess.cpp b/slsDetectorCalibration/moenchExecutables/moenchZmqProcess.cpp index 3eb1a039f..587a136b6 100644 --- a/slsDetectorCalibration/moenchExecutables/moenchZmqProcess.cpp +++ b/slsDetectorCalibration/moenchExecutables/moenchZmqProcess.cpp @@ -3,13 +3,15 @@ #include "sls_detector_defs.h" #include "ZmqSocket.h" #include "moench03T1ZmqDataNew.h" +#include "moench03GhostSummation.h" +#include "moench03CommonMode.h" #include #include #include #include #include #include "tiffIO.h" -//#include + #include //json header in zmq stream #include @@ -110,12 +112,16 @@ int main(int argc, char *argv[]) { int dataSize=size; char dummybuff[size]; - - - + + int ncol_cm=20; + double xt_ghost=0.00045; + moench03CommonMode *cm=new moench03CommonMode(ncol_cm); + moench03GhostSummation *gs=new moench03GhostSummation(det, xt_ghost); + double *gainmap=NULL; + //analogDetector *filter=new analogDetector(det,1,NULL,1000); #ifndef INTERP - singlePhotonDetector *filter=new singlePhotonDetector(det,3, 5, 1, 0, 1000, 10); + singlePhotonDetector *filter=new singlePhotonDetector(det,3, 5, 1, cm, 1000, 10, -1, -1, gainmap, gs); multiThreadedCountingDetector *mt=new multiThreadedCountingDetector(filter,nthreads,fifosize); @@ -126,7 +132,7 @@ int main(int argc, char *argv[]) { if (etafname) interp->readFlatField(etafname); - interpolatingDetector *filter=new interpolatingDetector(det,interp, 5, 1, 0, 1000, 10); + interpolatingDetector *filter=new interpolatingDetector(det,interp, 5, 1, cm, 1000, 10, -1, -1, gainmap, gs); multiThreadedInterpolatingDetector *mt=new multiThreadedInterpolatingDetector(filter,nthreads,fifosize); #endif @@ -654,7 +660,12 @@ int main(int argc, char *argv[]) { // cout << "file" << endl; // cout << "data " << endl; if (of==NULL) { +#ifdef WRITE_QUAD + sprintf(ofname,"%s_%d.clust2",filename.c_str(),fileindex); +#endif +#ifndef WRITE_QUAD sprintf(ofname,"%s_%d.clust",filename.c_str(),fileindex); +#endif of=fopen(ofname,"w"); if (of) { mt->setFilePointer(of); diff --git a/slsDetectorCalibration/singlePhotonDetector.h b/slsDetectorCalibration/singlePhotonDetector.h index 0ff15b03f..6ef4eee2f 100644 --- a/slsDetectorCalibration/singlePhotonDetector.h +++ b/slsDetectorCalibration/singlePhotonDetector.h @@ -58,7 +58,7 @@ public analogDetector { int sign=1, commonModeSubtraction *cm=NULL, int nped=1000, - int nd=100, int nnx=-1, int nny=-1, double *gm=NULL) : analogDetector(d, sign, cm, nped, nnx, nny, gm), nDark(nd), eventMask(NULL),nSigma (nsigma), clusterSize(csize), clusterSizeY(csize), clusters(NULL), quad(UNDEFINED_QUADRANT), tot(0), quadTot(0), eMin(-1), eMax(-1) { + int nd=100, int nnx=-1, int nny=-1, double *gm=NULL, ghostSummation *gs=NULL) : analogDetector(d, sign, cm, nped, nnx, nny, gm, gs), nDark(nd), eventMask(NULL),nSigma (nsigma), clusterSize(csize), clusterSizeY(csize), clusters(NULL), quad(UNDEFINED_QUADRANT), tot(0), quadTot(0), eMin(-1), eMax(-1) { @@ -213,7 +213,7 @@ public analogDetector { return nph; } else { if (thr>0) { - newFrame(); + newFrame(data); if (cmSub) { cout << "add to common mode?"<< endl; addToCommonMode(data); @@ -362,7 +362,7 @@ int *getClusters(char *data, int *ph=NULL) { addToPedestal(data); return 0; } - newFrame(); + newFrame(data); From e3dedcd450edfca29eef4b44a9ffa1654ddb2913 Mon Sep 17 00:00:00 2001 From: Anna Bergamaschi Date: Tue, 13 Aug 2019 16:14:51 +0200 Subject: [PATCH 04/14] fixed sendheaderdata function in moench03ZmqProcess --- .../moenchExecutables/moenchZmqProcess.cpp | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/slsDetectorCalibration/moenchExecutables/moenchZmqProcess.cpp b/slsDetectorCalibration/moenchExecutables/moenchZmqProcess.cpp index 587a136b6..e256dd5d2 100644 --- a/slsDetectorCalibration/moenchExecutables/moenchZmqProcess.cpp +++ b/slsDetectorCalibration/moenchExecutables/moenchZmqProcess.cpp @@ -398,17 +398,20 @@ int main(int argc, char *argv[]) { } + //// int SendHeaderData ( int index, bool dummy, uint32_t jsonversion, uint32_t dynamicrange = 0, uint64_t fileIndex = 0, + // uint32_t ndetx = 0, uint32_t ndety = 0, uint32_t npixelsx = 0, uint32_t npixelsy = 0, uint32_t imageSize = 0, + // uint64_t acqIndex = 0, uint64_t fIndex = 0, const char* fname = NULL, + // uint64_t frameNumber = 0, uint32_t expLength = 0, uint32_t packetNumber = 0, + // uint64_t bunchId = 0, uint64_t timestamp = 0, + // uint16_t modId = 0, uint16_t row = 0, uint16_t column = 0, uint16_t reserved = 0, + // uint32_t debug = 0, uint16_t roundRNumber = 0, + // uint8_t detType = 0, uint8_t version = 0, int gapPixelsEnable = 0, int flippedDataX = 0, + // char* additionalJsonHeader = 0) { -#ifdef NEWZMQ - cout << "Sending image size " << nnx << " " << nny << endl; - zmqsocket2->SendHeaderData (0, false, SLS_DETECTOR_JSON_HEADER_VERSION, dr, fileindex, nnx, nny, nnx*nny*dr/8,acqIndex, frameIndex, fname, acqIndex, subFrameIndex, packetNumber,bunchId, timestamp, modId, xCoord, yCoord, zCoord,debug, roundRNumber, detType, version, flippedData, additionalJsonHeader); - -#endif -#ifndef NEWZMQ - zmqsocket2->SendHeaderData(0, false, SLS_DETECTOR_JSON_HEADER_VERSION,0,0,0,0,0, 0,0,fname, 0, 0,0,0,0,0,0,0,0,0,0,0,1); -#endif - + // cout << "Sending image size " << nnx << " " << nny << endl; + zmqsocket2->SendHeaderData (0, false, SLS_DETECTOR_JSON_HEADER_VERSION, dr, fileindex, 0,0, nnx, nny, nnx*nny*dr/8,acqIndex, frameIndex, fname, acqIndex,0 , packetNumber,bunchId, timestamp, modId, xCoord, yCoord, zCoord,debug, roundRNumber, detType, version, 0,0, additionalJsonHeader); + zmqsocket2->SendData((char*)dout,nnx*nny*dr/8); cprintf(GREEN, "Sent Data\n"); From 17e3aea374b4f445b8e71ecf9d66adf6e8faca76 Mon Sep 17 00:00:00 2001 From: Gemma Tinti Date: Tue, 13 Aug 2019 16:28:50 +0200 Subject: [PATCH 05/14] Eiger_short.tex --- manual/manual-client/Eiger_short.tex | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/manual/manual-client/Eiger_short.tex b/manual/manual-client/Eiger_short.tex index fe2457c3d..ddd858af2 100755 --- a/manual/manual-client/Eiger_short.tex +++ b/manual/manual-client/Eiger_short.tex @@ -326,7 +326,25 @@ The size of the gap pixels between modules to insert is GapPixelsBetweenModules_y = 36 \end{verbatim} where the {\tt{GapPixelsBetweenModules\_x}} are the one on the short side of the module, while {\tt{GapPixelsBetweenModules\_y}} are the ones on the long side of the module (where the wirebonds take physical space). - + \section{QUAD special geometry} +Starting from release 4.1.0, we support a special geometry with 2x2 pixels. This is for a Quad, where a single half module reads out 4 chips but in a quad shape. For now this hardware is only available as a PEEM detector at SIM. +The {\tt{detsizechan 1024 512}} needs to remain set like this for a half module. However, thanks to the command: + \begin{verbatim} +./sls_detector_put quad 1 +\end{verbatim} + +a 512x512 geomtry will be read out if {\tt{gappixels 0}} and 514x514 will be readout if {\tt{gappixels 1}}. Note that as above, {\tt{gappixels 1}} is not supported for {\tt{dr 4}}. +If {\tt{gappixels 0}}, in the master.raw file you will read: +\begin{verbatim} +row : 512 pixels +col : 256 pixels +\end{verbatim} +else if {\tt{gappixels 1}}, in the master.raw file you will read: +\begin{verbatim} +row : 514 pixels +col : 257 pixels +\end{verbatim} + \section{Readout timing- maximum frame rate}\label{timing} IMPORTANT: to have faster readout and smaller dead time, one can configure {\tt{clkdivider}}, i.e. the speed at which the data are read, i.e. 200/100/50~MHz for {\tt{clkdivider 0/1/2}} and the dead time between frames through {\tt{flags parallel}}, i.e. acquire and read at the same time or acquire and then read out. The configuration of this timing variables allows to achieve different frame rates. NOTE THAT IN EIGER, WHATEVER YOU DO, THE FRAME RATE LIMITATIONS COME FROM THE NETWORK BOTTLENECK AS THE HARDWARE GOES FASTER THAN THE DATA OUT. @@ -603,6 +621,9 @@ Here are the implemented options so far: \item {\tt{burst\_trigger}} gets only 1 trigger, but allows to take many frames. With {\tt{frames}} one can change the number of frames. {\tt{cycles}} needs to be 1. {\tt{exptime}} and {\tt{period}} have to be set. In the gui it is called trigger readout. \item{\tt{gating}} allows to get a frame only when the trigger pulse is gating. Note that in this case the exp time and period only depend on the gating signal. {\tt{cycles}} allows to select how many gates to consider. Set number of frames to 1 using {\tt{frames}}. IMPORTANT: Up to firmware 23, the last subframe is oblige to finish being taken, despite the gate signal going down. This will be configurable from later fw and software version. Also, in gating mode, due to timimg of the state machine, you need to leave 500~$\mu$s deadtime between the end on an acquisition and the next. This is as the state machine is unable to check for changes in the status in the first 500~$\mu$s. ATTENTION: if you are in 16 bit mode and you are applying online rate corrections, as now the exptime is generated by the trigger, you might not have correct rate corrections. If you know what the exposure time is in the gating signal, then you can set the {\tt{exptime}} once and the rate corrections will be correct. In 32 bit mode, it does not matter as the rate corrections depends on the {\tt{subexptime}} which is software set independently from the gate exptime. +When using 32-bit mode, by default the acquisition ends the last complete subframe that was started when still the acquisition time was valid. This has been chosen as many people wants to know the exact acquisition time for when the detector was taking data and also, if {\tt{ratecorr}} are active, the last subframe will be correctly corrected, while otherwise it will be corrected with a wrong subdeadtime. +However, from 4.1.0, in gating mode, an option to immediately terminate the subframe when the gate signal goes down it is implemented to stop the acquisition at the same time. This option is {\tt{./sls\_detector\_put interruptsubframe 1}} while the default option is {\tt{./sls\_detector\_put interruptsubframe 0}}. + \end{itemize} Hardware-wise, the ENABLE OUT signal outputs when the chips are really acquiring. This means that the single subframes will be output in 32 bit mode. The TRIGGER OUT outputs the sum-up-signal at the moment (which is useless). This will be changed in the future to output the envelop of the enable signal. From e2252755206e0dc00f4d741af5daf8052ff5eec7 Mon Sep 17 00:00:00 2001 From: Anna Bergamaschi Date: Wed, 14 Aug 2019 16:56:43 +0200 Subject: [PATCH 06/14] Fixed mistake in addToPedestal with ghost summation --- slsDetectorCalibration/analogDetector.h | 1 - slsDetectorCalibration/moench03GhostSummation.h | 2 +- .../moenchExecutables/moenchPhotonCounter.cpp | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/slsDetectorCalibration/analogDetector.h b/slsDetectorCalibration/analogDetector.h index f98f4bf78..b10446d34 100644 --- a/slsDetectorCalibration/analogDetector.h +++ b/slsDetectorCalibration/analogDetector.h @@ -823,7 +823,6 @@ template class analogDetector { else val=((double*)data)[iy*nx+ix]; // cout << val << endl; - val+=getGhost(ix,iy); /* if (ix==10 && iy==10) */ /* cout << ix << " " << iy << " " << val ; */ /* if (ix==100 && iy==100) */ diff --git a/slsDetectorCalibration/moench03GhostSummation.h b/slsDetectorCalibration/moench03GhostSummation.h index 64ec787dd..88377dbe8 100644 --- a/slsDetectorCalibration/moench03GhostSummation.h +++ b/slsDetectorCalibration/moench03GhostSummation.h @@ -12,7 +12,7 @@ class moench03GhostSummation : public ghostSummation { /** constructor \param xt crosstalk */ - moench03GhostSummation(slsDetectorData *d, double xt) : ghostSummation(d, xt) {} + moench03GhostSummation(slsDetectorData *d, double xt=0.0004) : ghostSummation(d, xt) {} virtual void calcGhost(char *data){ for (int iy=0; iy<200; iy++){ diff --git a/slsDetectorCalibration/moenchExecutables/moenchPhotonCounter.cpp b/slsDetectorCalibration/moenchExecutables/moenchPhotonCounter.cpp index 8c8c82b20..b371f8be3 100644 --- a/slsDetectorCalibration/moenchExecutables/moenchPhotonCounter.cpp +++ b/slsDetectorCalibration/moenchExecutables/moenchPhotonCounter.cpp @@ -93,7 +93,7 @@ int main(int argc, char *argv[]) { decoder->getDetectorSize(nx,ny); int ncol_cm=20; - double xt_ghost=0.00045; + double xt_ghost=0.0004; moench03CommonMode *cm=NULL; moench03GhostSummation *gs; double *gainmap=NULL; From b59d69325e9c5ac9626a7e3d2541d1cfb64bdb2d Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Fri, 16 Aug 2019 15:35:23 +0200 Subject: [PATCH 07/14] updated minor 10g ctb --- slsDetectorServers/ctbDetectorServer/Makefile | 4 ++-- .../bin/ctbDetectorServer_developer | Bin 154820 -> 155736 bytes .../slsDetectorFunctionList.c | 10 ++++++---- slsSupportLib/include/versionAPI.h | 2 +- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/slsDetectorServers/ctbDetectorServer/Makefile b/slsDetectorServers/ctbDetectorServer/Makefile index 2d44d49e6..af9b6f823 100755 --- a/slsDetectorServers/ctbDetectorServer/Makefile +++ b/slsDetectorServers/ctbDetectorServer/Makefile @@ -10,8 +10,8 @@ INSTMODE = 0777 SRC_CLNT = communication_funcs.c slsDetectorServer.c slsDetectorServer_funcs.c slsDetectorFunctionList.c OBJS = $(SRC_CLNT:.c=.o) -#all: clean versioning $(PROGS) -all: clean $(PROGS) +all: clean versioning $(PROGS) +#all: clean $(PROGS) boot: $(OBJS) diff --git a/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer b/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer index 8dea4330e48f09fc99ce9ab0265737d9e4b7149b..6a6e3ce04dd870f61616334a6c70e92507752af8 100755 GIT binary patch delta 66657 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 delta 65602 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 diff --git a/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c index afada678c..23c68eda8 100755 --- a/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c @@ -2163,8 +2163,9 @@ int startStateMachine(){ FILE_LOG(logINFOGREEN, ("Virtual Acquisition started\n")); return OK; #endif + int send_to_10g = enableTenGigabitEthernet(-1); // 1 giga udp - if (!enableTenGigabitEthernet(-1)) { + if (send_to_10g == 0) { // create udp socket if(createUDPSocket(0) != OK) { return FAIL; @@ -2175,7 +2176,9 @@ int startStateMachine(){ FILE_LOG(logINFOBLUE, ("Starting State Machine\n")); cleanFifos(); - unsetFifoReadStrobes(); // FIXME: unnecessary to write bus_w(dumm, 0) as it is 0 in the beginnig and the strobes are always unset if set + if (send_to_10g == 0) { + unsetFifoReadStrobes(); // FIXME: unnecessary to write bus_w(dumm, 0) as it is 0 in the beginnig and the strobes are always unset if set + } //start state machine bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_STRT_ACQSTN_MSK | CONTROL_STRT_EXPSR_MSK); @@ -2332,14 +2335,13 @@ void readFrame(int *ret, char *mess) { // frames left to give status int64_t retval = getTimeLeft(FRAME_NUMBER) + 2; if ( retval > 1) { - *ret = (int)FAIL; sprintf(mess,"No data and run stopped: %lld frames left\n",(long long int)retval); FILE_LOG(logERROR, (mess)); } else { - *ret = (int)OK; FILE_LOG(logINFOGREEN, ("Acquisition successfully finished\n")); } } + *ret = (int)OK; } void unsetFifoReadStrobes() { diff --git a/slsSupportLib/include/versionAPI.h b/slsSupportLib/include/versionAPI.h index 25e8a6332..58afcc3dd 100644 --- a/slsSupportLib/include/versionAPI.h +++ b/slsSupportLib/include/versionAPI.h @@ -1,10 +1,10 @@ /** API versions */ #define GITBRANCH "developer" #define APIMOENCH 0x181108 -#define APICTB 0x190604 #define APIGOTTHARD 0x190715 #define APILIB 0x190723 #define APIRECEIVER 0x190722 #define APIGUI 0x190723 #define APIJUNGFRAU 0x190730 #define APIEIGER 0x190806 +#define APICTB 0x190816 From 156ce0df00c89c0b10021f986d0b68365d09fbb4 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Wed, 21 Aug 2019 11:09:41 +0200 Subject: [PATCH 08/14] ctb fix:fifo print between frames, pattern length change --- .../ctbDetectorServer/RegisterDefs.h | 24 +++++++++---------- .../slsDetectorFunctionList.c | 4 ++-- .../slsDetectorServer_defs.h | 2 +- slsSupportLib/include/versionAPI.h | 2 +- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/slsDetectorServers/ctbDetectorServer/RegisterDefs.h b/slsDetectorServers/ctbDetectorServer/RegisterDefs.h index 8aa6c2ff7..e5b21dc28 100755 --- a/slsDetectorServers/ctbDetectorServer/RegisterDefs.h +++ b/slsDetectorServers/ctbDetectorServer/RegisterDefs.h @@ -364,23 +364,23 @@ #define PATTERN_CNTRL_RD_OFST (1) #define PATTERN_CNTRL_RD_MSK (0x00000001 << PATTERN_CNTRL_RD_OFST) #define PATTERN_CNTRL_ADDR_OFST (16) -#define PATTERN_CNTRL_ADDR_MSK (0x0000FFFF << PATTERN_CNTRL_ADDR_OFST) +#define PATTERN_CNTRL_ADDR_MSK (0x00001FFF << PATTERN_CNTRL_ADDR_OFST) /* Pattern Limit RW regiser */ #define PATTERN_LIMIT_REG (0x53 << MEM_MAP_SHIFT) #define PATTERN_LIMIT_STRT_OFST (0) -#define PATTERN_LIMIT_STRT_MSK (0x0000FFFF << PATTERN_LIMIT_STRT_OFST) +#define PATTERN_LIMIT_STRT_MSK (0x00001FFF << PATTERN_LIMIT_STRT_OFST) #define PATTERN_LIMIT_STP_OFST (16) -#define PATTERN_LIMIT_STP_MSK (0x0000FFFF << PATTERN_LIMIT_STP_OFST) +#define PATTERN_LIMIT_STP_MSK (0x00001FFF << PATTERN_LIMIT_STP_OFST) /* Pattern Loop 0 Address RW regiser */ #define PATTERN_LOOP_0_ADDR_REG (0x54 << MEM_MAP_SHIFT) #define PATTERN_LOOP_0_ADDR_STRT_OFST (0) -#define PATTERN_LOOP_0_ADDR_STRT_MSK (0x0000FFFF << PATTERN_LOOP_0_ADDR_STRT_OFST) +#define PATTERN_LOOP_0_ADDR_STRT_MSK (0x00001FFF << PATTERN_LOOP_0_ADDR_STRT_OFST) #define PATTERN_LOOP_0_ADDR_STP_OFST (16) -#define PATTERN_LOOP_0_ADDR_STP_MSK (0x0000FFFF << PATTERN_LOOP_0_ADDR_STP_OFST) +#define PATTERN_LOOP_0_ADDR_STP_MSK (0x00001FFF << PATTERN_LOOP_0_ADDR_STP_OFST) /* Pattern Loop 0 Iteration RW regiser */ #define PATTERN_LOOP_0_ITERATION_REG (0x55 << MEM_MAP_SHIFT) @@ -389,9 +389,9 @@ #define PATTERN_LOOP_1_ADDR_REG (0x56 << MEM_MAP_SHIFT) #define PATTERN_LOOP_1_ADDR_STRT_OFST (0) -#define PATTERN_LOOP_1_ADDR_STRT_MSK (0x0000FFFF << PATTERN_LOOP_1_ADDR_STRT_OFST) +#define PATTERN_LOOP_1_ADDR_STRT_MSK (0x00001FFF << PATTERN_LOOP_1_ADDR_STRT_OFST) #define PATTERN_LOOP_1_ADDR_STP_OFST (16) -#define PATTERN_LOOP_1_ADDR_STP_MSK (0x0000FFFF << PATTERN_LOOP_1_ADDR_STP_OFST) +#define PATTERN_LOOP_1_ADDR_STP_MSK (0x00001FFF << PATTERN_LOOP_1_ADDR_STP_OFST) /* Pattern Loop 1 Iteration RW regiser */ #define PATTERN_LOOP_1_ITERATION_REG (0x57 << MEM_MAP_SHIFT) @@ -400,9 +400,9 @@ #define PATTERN_LOOP_2_ADDR_REG (0x58 << MEM_MAP_SHIFT) #define PATTERN_LOOP_2_ADDR_STRT_OFST (0) -#define PATTERN_LOOP_2_ADDR_STRT_MSK (0x0000FFFF << PATTERN_LOOP_2_ADDR_STRT_OFST) +#define PATTERN_LOOP_2_ADDR_STRT_MSK (0x00001FFF << PATTERN_LOOP_2_ADDR_STRT_OFST) #define PATTERN_LOOP_2_ADDR_STP_OFST (16) -#define PATTERN_LOOP_2_ADDR_STP_MSK (0x0000FFFF << PATTERN_LOOP_2_ADDR_STP_OFST) +#define PATTERN_LOOP_2_ADDR_STP_MSK (0x00001FFF << PATTERN_LOOP_2_ADDR_STP_OFST) /* Pattern Loop 2 Iteration RW regiser */ #define PATTERN_LOOP_2_ITERATION_REG (0x59 << MEM_MAP_SHIFT) @@ -411,20 +411,20 @@ #define PATTERN_WAIT_0_ADDR_REG (0x5A << MEM_MAP_SHIFT) #define PATTERN_WAIT_0_ADDR_OFST (0) -#define PATTERN_WAIT_0_ADDR_MSK (0x0000FFFF << PATTERN_WAIT_0_ADDR_OFST) +#define PATTERN_WAIT_0_ADDR_MSK (0x00001FFF << PATTERN_WAIT_0_ADDR_OFST) //FIXME: is mask 3FF /* Pattern Wait 1 RW regiser */ #define PATTERN_WAIT_1_ADDR_REG (0x5B << MEM_MAP_SHIFT) #define PATTERN_WAIT_1_ADDR_OFST (0) -#define PATTERN_WAIT_1_ADDR_MSK (0x0000FFFF << PATTERN_WAIT_1_ADDR_OFST) +#define PATTERN_WAIT_1_ADDR_MSK (0x00001FFF << PATTERN_WAIT_1_ADDR_OFST) /* Pattern Wait 2 RW regiser */ #define PATTERN_WAIT_2_ADDR_REG (0x5C << MEM_MAP_SHIFT) #define PATTERN_WAIT_2_ADDR_OFST (0) -#define PATTERN_WAIT_2_ADDR_MSK (0x0000FFFF << PATTERN_WAIT_2_ADDR_OFST) +#define PATTERN_WAIT_2_ADDR_MSK (0x00001FFF << PATTERN_WAIT_2_ADDR_OFST) /* Samples RW register */ #define SAMPLES_REG (0x5D << MEM_MAP_SHIFT) diff --git a/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c index 23c68eda8..ce3ec8061 100755 --- a/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c @@ -2432,12 +2432,12 @@ uint32_t checkDataInFifo() { uint32_t dataPresent = 0; if (analogEnable) { uint32_t analogFifoEmpty = bus_r(FIFO_EMPTY_REG); - FILE_LOG(logDEBUG2, ("Analog Fifo Empty (32 channels): 0x%x\n", analogFifoEmpty)); + FILE_LOG(logINFO, ("Analog Fifo Empty (32 channels): 0x%08x\n", analogFifoEmpty)); dataPresent = (~analogFifoEmpty); } if (!dataPresent && digitalEnable) { int digitalFifoEmpty = ((bus_r(FIFO_DIN_STATUS_REG) & FIFO_DIN_STATUS_FIFO_EMPTY_MSK) >> FIFO_DIN_STATUS_FIFO_EMPTY_OFST); - FILE_LOG(logDEBUG2, ("Digital Fifo Empty: %d\n",digitalFifoEmpty)); + FILE_LOG(logINFO, ("Digital Fifo Empty: %d\n",digitalFifoEmpty)); dataPresent = (digitalFifoEmpty ? 0 : 1); } FILE_LOG(logDEBUG2, ("Data in Fifo :0x%x\n", dataPresent)); diff --git a/slsDetectorServers/ctbDetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/ctbDetectorServer/slsDetectorServer_defs.h index 9b116d70a..cc51c54ae 100755 --- a/slsDetectorServers/ctbDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/ctbDetectorServer/slsDetectorServer_defs.h @@ -76,7 +76,7 @@ enum DACINDEX {D0, D1, D2, D3, D4, D5, D6, D7, D8, D9, #define VIO_MIN_MV (1200) // for fpga to function /* Defines in the Firmware */ -#define MAX_PATTERN_LENGTH (0x7FFF) +#define MAX_PATTERN_LENGTH (0x2000) #define DIGITAL_IO_DELAY_MAXIMUM_PS ((OUTPUT_DELAY_0_OTPT_STTNG_MSK >> OUTPUT_DELAY_0_OTPT_STTNG_OFST) * OUTPUT_DELAY_0_OTPT_STTNG_STEPS) #define MAX_PHASE_SHIFTS_STEPS (8) diff --git a/slsSupportLib/include/versionAPI.h b/slsSupportLib/include/versionAPI.h index 58afcc3dd..15b93541f 100644 --- a/slsSupportLib/include/versionAPI.h +++ b/slsSupportLib/include/versionAPI.h @@ -7,4 +7,4 @@ #define APIGUI 0x190723 #define APIJUNGFRAU 0x190730 #define APIEIGER 0x190806 -#define APICTB 0x190816 +#define APICTB 0x190819 From 422a928be428d76588676a69723a2bd5ff80144c Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Wed, 21 Aug 2019 11:13:17 +0200 Subject: [PATCH 09/14] ctb rxr: changing to old header (like moench) --- .../slsDetectorServer_defs.h | 6 +-- slsReceiverSoftware/include/GeneralData.h | 46 ++++++++++++------- slsReceiverSoftware/src/Listener.cpp | 10 ++-- slsSupportLib/include/versionAPI.h | 2 +- 4 files changed, 38 insertions(+), 26 deletions(-) diff --git a/slsDetectorServers/ctbDetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/ctbDetectorServer/slsDetectorServer_defs.h index cc51c54ae..45ec6148a 100755 --- a/slsDetectorServers/ctbDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/ctbDetectorServer/slsDetectorServer_defs.h @@ -59,9 +59,9 @@ enum DACINDEX {D0, D1, D2, D3, D4, D5, D6, D7, D8, D9, #define DEFAULT_VLIMIT (-100) #define DEFAULT_TIMING_MODE (AUTO_TIMING) #define DEFAULT_TX_UDP_PORT (0x7e9a) -#define DEFAULT_RUN_CLK (40) -#define DEFAULT_ADC_CLK (20) -#define DEFAULT_SYNC_CLK (20) +#define DEFAULT_RUN_CLK (200) // 40 +#define DEFAULT_ADC_CLK (40) // 20 +#define DEFAULT_SYNC_CLK (40) // 20 #define DEFAULT_DBIT_CLK (200) #define HIGHVOLTAGE_MIN (60) diff --git a/slsReceiverSoftware/include/GeneralData.h b/slsReceiverSoftware/include/GeneralData.h index 87ad410d0..6a7801b81 100755 --- a/slsReceiverSoftware/include/GeneralData.h +++ b/slsReceiverSoftware/include/GeneralData.h @@ -120,18 +120,13 @@ public: * Get Header Infomation (frame number, packet number) * @param index thread index for debugging purposes * @param packetData pointer to data - * @param dynamicRange dynamic range to assign subframenumber if 32 bit mode * @param oddStartingPacket odd starting packet (gotthard) * @param frameNumber frame number * @param packetNumber packet number - * @param subFrameNumber sub frame number if applicable - * @param bunchId bunch id */ - virtual void GetHeaderInfo(int index, char* packetData, uint32_t dynamicRange, bool oddStartingPacket, - uint64_t& frameNumber, uint32_t& packetNumber, uint32_t& subFrameNumber, uint64_t& bunchId) const + virtual void GetHeaderInfo(int index, char* packetData, bool oddStartingPacket, + uint64_t& frameNumber, uint32_t& packetNumber) const { - subFrameNumber = -1; - bunchId = -1; frameNumber = ((uint32_t)(*((uint32_t*)(packetData)))); frameNumber++; packetNumber = frameNumber&packetIndexMask; @@ -280,27 +275,20 @@ private: * Get Header Infomation (frame number, packet number) * @param index thread index for debugging purposes * @param packetData pointer to data - * @param dynamicRange dynamic range to assign subframenumber if 32 bit mode * @param oddStartingPacket odd starting packet (gotthard) * @param frameNumber frame number * @param packetNumber packet number - * @param subFrameNumber sub frame number if applicable - * @param bunchId bunch id */ - void GetHeaderInfo(int index, char* packetData, uint32_t dynamicRange, bool oddStartingPacket, - uint64_t& frameNumber, uint32_t& packetNumber, uint32_t& subFrameNumber, uint64_t& bunchId) const + void GetHeaderInfo(int index, char* packetData, bool oddStartingPacket, + uint64_t& frameNumber, uint32_t& packetNumber) const { if (nPixelsX == 1280) { - subFrameNumber = -1; - bunchId = -1; frameNumber = *reinterpret_cast(packetData); if (oddStartingPacket) frameNumber++; packetNumber = frameNumber&packetIndexMask; frameNumber = (frameNumber & frameIndexMask) >> frameIndexOffset; } else { - subFrameNumber = -1; - bunchId = -1; frameNumber = *reinterpret_cast(packetData); packetNumber = 0; } @@ -555,6 +543,9 @@ private: const int NCHAN_DIGITAL = 64; /** Number of bytes per analog channel */ const int NUM_BYTES_PER_ANALOG_CHANNEL = 2; + + const int FRAME_NUMBER_OFFSET = 6; + const int PACKET_NUMBER_OFFSET = 6 + 8; public: @@ -619,12 +610,20 @@ public: nPixelsY = 1; // 10G if (t) { + /* headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header); dataSize = UDP_PACKET_DATA_BYTES; packetSize = headerSizeinPacket + dataSize; imageSize = adatabytes + ddatabytes; packetsPerFrame = ceil((double)imageSize / (double)dataSize); standardheader = true; + */ + headerSizeinPacket = 22; + dataSize = 8192; + packetSize = headerSizeinPacket + dataSize; + imageSize = adatabytes + ddatabytes; + packetsPerFrame = ceil((double)imageSize / (double)dataSize); + standardheader = false; } // 1g udp (via fifo readout) else { @@ -638,6 +637,21 @@ public: return adatabytes; } + /** + * Get Header Infomation (frame number, packet number) + * @param index thread index for debugging purposes + * @param packetData pointer to data + * @param oddStartingPacket odd starting packet (gotthard) + * @param frameNumber frame number + * @param packetNumber packet number + */ + void GetHeaderInfo(int index, char* packetData, bool oddStartingPacket, + uint64_t& frameNumber, uint32_t& packetNumber) const + { + frameNumber = *reinterpret_cast(packetData + FRAME_NUMBER_OFFSET); + packetNumber = *reinterpret_cast(packetData + PACKET_NUMBER_OFFSET); + } + }; diff --git a/slsReceiverSoftware/src/Listener.cpp b/slsReceiverSoftware/src/Listener.cpp index 4ffccbd32..628398034 100755 --- a/slsReceiverSoftware/src/Listener.cpp +++ b/slsReceiverSoftware/src/Listener.cpp @@ -348,8 +348,8 @@ void Listener::StopListening(char* buf) { uint32_t Listener::ListenToAnImage(char* buf) { int rc = 0; - uint64_t fnum = 0, bid = 0; - uint32_t pnum = 0, snum = 0; + uint64_t fnum = 0; + uint32_t pnum = 0; uint32_t numpackets = 0; uint32_t dsize = generalData->dataSize; uint32_t hsize = generalData->headerSizeinPacket; //(includes empty header) @@ -402,8 +402,7 @@ uint32_t Listener::ListenToAnImage(char* buf) { } // -------------------old header ----------------------------------------------------------------------------- else { - generalData->GetHeaderInfo(index, &carryOverPacket[0], - *dynamicRange, oddStartingPacket, fnum, pnum, snum, bid); + generalData->GetHeaderInfo(index, &carryOverPacket[0], oddStartingPacket, fnum, pnum); } //------------------------------------------------------------------------------------------------------------ if (fnum != currentFrameIndex) { @@ -525,8 +524,7 @@ uint32_t Listener::ListenToAnImage(char* buf) { oddStartingPacket = generalData->SetOddStartingPacket(index, &listeningPacket[0]); } - generalData->GetHeaderInfo(index, &listeningPacket[0], - *dynamicRange, oddStartingPacket, fnum, pnum, snum, bid); + generalData->GetHeaderInfo(index, &listeningPacket[0], oddStartingPacket, fnum, pnum); } //------------------------------------------------------------------------------------------------------------ diff --git a/slsSupportLib/include/versionAPI.h b/slsSupportLib/include/versionAPI.h index 15b93541f..d17c29908 100644 --- a/slsSupportLib/include/versionAPI.h +++ b/slsSupportLib/include/versionAPI.h @@ -7,4 +7,4 @@ #define APIGUI 0x190723 #define APIJUNGFRAU 0x190730 #define APIEIGER 0x190806 -#define APICTB 0x190819 +#define APICTB 0x190820 From 0daada926658014497dcda7623f8a8b27bc46177 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Wed, 21 Aug 2019 11:15:10 +0200 Subject: [PATCH 10/14] version --- slsSupportLib/include/versionAPI.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slsSupportLib/include/versionAPI.h b/slsSupportLib/include/versionAPI.h index d17c29908..60b5d2a3f 100644 --- a/slsSupportLib/include/versionAPI.h +++ b/slsSupportLib/include/versionAPI.h @@ -7,4 +7,4 @@ #define APIGUI 0x190723 #define APIJUNGFRAU 0x190730 #define APIEIGER 0x190806 -#define APICTB 0x190820 +#define APICTB 0x190821 From f77b6ab0684e299abd2f412689cfb76cb8c672fc Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Wed, 21 Aug 2019 11:32:45 +0200 Subject: [PATCH 11/14] WIP --- slsDetectorServers/ctbDetectorServer/slsDetectorServer_defs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slsDetectorServers/ctbDetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/ctbDetectorServer/slsDetectorServer_defs.h index 45ec6148a..33b5c5e5e 100755 --- a/slsDetectorServers/ctbDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/ctbDetectorServer/slsDetectorServer_defs.h @@ -4,7 +4,7 @@ #define MIN_REQRD_VRSN_T_RD_API 0x181130 -#define REQRD_FRMWR_VRSN 0x190402 +#define REQRD_FRMWR_VRSN 0x190821 #define CTRL_SRVR_INIT_TIME_US (2 * 1000 * 1000) From b4c207fc4e75dbe2d7e15ba421b85259a58e1501 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20Fr=C3=B6jdh?= Date: Wed, 21 Aug 2019 12:02:06 +0200 Subject: [PATCH 12/14] Less data race in slsReceiver (#50) * removed some data races * non needed mutex * removed extra include --- CMakeLists.txt | 9 ++++----- slsReceiverSoftware/include/DataProcessor.h | 3 ++- slsReceiverSoftware/include/Listener.h | 20 +++++++++---------- .../include/slsReceiverImplementation.h | 3 ++- slsReceiverSoftware/src/Listener.cpp | 5 +---- slsSupportLib/include/genericSocket.h | 1 - 6 files changed, 18 insertions(+), 23 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ab0c1dac6..575e3c693 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -102,11 +102,10 @@ endif() if(SLS_USE_SANITIZER) - target_compile_options(slsProjectOptions INTERFACE -fsanitize=address,undefined -fno-omit-frame-pointer) - #target_compile_options(slsProjectOptions INTERFACE -fsanitize=address,undefined) - target_link_libraries(slsProjectOptions INTERFACE -fsanitize=address,undefined) - # target_compile_options(slsProjectOptions INTERFACE -fsanitize=thread) - # target_link_libraries(slsProjectOptions INTERFACE -fsanitize=thread) + # target_compile_options(slsProjectOptions INTERFACE -fsanitize=address,undefined -fno-omit-frame-pointer) + # target_link_libraries(slsProjectOptions INTERFACE -fsanitize=address,undefined) + target_compile_options(slsProjectOptions INTERFACE -fsanitize=thread) + target_link_libraries(slsProjectOptions INTERFACE -fsanitize=thread) endif() #rapidjson diff --git a/slsReceiverSoftware/include/DataProcessor.h b/slsReceiverSoftware/include/DataProcessor.h index 9c5febfdb..496c9ab5f 100755 --- a/slsReceiverSoftware/include/DataProcessor.h +++ b/slsReceiverSoftware/include/DataProcessor.h @@ -17,6 +17,7 @@ class File; class DataStreamer; #include +#include class DataProcessor : private virtual slsDetectorDefs, public ThreadObject { @@ -310,7 +311,7 @@ class DataProcessor : private virtual slsDetectorDefs, public ThreadObject { static const std::string TypeName; /** Object running status */ - bool runningFlag; + std::atomic runningFlag; /** GeneralData (Detector Data) object */ const GeneralData* generalData; diff --git a/slsReceiverSoftware/include/Listener.h b/slsReceiverSoftware/include/Listener.h index 2ee15c75a..efdb3a1e6 100755 --- a/slsReceiverSoftware/include/Listener.h +++ b/slsReceiverSoftware/include/Listener.h @@ -10,7 +10,7 @@ */ #include - +#include #include "ThreadObject.h" class GeneralData; @@ -39,7 +39,7 @@ class Listener : private virtual slsDetectorDefs, public ThreadObject { * @param depaden pointer to deactivated padding enable * @param sm pointer to silent mode */ - Listener(int ind, detectorType dtype, Fifo* f, runStatus* s, + Listener(int ind, detectorType dtype, Fifo* f, std::atomic* s, uint32_t* portno, char* e, uint64_t* nf, uint32_t* dr, int64_t* us, int64_t* as, uint32_t* fpf, frameDiscardPolicy* fdp, bool* act, bool* depaden, bool* sm); @@ -151,7 +151,6 @@ class Listener : private virtual slsDetectorDefs, public ThreadObject { void SetHardCodedPosition(uint16_t r, uint16_t c); - private: /** @@ -201,7 +200,7 @@ class Listener : private virtual slsDetectorDefs, public ThreadObject { static const std::string TypeName; /** Object running status */ - bool runningFlag; + std::atomic runningFlag; /** GeneralData (Detector Data) object */ GeneralData* generalData; @@ -214,7 +213,7 @@ class Listener : private virtual slsDetectorDefs, public ThreadObject { detectorType myDetectorType; /** Receiver Status */ - runStatus* status; + std::atomic* status; /** UDP Socket - Detector to Receiver */ std::unique_ptr udpSocket; @@ -264,10 +263,10 @@ class Listener : private virtual slsDetectorDefs, public ThreadObject { // acquisition start /** Aquisition Started flag */ - bool acquisitionStartedFlag; + std::atomic acquisitionStartedFlag; /** Measurement Started flag */ - bool measurementStartedFlag; + std::atomic measurementStartedFlag; /** Frame Number of First Frame of an entire Acquisition (including all scans) */ uint64_t firstAcquisitionIndex; @@ -278,10 +277,10 @@ class Listener : private virtual slsDetectorDefs, public ThreadObject { // for acquisition summary /** Number of complete Packets caught for each real time acquisition (eg. for each scan (start& stop of receiver)) */ - volatile uint64_t numPacketsCaught; + std::atomic numPacketsCaught; /** Last Frame Index caught from udp network */ - uint64_t lastCaughtFrameIndex; + std::atomic lastCaughtFrameIndex; // parameters to acquire image @@ -300,12 +299,11 @@ class Listener : private virtual slsDetectorDefs, public ThreadObject { std::unique_ptr listeningPacket; /** if the udp socket is connected */ - bool udpSocketAlive; + std::atomic udpSocketAlive; /** Semaphore to synchonize deleting udp socket */ sem_t semaphore_socket; - // for print progress during acqusition /** number of packets for statistic */ uint32_t numPacketsStatistic; diff --git a/slsReceiverSoftware/include/slsReceiverImplementation.h b/slsReceiverSoftware/include/slsReceiverImplementation.h index aacab85cb..1fb3b7b15 100755 --- a/slsReceiverSoftware/include/slsReceiverImplementation.h +++ b/slsReceiverSoftware/include/slsReceiverImplementation.h @@ -21,6 +21,7 @@ class DataStreamer; class Fifo; class slsDetectorDefs; +#include #include #include #include @@ -910,7 +911,7 @@ class slsReceiverImplementation : private virtual slsDetectorDefs { /** Maximum Number of Listening Threads/ UDP Ports */ const static int MAX_NUMBER_OF_LISTENING_THREADS = 2; /** Receiver Status */ - runStatus status; + std::atomic status; /** Activated/Deactivated */ bool activated; /** Deactivated padding enable */ diff --git a/slsReceiverSoftware/src/Listener.cpp b/slsReceiverSoftware/src/Listener.cpp index 4ffccbd32..bd34d246e 100755 --- a/slsReceiverSoftware/src/Listener.cpp +++ b/slsReceiverSoftware/src/Listener.cpp @@ -20,7 +20,7 @@ const std::string Listener::TypeName = "Listener"; -Listener::Listener(int ind, detectorType dtype, Fifo* f, runStatus* s, +Listener::Listener(int ind, detectorType dtype, Fifo* f, std::atomic* s, uint32_t* portno, char* e, uint64_t* nf, uint32_t* dr, int64_t* us, int64_t* as, uint32_t* fpf, frameDiscardPolicy* fdp, bool* act, bool* depaden, bool* sm) : @@ -476,9 +476,6 @@ uint32_t Listener::ListenToAnImage(char* buf) { } - - - //until last packet isHeaderEmpty to account for gotthard short frame, else never entering this loop) while ( numpackets < pperFrame) { //listen to new packet diff --git a/slsSupportLib/include/genericSocket.h b/slsSupportLib/include/genericSocket.h index 220aa5e8f..1b7e7d00f 100755 --- a/slsSupportLib/include/genericSocket.h +++ b/slsSupportLib/include/genericSocket.h @@ -44,7 +44,6 @@ class sockaddr_in; #include #include "logger.h" - #define DEFAULT_PACKET_SIZE 1286 #define SOCKET_BUFFER_SIZE (100*1024*1024) //100 MB #define DEFAULT_BACKLOG 5 From f0ba8a06ceddc66f6feb95c74e00989c13c3dcd3 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Wed, 21 Aug 2019 13:21:35 +0200 Subject: [PATCH 13/14] ctb 10g fix for old reciever --- slsReceiverSoftware/include/GeneralData.h | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/slsReceiverSoftware/include/GeneralData.h b/slsReceiverSoftware/include/GeneralData.h index 6a7801b81..bfbd1e1c7 100755 --- a/slsReceiverSoftware/include/GeneralData.h +++ b/slsReceiverSoftware/include/GeneralData.h @@ -544,8 +544,13 @@ private: /** Number of bytes per analog channel */ const int NUM_BYTES_PER_ANALOG_CHANNEL = 2; - const int FRAME_NUMBER_OFFSET = 6; - const int PACKET_NUMBER_OFFSET = 6 + 8; + struct ctb_10g_packet_header { + unsigned char emptyHeader[6]; + unsigned char reserved[4]; + uint32_t packetFrameNumber; + uint64_t bunchid; + } __attribute__((packed)); + public: @@ -559,6 +564,9 @@ public: packetSize = headerSizeinPacket + dataSize; //packetsPerFrame = 1; imageSize = nPixelsX * nPixelsY * 2; + frameIndexMask = 0xFFFFFF; // 10g + frameIndexOffset = 8; // 10g + packetIndexMask = 0xFF; //10g packetsPerFrame = ceil((double)imageSize / (double)UDP_PACKET_DATA_BYTES); maxFramesPerFile = CTB_MAX_FRAMES_PER_FILE; fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header); @@ -648,8 +656,9 @@ public: void GetHeaderInfo(int index, char* packetData, bool oddStartingPacket, uint64_t& frameNumber, uint32_t& packetNumber) const { - frameNumber = *reinterpret_cast(packetData + FRAME_NUMBER_OFFSET); - packetNumber = *reinterpret_cast(packetData + PACKET_NUMBER_OFFSET); + auto header = reinterpret_cast(packetData); + frameNumber = (header->packetFrameNumber >> frameIndexOffset) & frameIndexMask; + packetNumber = header->packetFrameNumber & packetIndexMask; } }; From 5eaea5fb8d0da8b9a11d78dbaa9e001a515f7391 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Wed, 21 Aug 2019 13:22:43 +0200 Subject: [PATCH 14/14] updated ctb server --- .../bin/ctbDetectorServer_developer | Bin 155736 -> 155916 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer b/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer index 6a6e3ce04dd870f61616334a6c70e92507752af8..eb9b82534f7f2e5a93a7d990f5b9ad67b108c173 100755 GIT binary patch delta 54016 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 P97w@HDh%XWVB7x(GUw-JTvpm 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 mTP=Xh))Y_-sL