modified ZMQonline display for stripsel usage. (#699)

* modified ZMQonline display for stripsel usage. modified dataprocessor to overwrite header.detspec1 with ROI in case of ROI.
* Removing changes to the slsReceiver, moved to branch jf_zeromq_display_rxroi
This commit is contained in:
2023-03-22 14:25:02 +01:00
committed by GitHub
parent b67c6dea08
commit 500442fd6b
7 changed files with 655 additions and 49 deletions

View File

@ -57,22 +57,34 @@ class jungfrauLGADStrixelsData : public slsDetectorData<uint16_t> {
1286 large etc.) \param c crosstalk parameter for the output buffer 1286 large etc.) \param c crosstalk parameter for the output buffer
*/ */
int groupmap[512*5][1024/5];
jungfrauLGADStrixelsData() jungfrauLGADStrixelsData()
: slsDetectorData<uint16_t>(1024/5, 512*5, : slsDetectorData<uint16_t>(1024/5, 512*5,
512 * 1024 * 2 + sizeof(header)) { 512 * 1024 * 2 + sizeof(header)) {
cout << "aaa" << endl; // cout << "aaa" << endl;
#ifdef ALDO //VH #ifdef ALDO //VH
cout<< "using reduced jf_header" << endl; //VH cout<< "using reduced jf_header" << endl; //VH
#endif //VH #endif //VH
for (int ix = 0; ix < 1024/5; ix++) { for (int ix = 0; ix < 1024/5; ix++) {
for (int iy = 0; iy < 512*5; iy++) { for (int iy = 0; iy < 512*5; iy++) {
dataMap[iy][ix] = sizeof(header);//+ ( 1024 * 5 + 300) * 2; //somewhere on the guardring of the LGAD dataMap[iy][ix] = sizeof(header);//+ ( 1024 * 5 + 300) * 2; //somewhere on the guardring of the LGAD
groupmap[iy][ix]=-1;
#ifdef HIGHZ #ifdef HIGHZ
dataMask[iy][ix] = 0x3fff; dataMask[iy][ix] = 0x3fff;
#endif #endif
} }
} }
int x0=256+10, x1=256+246;
int y0=10, y1=256-10;
int ix,iy;
int ox=0, oy=0, ooy=0;
ox=2;//0; //original value is 0
cout << "G0" << endl;
//chip1 //chip1
/* /*
* TL;DR comments: y0 is too high by 1, group 1 and group 2 are by one row too short * TL;DR comments: y0 is too high by 1, group 1 and group 2 are by one row too short
@ -90,10 +102,11 @@ class jungfrauLGADStrixelsData : public slsDetectorData<uint16_t> {
ox=0; ox=0;
for (int ipx=x0; ipx<x1; ipx++) { for (int ipx=x0; ipx<x1; ipx++) {
for (int ipy=y0; ipy<y0+54; ipy++) { //y0+54 excludes the last row (in chip coordinates), should be y0+55 to include all rows for (int ipy=y0; ipy<y0+54; ipy++) { //y0+54 excludes the last row (in chip coordinates), should be y0+55 to include all rows
ix=(ipx-x0+ox)/3;
iy=(ipx-x0+ox)%3+(ipy-y0+oy)*3+ooy; iy=(ipx-x0+ox)%3+(ipy-y0+oy)*3+ooy;
ix=(ipx-x0+ox)/3;
dataMap[iy][ix] = sizeof(header) + (1024 * ipy + ipx) * 2; dataMap[iy][ix] = sizeof(header) + (1024 * ipy + ipx) * 2;
// cout << ipx << " " << ipy << " " << ix << " " << iy << endl; groupmap[iy][ix]=0;
// cout << ipx << " " << ipy << " " << ix << " " << iy << endl;
} }
} }
@ -101,12 +114,13 @@ class jungfrauLGADStrixelsData : public slsDetectorData<uint16_t> {
//3 square pixels in x on the left //3 square pixels in x on the left
oy=-54; oy=-54;
ooy=54*3; ooy=54*3;
ox=3; ox=2;//; //original value is 3
for (int ipx=x0; ipx<x1; ipx++) { for (int ipx=x0; ipx<x1; ipx++) {
for (int ipy=y0+54; ipy<y0+64+54; ipy++) { //I think y0+54 catches the last row of group1! Should be y0+55 if we want to include all rows? And y0+55+64 for (int ipy=y0+54; ipy<y0+64+54; ipy++) { //I think y0+54 catches the last row of group1! Should be y0+55 if we want to include all rows? And y0+55+64
ix=(ipx-x0+ox)/5; ix=(ipx-x0+ox)/5;
iy=(ipx-x0+ox)%5+(ipy-y0+oy)*5+ooy; iy=(ipx-x0+ox)%5+(ipy-y0+oy)*5+ooy;
dataMap[iy][ix] = sizeof(header) + (1024 * ipy + ipx) * 2; dataMap[iy][ix] = sizeof(header) + (1024 * ipy + ipx) * 2;
groupmap[iy][ix]=1;
} }
} }
@ -120,6 +134,7 @@ class jungfrauLGADStrixelsData : public slsDetectorData<uint16_t> {
ix=(ipx-x0+ox)/4; ix=(ipx-x0+ox)/4;
iy=(ipx-x0+ox)%4+(ipy-y0+oy)*4+ooy; iy=(ipx-x0+ox)%4+(ipy-y0+oy)*4+ooy;
dataMap[iy][ix] = sizeof(header) + (1024 * ipy + ipx) * 2; dataMap[iy][ix] = sizeof(header) + (1024 * ipy + ipx) * 2;
groupmap[iy][ix]=2;
} }
} }
@ -143,8 +158,8 @@ class jungfrauLGADStrixelsData : public slsDetectorData<uint16_t> {
ix=(ipx-x0+ox)/4; ix=(ipx-x0+ox)/4;
iy=(ipx-x0+ox)%4+(ipy-y0+oy)*4+ooy; iy=(ipx-x0+ox)%4+(ipy-y0+oy)*4+ooy;
dataMap[iy][ix] = sizeof(header) + (1024 * ipy + ipx) * 2; dataMap[iy][ix] = sizeof(header) + (1024 * ipy + ipx) * 2;
//if (ipx==x0) //if (ipx==x0) cout << ipx << " " << ipy << " " << ix << " " << iy << endl;
// cout << ipx << " " << ipy << " " << ix << " " << iy << endl; groupmap[iy][ix]=2;
} }
} }
@ -158,6 +173,7 @@ class jungfrauLGADStrixelsData : public slsDetectorData<uint16_t> {
ix=(ipx-x0+ox)/5; ix=(ipx-x0+ox)/5;
iy=(ipx-x0+ox)%5+(ipy-y0+oy)*5+ooy; iy=(ipx-x0+ox)%5+(ipy-y0+oy)*5+ooy;
dataMap[iy][ix] = sizeof(header) + (1024 * ipy + ipx) * 2; dataMap[iy][ix] = sizeof(header) + (1024 * ipy + ipx) * 2;
groupmap[iy][ix]=1;
} }
} }
@ -171,6 +187,7 @@ class jungfrauLGADStrixelsData : public slsDetectorData<uint16_t> {
ix=(ipx-x0+ox)/3; ix=(ipx-x0+ox)/3;
iy=(ipx-x0+ox)%3+(ipy-y0+oy)*3+ooy; iy=(ipx-x0+ox)%3+(ipy-y0+oy)*3+ooy;
dataMap[iy][ix] = sizeof(header) + (1024 * ipy + ipx) * 2; dataMap[iy][ix] = sizeof(header) + (1024 * ipy + ipx) * 2;
groupmap[iy][ix]=0;
} }
} }

View File

@ -0,0 +1,336 @@
// SPDX-License-Identifier: LGPL-3.0-or-other
// Copyright (C) 2021 Contributors to the SLS Detector Package
#ifndef JUNGFRAULGADSTRIXELSDATA_H
#define JUNGFRAULGADSTRIXELSDATA_H
#ifdef CINT
#include "sls/sls_detector_defs_CINT.h"
#else
#include "sls/sls_detector_defs.h"
#endif
#include "slsDetectorData.h"
//#define VERSION_V2
/**
@short structure for a Detector Packet or Image Header
@li frameNumber is the frame number
@li expLength is the subframe number (32 bit eiger) or real time exposure
time in 100ns (others)
@li packetNumber is the packet number
@li bunchId is the bunch id from beamline
@li timestamp is the time stamp with 10 MHz clock
@li modId is the unique module id (unique even for left, right, top, bottom)
@li xCoord is the x coordinate in the complete detector system
@li yCoord is the y coordinate in the complete detector system
@li zCoord is the z coordinate in the complete detector system
@li debug is for debugging purposes
@li roundRNumber is the round robin set number
@li detType is the detector type see :: detectorType
@li version is the version number of this structure format
*/
namespace strixelSingleChip {
constexpr int nc_rawimg = 1024; //for full images //256;
constexpr int nr_rawimg = 512;
constexpr int nr_chip = 256;
constexpr int gr = 9;
//Group 1: 25um pitch, groups of 3, 1 column of square pixels
constexpr int g1_ncols{ (nc_rawimg-(2*gr)-1)/3 }; //79
constexpr int g1_nrows{ ( (nr_chip/4)-gr )*3 }; //165
//Group 2: 15um pitch, groups of 5, 3 columns of square pixels
constexpr int g2_ncols{ (nc_rawimg-(2*gr)-3)/5 }; //47
constexpr int g2_nrows{ (nr_chip/4)*5 }; //320
//Group 3: 18.75um pitch, groups of 4, 2 columns of square pixels (double the size of the other groups)
constexpr int g3_ncols{ (nc_rawimg-(2*gr)-2)/4 }; //59
constexpr int g3_nrows{ ( ((nr_chip/4)*2)-gr )*4 }; //476
constexpr int nc_strixel = 2*gr + 1 + g1_ncols; //group 1 is the "longest" group in x and has one extra square pixel
constexpr int nr_strixel = 2*gr + g1_nrows + g2_nrows + g3_nrows;
}
typedef struct {
uint64_t bunchNumber; /**< is the frame number */
uint64_t pre; /**< something */
} jf_header; //Aldo's header
using namespace strixelSingleChip;
class jungfrauLGADStrixelsData : public slsDetectorData<uint16_t> {
private:
int iframe;
int mchip;
int chip_x0;
int chip_y0;
void remapGroup( const int group ) {
int ix, iy=0;
int x0, y0, x1, y1, shifty;
int multiplicator;
int shiftx;
switch (group) {
default:
case 1:
multiplicator = 3;
break;
case 2:
multiplicator = 5;
break;
case 3:
multiplicator = 4;
break;
}
if ( mchip == 1 ) {
chip_x0=256;
chip_y0=1; //because of bump bonding issues(+1 row) on M408
switch (group) {
default:
case 1:
x0 = 10+chip_x0; //9 gr + 1 sq pixel
x1 = 246+chip_x0;
y0 = 9+chip_y0;
y1 = 64+chip_y0;
shifty = 0;
break;
case 2:
x0 = 12+chip_x0;
x1 = 247+chip_x0;
y0 = 64+chip_y0;
y1 = 128+chip_y0;
shifty = g1_nrows;
break;
case 3:
x0 = 11+chip_x0;
x1 = 247+chip_x0;
y0 = 128+chip_y0;
y1 = 247+chip_y0;
shifty = g2_nrows+g1_nrows;
break;
}
}
if ( mchip == 6 ) {
chip_x0=512;
chip_y0=255; //should be 256 but is 255 because of bump bonding issues (+1 row) on M408
switch (group) {
default:
case 1:
x0 = 9+chip_x0; //9 gr sq pixel
x1 = 246+chip_x0;
y0 = 192+chip_y0;
y1 = 244+chip_y0;
shifty = g1_nrows+2*g2_nrows+2*g3_nrows;
break;
case 2:
x0 = 9+chip_x0;
x1 = 244+chip_x0;
y0 = 128+chip_y0;
y1 = 191+chip_y0;
shifty = g1_nrows+g2_nrows+2*g3_nrows;;
break;
case 3:
x0 = 9+chip_x0;
x1 = 244+chip_x0;
y0 = 9+chip_y0;
y1 = 127+chip_y0;
shifty =g1_nrows+g2_nrows+g3_nrows;
break;
}
}
//remapping loop
for ( int ipy=y0; ipy<=y1;ipy++) {
for ( int ipx=x0; ipx<=x1; ipx++ ) {
ix = int ((ipx-x0)/multiplicator);
for ( int m=0; m<multiplicator;m++ ) {
if ( (ipx-x0)%multiplicator==m ) iy=(ipy-y0)*multiplicator +m + shifty;
}
// if (iy< 40) cout << iy << " " << ix <<endl;
dataMap[iy][ix] = sizeof(header) + (nc_rawimg * ipy + ipx) * 2;
groupmap[iy][ix]=group-1;
}
}
}
public:
int groupmap[512*5][1024/3];
using header = sls::defs::sls_receiver_header;
jungfrauLGADStrixelsData()
: slsDetectorData<uint16_t>( /*nc_strixel*/g1_ncols, /*nr_strixel*/ 2*g1_nrows+2*g2_nrows+2*g3_nrows,
g1_ncols* (2*g1_nrows+2*g2_nrows+2*g3_nrows) * 2 + sizeof(header) ) {
std::cout << "Jungfrau strixels 2X single chip with full module data " << std::endl;
//Fill all strixels with dummy values
for (int ix = 0; ix != g1_ncols; ++ix) {
for (int iy = 0; iy != 2*g1_nrows+2*g2_nrows+2*g3_nrows; ++iy) {
dataMap[iy][ix] = sizeof(header);
}
}
cout << "sizeofheader = "<<sizeof(header)<<endl;
std::cout << "Jungfrau strixels 2X single chip with full module data " << std::endl;
mchip = 1;
remapGroup(1);
remapGroup(2);
remapGroup(3);
mchip = 6;
remapGroup(1);
remapGroup(2);
remapGroup(3);
iframe = 0;
std::cout << "data struct created" << std::endl;
};
/**
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) {
uint16_t val = getChannel(data, ix, iy) & 0x3fff;
return val;
};
/**
Returns the frame number for the given dataset. Purely virtual func.
\param buff pointer to the dataset
\returns frame number
*/
int getFrameNumber(char *buff) {
#ifdef ALDO //VH
return ((header *)buff)->bunchNumber; //VH
#else //VH
return ((header *)buff)->detHeader.frameNumber;
#endif //VH
};
/**
Returns the packet number for the given dataset. purely virtual func
\param buff pointer to the dataset
\returns packet number number
*/
int getPacketNumber(char *buff) {
#ifdef ALDO //VH
//uint32_t fakePacketNumber = 1000;
//return fakePacketNumber; //VH //TODO: Keep in mind in case of bugs! //This is definitely bad!
return 1000;
#else //VH
return ((header *)buff)->detHeader.packetNumber;
#endif //VH
};
char *readNextFrame(std::ifstream &filebin) {
int ff = -1, np = -1;
return readNextFrame(filebin, ff, np);
};
char *readNextFrame(std::ifstream &filebin, int &ff) {
int np = -1;
return readNextFrame(filebin, ff, np);
};
char *readNextFrame(std::ifstream &filebin, int &ff, int &np) {
char *data = new char[dataSize];
char *d = readNextFrame(filebin, ff, np, data);
if (d == NULL) {
delete[] data;
data = NULL;
}
return data;
};
char *readNextFrame(std::ifstream &filebin, int &ff, int &np,char *data) {
char *retval = 0;
int nd;
int fnum = -1;
np = 0;
int pn;
// cout << dataSize << endl;
if (ff >= 0)
fnum = ff;
if (filebin.is_open()) {
if (filebin.read(data, dataSize)) {
ff = getFrameNumber(data);
np = getPacketNumber(data);
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 < dataSize)
ndata = dsize;
else
ndata = dataSize;
return data;
};
// int getPacketNumber(int x, int y) {return dataMap[y][x]/packetSize;};
};
#endif

View File

@ -12,8 +12,7 @@ template <class dataType> class slsDetectorData {
const int nx; /**< Number of pixels in the x direction */ const int nx; /**< Number of pixels in the x direction */
const int ny; /**< Number of pixels in the y direction */ const int ny; /**< Number of pixels in the y direction */
int dataSize; /**<size of the data constituting one frame */ int dataSize; /**<size of the data constituting one frame */
int **dataMap; /**< Array of size nx*ny storing the pointers to the data in
the dataset (as offset)*/
dataType **dataMask; /**< Array of size nx*ny storing the polarity of the dataType **dataMask; /**< Array of size nx*ny storing the polarity of the
data in the dataset (should be 0 if no inversion is data in the dataset (should be 0 if no inversion is
required, 0xffffffff is inversion is required) */ required, 0xffffffff is inversion is required) */
@ -25,6 +24,9 @@ template <class dataType> class slsDetectorData {
int isOrdered; int isOrdered;
public: public:
int **dataMap; /**< Array of size nx*ny storing the pointers to the data in
the dataset (as offset)*/
/** /**
General slsDetectors data structure. Works for data acquired using the General slsDetectors data structure. Works for data acquired using the
slsDetectorReceiver. Can be generalized to other detectors (many virtual slsDetectorReceiver. Can be generalized to other detectors (many virtual

View File

@ -0,0 +1 @@
Makefile.zmqrootdisp

View File

@ -18,7 +18,7 @@ LDFLAG= -L/usr/lib64/ -lpthread -lm -lstdc++ -lzmq -pthread -lrt -ltiff -O3
default: onlinedisp_zmq default: onlinedisp_zmq
onlinedisp_zmq: onlinedisp_zmq.cpp onlinedisp_zmq.h onlinedisp_zmq: onlinedisp_zmq.cpp onlinedisp_zmq.h ../dataStructures/jungfrauLGADStrixelsData_new.h
# flags from root-config --cflags --glibs # flags from root-config --cflags --glibs
g++ -o onlinedisp_zmq onlinedisp_zmq.cpp -I. -I$(ROOTSYS)/include -Wall -g -lm -L. -lzmq -pthread -lrt -L$(ROOTSYS)/lib -lGui -lCore -lRIO -lNet -lHist -lGraf -lGraf3d -lGpad -lTree -lRint -lPostscript -lMatrix -lPhysics -lMathCore -lThread -m64 $(LDFLAG) $(INCDIR) $(LIBHDF5) $(LIBRARYCBF) g++ -o onlinedisp_zmq onlinedisp_zmq.cpp -I. -I$(ROOTSYS)/include -Wall -g -lm -L. -lzmq -pthread -lrt -L$(ROOTSYS)/lib -lGui -lCore -lRIO -lNet -lHist -lGraf -lGraf3d -lGpad -lTree -lRint -lPostscript -lMatrix -lPhysics -lMathCore -lThread -m64 $(LDFLAG) $(INCDIR) $(LIBHDF5) $(LIBRARYCBF)

View File

@ -7,17 +7,23 @@ sls::zmqHeader zHeader;
#define NPRO 50 #define NPRO 50
#define NPRI 50 #define NPRI 50
//#define JFSTRX #define JFSTRX
#ifdef JFSTRX #ifdef JFSTRX
#include "jungfrauLGADStrixelsData.h" #include "jungfrauLGADStrixelsData_new.h"
#else #include "sls/sls_detector_defs.h"
#include "jungfrauModuleData.h" #include "slsDetectorData.h"
using header = sls::defs::sls_receiver_header;
#endif #endif
int main(int argc, char* argv[]) int main(int argc, char* argv[])
{ {
goout=1; goout=1;
hasallpede=false; hasallpede=false;
dophotonmap=true; if ((argc<3)) {printf("USAGE: command photon_energy_(peakinADC) [rx_ip] [port] \n"); return -1 ;} dophotonmap=true; if ((argc<3)) {printf("USAGE: command photon_energy_(peakinADC) [rx_ip] [port] \n"); return -1 ;}
@ -43,9 +49,19 @@ int main(int argc, char* argv[])
#ifdef JFSTRX #ifdef JFSTRX
cout << "JFSTRX" << endl; cout << "JFSTRX" << endl;
jungfrauLGADStrixelsData *decoder = new jungfrauLGADStrixelsData(); jungfrauLGADStrixelsData *decoder = new jungfrauLGADStrixelsData();
nx = 1024/5; ny= 512*5;
decoder->getDetectorSize(nx,ny);
cout<< decoder->dataMap[22][22] <<endl;
#else #else
nx = 1024; ny= 512; nx = 1024; ny= 512;
#endif #endif
@ -57,7 +73,7 @@ int main(int argc, char* argv[])
HDraw_every=20; HDraw_every=20;
fixranges=false; fixranges=false;
int group;
hchptr = (short*) malloc(NCH*sizeof(short)); hchptr = (short*) malloc(NCH*sizeof(short));
@ -80,29 +96,85 @@ int main(int argc, char* argv[])
char hname[100]; char hname[100];
#ifdef JFSTRX
int nxx=79; int nyy=165;
his1000= new TH2F("his1000","2d, chip 1 group 1 (25um) pede corr.",nxx,-0.5,nxx-0.5,nyy,-0.5,nyy-0.5);
his1060= new TH2F("his1060","2d, chip 6 group 1 (25um) pede corr.",nxx,-0.5,nxx-0.5,nyy,-0.5,nyy-0.5);
nxx=47; nyy=320; //320;
his1001= new TH2F("his1001","2d, chip 1 group 2 (15um) pede corr.",nxx,-0.5,nxx-0.5,nyy,-0.5,nyy-0.5);
his1061= new TH2F("his1061","2d, chip 6 group 2 (15um) pede corr.",nxx,-0.5,nxx-0.5,nyy,-0.5,nyy-0.5);
nxx=59; nyy=476; //476;
his1002= new TH2F("his1002","2d, chip 1 group 3 (18.75um) pede corr.",nxx,-0.5,nxx-0.5,nyy,-0.5,nyy-0.5);
his1062= new TH2F("his1002","2d, chip 6 group 3 (18.75um) pede corr.",nxx,-0.5,nxx-0.5,nyy,-0.5,nyy-0.5);
his1000->SetOption("colz");
his1001->SetOption("colz");
his1002->SetOption("colz");
his1060->SetOption("colz");
his1061->SetOption("colz");
his1062->SetOption("colz");
#else
his1000= new TH2F("his1000","2d , ev. pede corrected",nx,-0.5,nx-0.5,ny,-0.5,ny-0.5); his1000= new TH2F("his1000","2d , ev. pede corrected",nx,-0.5,nx-0.5,ny,-0.5,ny-0.5);
his1000->SetOption("colz"); his1000->SetOption("colz");
#endif
his2000= new TH2F("his2000","2d gain ",nx,-0.5,nx-0.5,ny,-0.5,ny-0.5); his2000= new TH2F("his2000","2d gain ",nx,-0.5,nx-0.5,ny,-0.5,ny-0.5);
his2000->GetZaxis()->SetRangeUser(0,4); his2000->GetZaxis()->SetRangeUser(0,4);
if (dophotonmap) { if (dophotonmap) {
his3000= new TH2F("his3000"," photon map ",nx,-0.5,nx-0.5,ny,-0.5,ny-0.5); his3000= new TH2F("his3000"," photon map ",1024,-0.5,1024-0.5,512,-0.5,512-0.5);
} }
else { else {
his3000= new TH2F("his3000"," raw adc ",nx,-0.5,nx-0.5,ny,-0.5,ny-0.5); his3000= new TH2F("his3000"," raw adc ",1024,-0.5,1024-0.5,512,-0.5,512-0.5);
} }
his4500= new TH2F("his45000","L vs R",101,-50,500,101,-50,500); his4500= new TH2F("his4500","T vs B",101,-500,MAX_POS,101,-500,MAX_POS);
hchip=new TH1I*[8]; hchip=new TH1I*[8];
#ifdef JFSTRX
for (i=0;i<8;i++) {
if(i<3)
sprintf(hname,"%d_hchip1group%d",i,i+1);
else if (i>4)
sprintf(hname,"%d_hchip6group%d",i, i-4);
else
sprintf(hname,"%d_",i);
hchip[i] = new TH1I(hname,hname,NBIN,MIN_POS,MAX_POS);
}
#else
for (i=0;i<8;i++) { for (i=0;i<8;i++) {
sprintf(hname,"hchip%d",i); sprintf(hname,"hchip%d",i);
hchip[i] = new TH1I(hname,hname,NBIN,MIN_POS,MAX_POS); hchip[i] = new TH1I(hname,hname,NBIN,MIN_POS,MAX_POS);
} }
#endif
cout <<"end of histo booking" <<endl; cout <<"end of histo booking" <<endl;
if (A2==NULL) A2 = new TCanvas("A2","Plotting Canvas gain",150,10,500,250); if (A2==NULL) A2 = new TCanvas("A2","Plotting Canvas gain",150,10,500,250);
if (A3==NULL) A3 = new TCanvas("A3","Plotting Canvas ADC",150,360,1200,550); if (A3==NULL) {
#ifdef JFSTRX
A3 = new TCanvas("A3","Plotting Canvas ADC",150,360,1200,750);
p1 = new TPad("p1","p1",0.01,0.5,0.49,1.);
p1->Draw();
p2 = new TPad("p2","p2",0.51,0.75,0.99,0.97);
p2->Draw();
p3 = new TPad("p3","p3",0.01,0.25,0.49,0.47);
p3->Draw();
p4 = new TPad("p4","p4",0.51,0.53,0.99,0.75);
p4->Draw();
p5 = new TPad("p5","p5",0.01,0.03,0.49,0.25);
p5->Draw();
p6 = new TPad("p6","p6",0.51,0.,0.99,0.5);
p6->Draw();
//A3->Divide(2,3);
// TVirtualPad* g=A3->cd(1);
// g->SetCanvasSize( g->GetWw(), 2*g->GetWw());
// g=A3->cd(6);
// g->SetCanvasSize( g->GetWw(), 2*g->GetWw());
#else
A3 = new TCanvas("A3","Plotting Canvas ADC",150,360,1200,550);
#endif
}
if (A4==NULL) A4 = new TCanvas("A4","Plotting Canvas PHs",750,300,1000,800); if (A4==NULL) A4 = new TCanvas("A4","Plotting Canvas PHs",750,300,1000,800);
A4->Clear(); A4->Clear();
A4->Divide(4,2,0.005,0.005); A4->Divide(4,2,0.005,0.005);
@ -132,6 +204,13 @@ int main(int argc, char* argv[])
{ {
memcpy(&croi, &zHeader.detSpec1, 8);
ROIxmin=croi.xmin;
ROIxmax=croi.xmax;
ROIymin=croi.ymin;
ROIymax=croi.ymax;
cout<<" ROIymin "<< ROIymin<<endl;
framesinstream++; framesinstream++;
running++; running++;
@ -143,7 +222,19 @@ int main(int argc, char* argv[])
npacket=0; npacket=0;
if (show2Ds) { if (show2Ds) {
#ifdef JFSTRX
his1000->Reset(); his1000->Reset();
his1001->Reset();
his1002->Reset();
his1060->Reset();
his1061->Reset();
his1062->Reset();
#else
his1000->Reset();
#endif
his2000->Reset(); his2000->Reset();
if (!dophotonmap) his3000->Reset(); //FOR RAW ADC DISPLAY if (!dophotonmap) his3000->Reset(); //FOR RAW ADC DISPLAY
} }
@ -187,10 +278,28 @@ int main(int argc, char* argv[])
if (fill1Ds) { if (fill1Ds) {
if (((i%1024)<1004)&&((i%1024)>20)&&((i/1024)>20)) { //skip the pix near guardring for PH plots if (((i%1024)<1004)&&((i%1024)>20)&&((i/1024)>20)) { //skip the pix near guardring for PH plots
ichip= i/(256*256*4)*4+((i/256)%4) ; ichip= i/(256*256*4)*4+((i/256)%4) ;
#ifdef JFSTRX
int new_ichip=0;
//exclude border rows of each group
if (ichip==1) {
if (i<=(1024*(64-2))) new_ichip=0; //chip 1 group 1
if (i>(1024*(64+6))&&(i<=(1024*(64*2-4)))) new_ichip=1; //chip 1 group 2
if (i>(1024*(64*2+5))) new_ichip=2; //chip 1 group 3
}
if (ichip==6) {
if (i<=(1024*(256+2*64-5))) new_ichip=7; //chip 6 group 3
if (i>(1024*(256+2*64+4))&&(i<=(1024*(256+64*3-6)))) new_ichip=6; //chip 6 group 2
if (i>(1024*(256+64*3-4))) new_ichip=5; //chip 6 group 1
}
hchip[new_ichip]->Fill(adcpedecorr,1);
#else
hchip[ichip]->Fill(adcpedecorr,1); hchip[ichip]->Fill(adcpedecorr,1);
#endif
if (((i%256)<253)&&((i%256)>2)) his4500->Fill(adcpedecorrold,adcpedecorr,1); // if (((i%256)<253)&&((i%256)>2)) his4500->Fill(adcpedecorrold,adcpedecorr,1);
adcpedecorrold=adcpedecorr; adcpedecorrold=adcpedecorr;
@ -200,33 +309,110 @@ int main(int argc, char* argv[])
if ((show2Ds)) {
factor=2.0;
value=adcpedecorr;
if ((i%256==0)||(i%256==255)) value=int(value/factor);
if ((i/1024==255)||(i/1024==256)||(i/1024==767)||(i/1024==768)) value=int(value/factor);
his1000->Fill(float(i%1024),float(int (i/1024)),value);
if (!dophotonmap) his3000->Fill(float(i%1024),float(int (i/1024)) ,adcvalue);
his2000->Fill(float(i%1024),float(int (i/1024)) ,gain);
value=(int)(hchptr[i]);
if ((i%256==0)||(i%256==255)) value=int(value/factor);
if ((i/1024==255)||(i/1024==256)||(i/1024==767)||(i/1024==768)) value=int(value/factor);
if (dophotonmap) his3000->Fill(float(i%1024),float(int (i/1024)),float(value));
}
}// for (i=0 ;i<NCH-0;i++) }// for (i=0 ;i<NCH-0;i++)
if ((show2Ds)) {
for (ipx=0;ipx<nx;ipx++){
for (ipy=0;ipy<ny;ipy++){
// for (ipx=0;ipx<nx;ipx++){
#ifdef JFSTRX
//cout<<i<< " cdcsdcvsvcsc " << group << " " << (decoder->dataMap[ipy][ipx])/2 << endl;
i=int (((decoder->dataMap[ipy][ipx])-sizeof(header)) /2);
group=(decoder->groupmap[ipy][ipx]);
// cout<<i<< " "<<ipx<<" "<<ipy<< " " << group <<endl;
#else
i=ipx+ipy*1024;
#endif
value= ((image_data[i]) & 0x3fff) -fpeded[i];
#ifndef JFSTRX
if ((i%256==0)||(i%256==255)) value=int(value/factor);
if ((i/1024==255)||(i/1024==256)||(i/1024==767)||(i/1024==768)) value=int(value/factor);
#endif
// his1000->Fill(float(ipx),float(ipy),value);
// if ((ipy>165)&&(ipy<320+165)){ his1000->Fill(float(ipx)*5/3.0,float(ipy),value);}
// else { his1000->Fill(float(ipx),float(ipy),value);}
#ifdef JFSTRX
static const int mc1g1y_start = 0;
static const int mc1g2y_start = g1_nrows;
static const int mc1g3y_start = g1_nrows+g2_nrows;
static const int mc6g3y_start = g1_nrows+g2_nrows+g3_nrows;
static const int mc6g2y_start = mc6g3y_start + g3_nrows;
static const int mc6g1y_start = mc6g3y_start + g3_nrows + g2_nrows;
if (group==0) {
if (ipy<165){
his1000->Fill(float(ipx),float(ipy-mc1g1y_start),value);}
if (ipy>=mc6g1y_start){
his1060->Fill(float(ipx),float(ipy-mc6g1y_start),value);}
}
if (group==1) {
if (ipy<(165+320)){
his1001->Fill(float(ipx),float(ipy-mc1g2y_start),value);}
if ( (ipy>=mc6g2y_start) && (ipy<mc6g1y_start) ){his4500->Fill(value,oldvalue,1.0);
oldvalue=value;
his1061->Fill(float(ipx),float(ipy-mc6g2y_start),value);}
}
if (group==2) {
if (ipy<(165+320+476))
his1002->Fill(float(ipx),float(ipy-mc1g3y_start),value);
if ( (ipy>=mc6g3y_start) && (ipy<mc6g2y_start) )
his1062->Fill(float(ipx),float(ipy-mc6g3y_start),value);
}
#else
his1000->Fill(float(ipx),float(ipy),value);
#endif
his2000->Fill(float(ipx),float(ipy) ,gain);
// if (!dophotonmap)his3000->Fill(float(ipx),float(ipy) ,value);
// value=(int)(hchptr[i]);
// if (dophotonmap) his3000->Fill(float(ipx),float(ipy),float(value));
}// for ipx
} //for ipy
for (ipx=0;ipx<1024;ipx++){
for (ipy=0;ipy<512;ipy++){
i=ipx+ipy*1024;
value= ((image_data[i]) & 0x3fff) -fpeded[i];
if (!dophotonmap)his3000->Fill(float(ipx),float(ipy) ,value);
value=(int)(hchptr[i]);
if (dophotonmap) his3000->Fill(float(ipx),float(ipy),float(value));
}
}
}// endo of show2d
}// /end of do something }// /end of do something
if ((show2Ds)) { if ((show2Ds)) {
for (ipx=0;ipx<NCH;ipx++) hchptr[(ipx)]=0; for (i=0;i<NCH;i++) hchptr[(i)]=0;
@ -419,10 +605,31 @@ void SetRanges() {
void axisreset(){ void axisreset(){
fixranges=false; fixranges=false;
#ifdef JFSTRX
his1000->GetXaxis()->UnZoom();
his1000->GetYaxis()->UnZoom();
his1000->GetZaxis()->UnZoom();
his1001->GetXaxis()->UnZoom();
his1001->GetYaxis()->UnZoom();
his1001->GetZaxis()->UnZoom();
his1002->GetXaxis()->UnZoom();
his1002->GetYaxis()->UnZoom();
his1002->GetZaxis()->UnZoom();
his1060->GetXaxis()->UnZoom();
his1060->GetYaxis()->UnZoom();
his1060->GetZaxis()->UnZoom();
his1061->GetXaxis()->UnZoom();
his1061->GetYaxis()->UnZoom();
his1061->GetZaxis()->UnZoom();
his1062->GetXaxis()->UnZoom();
his1062->GetYaxis()->UnZoom();
his1062->GetZaxis()->UnZoom();
#else
his1000->GetXaxis()->UnZoom(); his1000->GetXaxis()->UnZoom();
his1000->GetYaxis()->UnZoom(); his1000->GetYaxis()->UnZoom();
his1000->GetZaxis()->UnZoom(); his1000->GetZaxis()->UnZoom();
#endif
his2000->GetXaxis()->UnZoom(); his2000->GetXaxis()->UnZoom();
his2000->GetYaxis()->UnZoom(); his2000->GetYaxis()->UnZoom();
@ -540,7 +747,6 @@ void Plot1DHistos(void){
void Plot2DHistos(void){ void Plot2DHistos(void){
gStyle->SetOptStat(0); gStyle->SetOptStat(0);
A3->cd();
// if (bw_flag) LoadPaletteBW(1.0); // if (bw_flag) LoadPaletteBW(1.0);
@ -553,8 +759,24 @@ void Plot2DHistos(void){
} }
his1000->SetMinimum(-200); his1000->SetMinimum(-200);
his1000->Draw();
#ifdef JFSTRX
p5->cd();
his1000->Draw("colz");
p3->cd();
his1001->Draw("colz");
p1->cd();
his1002->Draw("colz");
p2->cd();
his1060->Draw("colz");
p4->cd();
his1061->Draw("colz");
p6->cd();
his1062->Draw("colz");
#else
A3->cd();
his1000->Draw("colz");
#endif
A3->Update(); A3->Update();
A2->cd(); A2->cd();
// if (bw_flag) LoadPaletteFalse(); // if (bw_flag) LoadPaletteFalse();
@ -565,9 +787,16 @@ void Plot2DHistos(void){
A2->Update(); A2->Update();
A5->cd(); A5->cd();
his3000->GetXaxis()->SetRange(his1000->GetXaxis()->GetFirst(),his1000->GetXaxis()->GetLast()); //his3000->GetXaxis()->SetRange(his1000->GetXaxis()->GetFirst(),his1000->GetXaxis()->GetLast());
his3000->GetYaxis()->SetRange(his1000->GetYaxis()->GetFirst(),his1000->GetYaxis()->GetLast()); //his3000->GetYaxis()->SetRange(his1000->GetYaxis()->GetFirst(),his1000->GetYaxis()->GetLast());
his3000->Draw("colz"); his3000->Draw("colz");
box = new TBox(ROIxmin,ROIymin,ROIxmax,ROIymax);
box->SetLineColor(kRed);
box->SetFillStyle(0);
box->SetLineWidth(2);
box->Draw();
A5->Update(); A5->Update();
A6->cd(); A6->cd();

View File

@ -56,6 +56,7 @@ using namespace sls;
#include "TMath.h" #include "TMath.h"
#include "TFile.h" #include "TFile.h"
#include "TStyle.h" #include "TStyle.h"
#include "TBox.h"
#include "TSystem.h" #include "TSystem.h"
#include "TTimer.h" #include "TTimer.h"
#include "TProfile.h" #include "TProfile.h"
@ -81,7 +82,7 @@ using namespace sls;
#define OFFSET 0 #define OFFSET 0
#define NBIN 500 #define NBIN 500
#define MIN_POS -500.5 // 400.5 #define MIN_POS -500.5 // 400.5
#define MAX_POS 3499.5 //-100.5 #define MAX_POS 8499.5 //-100.5
#define NCH 524288 #define NCH 524288
@ -92,7 +93,7 @@ int portnum;
FILE * sfilefd; FILE * sfilefd;
short* hchptr; // photon counted map "histogram" short* hchptr; // photon counted map "histogram"
int value; int value,oldvalue;
float factor=1.84; float factor=1.84;
int npacket=0; int npacket=0;
int totalnpacket=0; int totalnpacket=0;
@ -105,6 +106,7 @@ struct hostent *server;
int i=0; int i=0;
int ipx=0; int ipx=0;
int ipy=0;
bool haveconnection; bool haveconnection;
@ -112,6 +114,12 @@ TStyle *gStyle;
TApplication* rootapp; TApplication* rootapp;
TCanvas *A2; TCanvas *A2;
TCanvas *A3; TCanvas *A3;
TPad *p1;
TPad *p2;
TPad *p3;
TPad *p4;
TPad *p5;
TPad *p6;
TCanvas *A4; TCanvas *A4;
TCanvas *A5; TCanvas *A5;
TCanvas *A6; TCanvas *A6;
@ -139,6 +147,18 @@ bool fill1Ds;
bool pede_flag; bool pede_flag;
bool dophotonmap; bool dophotonmap;
typedef struct {
uint16_t xmin;
uint16_t xmax;
uint16_t ymin;
uint16_t ymax;
} receriverRoi_compact;
receriverRoi_compact croi;
TBox *box;
uint16_t ROIxmin;
uint16_t ROIxmax;
uint16_t ROIymin;
uint16_t ROIymax;
int nx, ny; int nx, ny;
int nframes; int nframes;
int goout; int goout;
@ -154,7 +174,8 @@ int frameIndex_old;
char pedefilename[128]; char pedefilename[128];
int framenum,bunchid; int framenum,bunchid;
TH2F* his1000; TH2F* his1000;TH2F* his1001;TH2F* his1002;
TH2F* his1060;TH2F* his1061;TH2F* his1062;
TH2F* his2000; TH2F* his2000;
TH2F* his3000; TH2F* his3000;
TH2F* his4500; TH2F* his4500;