From 83600fcb15c8261173ab15a8ba8d1009693f2d23 Mon Sep 17 00:00:00 2001 From: Anna Bergamaschi Date: Fri, 17 Aug 2018 12:29:07 +0200 Subject: [PATCH] Added data structure for moench02 dynamic gain switching --- .../dataStructures/moench02CtbData.h | 2 +- .../dataStructures/moench02CtbDataDGS.h | 179 ++++++++++++++++++ 2 files changed, 180 insertions(+), 1 deletion(-) create mode 100644 slsDetectorCalibration/dataStructures/moench02CtbDataDGS.h diff --git a/slsDetectorCalibration/dataStructures/moench02CtbData.h b/slsDetectorCalibration/dataStructures/moench02CtbData.h index 663230725..07d683d27 100644 --- a/slsDetectorCalibration/dataStructures/moench02CtbData.h +++ b/slsDetectorCalibration/dataStructures/moench02CtbData.h @@ -31,7 +31,7 @@ class moench02CtbData : public slsDetectorData { */ - moench02CtbData(int ns=6400): slsDetectorData(160, 160, ns*2*32, NULL, NULL) , nadc(32), sc_width(40), sc_height(160) { + moench02CtbData(int ns=6400): slsDetectorData(160, 160, ns*2*32, NULL, NULL) , nadc(32), sc_width(40), sc_height(160) { int adc_off[4]={40,0,120,80}; diff --git a/slsDetectorCalibration/dataStructures/moench02CtbDataDGS.h b/slsDetectorCalibration/dataStructures/moench02CtbDataDGS.h new file mode 100644 index 000000000..31c6d539d --- /dev/null +++ b/slsDetectorCalibration/dataStructures/moench02CtbDataDGS.h @@ -0,0 +1,179 @@ +#ifndef MOENCH02CTBDATADGS_H +#define MOENCH02CTBDATADGS_H +#include "slsDetectorData.h" + + + +class moench02CtbData : public slsDetectorData { + + private: + + int iframe; + // int *xmap, *ymap; + //int nadc; + int sc_width; + int sc_height; + + int maplength; + + + + public: + + + + + /** + Implements the slsReceiverData structure for the moench02 prototype read out by a module i.e. using the slsReceiver + (160x160 pixels, 40 packets 1286 large etc.) + \param c crosstalk parameter for the output buffer + + */ + + + moench02CtbDataDGS(int ns=6400): slsDetectorData(160, 160, ns*(2*32+8), NULL, NULL) , sc_width(40), sc_height(160) { + + + int adc_off[4]={40,0,120,80}; + int adc_nr[4]={8,10,20,23}; + int row, col; + + int isample; + int iadc, iiadc; + int ix, iy; + maplength=this->getDataSize()/2; + //cout << maplength << endl; + + for (iiadc=0; iiadc<4; iiadc++) { + + iadc=adc_nr[iiadc]; + //cout << iiadc << endl; + for (int i=0; i=dataSize) { + cout << "Error: pointer " << dataMap[row][col] << " out of range "<< endl; + } + + } + } + + for (int i=0; i=0){ + xmap[i]=adc_off[iadc]+ix; + ymap[i]=iy; + }else{ + xmap[i]=-1; + ymap[i]=-1; + } + } + iframe=0; + cout << "data struct created" << endl; + }; + + void getPixel(int ip, int &x, int &y) { + if(ip>=0 && ip>31)) return 1; + return 0; + } + return 0; //not yet implemented for 4th supercolumn + } + + + /** + + Returns the frame number for the given dataset. Purely virtual func. + \param buff pointer to the dataset + \returns frame number + + */ + + + virtual int getFrameNumber(char *buff){(void)buff; return iframe;}; + + /** + + Returns the packet number for the given dataset. purely virtual func + \param buff pointer to the dataset + \returns packet number number + + + virtual int getPacketNumber(char *buff)=0; + + */ + + /** + + Loops over a memory slot until a complete frame is found (i.e. all packets 0 to nPackets, same frame number). purely virtual func + \param data pointer to the memory to be analyzed + \param ndata reference to the amount of data found for the frame, in case the frame is incomplete at the end of the memory slot + \param dsize size of the memory slot to be analyzed + \returns pointer to the beginning of the last good frame (might be incomplete if ndata smaller than dataSize), or NULL if no frame is found + + */ + virtual char *findNextFrame(char *data, int &ndata, int dsize){ndata=dsize; setDataSize(dsize); return data;}; + + + /** + + Loops over a file stream until a complete frame is found (i.e. all packets 0 to nPackets, same frame number). Can be overloaded for different kind of detectors! + \param filebin input file stream (binary) + \returns pointer to the begin of the last good frame, NULL if no frame is found or last frame is incomplete + + */ + virtual char *readNextFrame(ifstream &filebin){ + // int afifo_length=0; + uint16_t *afifo_cont; + int ib=0; + if (filebin.is_open()) { + afifo_cont=new uint16_t[dataSize/2]; + while (filebin.read(((char*)afifo_cont)+ib,2)) { + ib+=2; + if (ib==dataSize) break; + } + if (ib>0) { + iframe++; + //cout << ib/2 << "-" << endl; + //for (int i=0; i