#ifndef MOENCH03T1ZMQNEWRECT_H #define MOENCH03T1ZMQNEWRECT_H #include "slsDetectorData.h" #define VERT 1 class moench03T1ZmqDataNew : public slsDetectorData { private: int iframe; int nadc; int sc_width; int sc_height; const int nSamples; const int offset; 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 */ #ifdef HOR moench03T1ZmqDataNew(int ns=5000): slsDetectorData(800, 200, ns*2*32), nSamples(ns), offset(sizeof(int)) { #endif #ifdef VERT moench03T1ZmqDataNew(int ns=5000): slsDetectorData(200, 800, ns*2*32), nSamples(ns), offset(sizeof(int)) { #endif int nadc=32; int sc_width=25; int sc_height=200; int adc_nr[32]={300,325,350,375,300,325,350,375, \ 200,225,250,275,200,225,250,275,\ 100,125,150,175,100,125,150,175,\ 0,25,50,75,0,25,50,75}; int row, col; // int isample; int iadc; int ix, iy; int npackets=40; int i; int adc4(0); int pix; int off=0; #ifdef OFF_1 off=1; #endif cout << "This is a MOENCH with rectangular pixels!" << endl; for (int ip=0; ip=nSamples*2*32) cout << "Error: pointer " << pix << " out of range "<< endl; ix=col; iy=row; //col and row have to do with data sequence //ix and iy have to do with implant position #ifdef HOR if (row%2==off) { ix=2*col; iy=row/2; } else { ix=2*col+1; iy=row/2; } #endif #ifdef VERT if (col%2==off) { ix=col/2; iy=row*2+1; } else { ix=col/2; iy=row*2; } #endif dataMap[iy][ix]=pix; } } } } /* int ipacket; */ /* int ibyte; */ /* int ii=0; */ /* for (ibyte=0; ibyte0) { */ /* iframe++; */ /* // cout << ib << "-" << endl; */ /* return (char*)afifo_cont; */ /* } else { */ /* delete [] afifo_cont; */ /* return NULL; */ /* } */ /* } */ /* return NULL; */ /* }; */ virtual char *readNextFrame(ifstream &filebin) { int ff=-1, np=-1; return readNextFrame(filebin, ff, np); }; virtual char *readNextFrame(ifstream &filebin, int &ff) { int np=-1; return readNextFrame(filebin, ff, np); }; virtual char *readNextFrame(ifstream &filebin, int& ff, int &np) { char *data=new char[32*2*nSamples]; char *d=readNextFrame(filebin, ff, np, data); if (d==NULL) {delete [] data; data=NULL;} return data; } virtual char *readNextFrame(ifstream &filebin, int& ff, int &np, char *data) { /* char *retval=0; */ /* int nd; */ /* int fnum = -1; */ np=0; /* int pn; */ /* if (ff>=0) */ /* fnum=ff; */ if (filebin.is_open()) { if (filebin.read(data, 32*2*nSamples) ){ // iframe++; //ff=iframe; return data; } } return NULL; }; /** 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){ if (dsize<32*2*nSamples) ndata=dsize; else ndata=32*2*nSamples; return data; } // virtual int setFrameNumber(int ff){iframe=ff}; int getPacketNumber(int x, int y) {return 0;}; }; #endif