some changes for JF with LGADs

This commit is contained in:
2022-10-24 12:09:52 +02:00
456 changed files with 69875 additions and 8471 deletions

View File

@@ -0,0 +1,355 @@
// SPDX-License-Identifier: LGPL-3.0-or-other
// Copyright (C) 2021 Contributors to the SLS Detector Package
#ifndef JUNGFRAULGADSTRIXELDATA_H
#define JUNGFRAULGADSTRIXELDATA_H
#include "sls/sls_detector_defs.h"
#include "slsDetectorData.h"
/*
/afs/psi.ch/project/mythen/Anna/slsDetectorPackageDeveloperMpc2011/slsDetectorCalibration/jungfrauExecutables
make -f Makefile.rawdataprocess jungfrauRawDataProcessStrx
../dataStructures/jungfrauLGADStrixelsData.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
*/
typedef struct {
uint64_t bunchNumber; /**< is the frame number */
uint64_t pre; /**< something */
} jf_header;
using namespace std;
class jungfrauLGADStrixelsData : public slsDetectorData<uint16_t> {
private:
int iframe;
using header = sls::defs::sls_receiver_header;
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
*/
jungfrauLGADStrixelsData()
: slsDetectorData<uint16_t>(1024/5, 512*5,
512 * 1024 * 2 + sizeof(header)) {
cout << "aaa" << endl;
for (int ix = 0; ix < 1024/5; ix++) {
for (int iy = 0; iy < 512*5; iy++) {
dataMap[iy][ix] = sizeof(header);//+ ( 1024 * 5 + 300) * 2; //somewhere on the guardring of the LGAD
#ifdef HIGHZ
dataMask[iy][ix] = 0x3fff;
#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=0;
cout << "G0" << endl;
//chip1
for (int ipx=x0; ipx<x1; ipx++) {
for (int ipy=y0; ipy<y0+54; ipy++) {
ix=(ipx-x0+ox)/3;
iy=(ipx-x0+ox)%3+(ipy-y0+oy)*3+ooy;
dataMap[iy][ix] = sizeof(header) + (1024 * ipy + ipx) * 2;
// cout << ipx << " " << ipy << " " << ix << " " << iy << endl;
}
}
cout << "G1" << endl;
oy=-54;
ooy=54*3;
ox=3;
for (int ipx=x0; ipx<x1; ipx++) {
for (int ipy=y0+54; ipy<y0+64+54; ipy++) {
ix=(ipx-x0+ox)/5;
iy=(ipx-x0+ox)%5+(ipy-y0+oy)*5+ooy;
dataMap[iy][ix] = sizeof(header) + (1024 * ipy + ipx) * 2;
}
}
cout << "G2" << endl;
oy=-54-64;
ooy=54*3+64*5;
ox=3;
for (int ipx=x0; ipx<x1; ipx++) {
for (int ipy=y0+64+54; ipy<y0+64*2+54*2; ipy++) {
ix=(ipx-x0+ox)/4;
iy=(ipx-x0+ox)%4+(ipy-y0+oy)*4+ooy;
dataMap[iy][ix] = sizeof(header) + (1024 * ipy + ipx) * 2;
}
}
//chip 6
x0=256*2+10;
y0=256+10;
x1=256*2+246;
ooy=256*5;
oy=0;
ox=1;
cout << "G0" << endl;
for (int ipx=x0; ipx<x1; ipx++) {
for (int ipy=y0; ipy<y0+54+64; ipy++) {
ix=(ipx-x0+ox)/4;
iy=(ipx-x0+ox)%4+(ipy-y0+oy)*4+ooy;
dataMap[iy][ix] = sizeof(header) + (1024 * ipy + ipx) * 2;
if (ipx==x0)
cout << ipx << " " << ipy << " " << ix << " " << iy << endl;
}
}
cout << "G1" << endl;
oy=-54-64;
ooy+=(54+64)*4;
ox=1;
for (int ipx=x0; ipx<x1; ipx++) {
for (int ipy=y0+54+64; ipy<y0+64*2+54; ipy++) {
ix=(ipx-x0+ox)/5;
iy=(ipx-x0+ox)%5+(ipy-y0+oy)*5+ooy;
dataMap[iy][ix] = sizeof(header) + (1024 * ipy + ipx) * 2;
}
}
cout << "G2" << endl;
oy=-54-64*2;
ooy+=64*5;
ox=1;
for (int ipx=x0; ipx<x1; ipx++) {
for (int ipy=y0+64*2+54; ipy<y0+64*2+54*2; ipy++) {
ix=(ipx-x0+ox)/3;
iy=(ipx-x0+ox)%3+(ipy-y0+oy)*3+ooy;
dataMap[iy][ix] = sizeof(header) + (1024 * ipy + ipx) * 2;
}
}
iframe = 0;
// cout << "data struct created" << 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;
};
/* virtual void calcGhost(char *data, int ix, int iy) { */
/* double val=0; */
/* ghost[iy][ix]=0; */
/* } */
/* 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) { */
/* return 0; */
/* }; */
/**
Returns the frame number for the given dataset. Purely virtual func.
\param buff pointer to the dataset
\returns frame number
*/
/* class jfrau_packet_header_t { */
/* public: */
/* unsigned char reserved[4]; */
/* unsigned char packetNumber[1]; */
/* unsigned char frameNumber[3]; */
/* unsigned char bunchid[8]; */
/* }; */
int getFrameNumber(char *buff) {
return ((header *)buff)->detHeader.frameNumber;
}
/**
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) {
return ((header *)buff)->detHeader.packetNumber;
}
/* int getFrameNumber(char *buff) { */
/* // return ((jf_header *)buff)->bunchNumber; */
/* }; */
/* /\** */
/* 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) { */
/* return 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 */
/* */
/* 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 << "-" << endl; */
/* return (char*)afifo_cont; */
/* } else { */
/* delete [] afifo_cont; */
/* return NULL; */
/* } */
/* } */
/* return NULL; */
/* }; */
char *readNextFrame(ifstream &filebin) {
int ff = -1, np = -1;
return readNextFrame(filebin, ff, np);
};
char *readNextFrame(ifstream &filebin, int &ff) {
int np = -1;
return readNextFrame(filebin, ff, np);
};
char *readNextFrame(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(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

@@ -152,6 +152,41 @@ class moench04CtbReceiver10GbData : public slsDetectorData<uint16_t> {
// cout << "data struct created" << endl;
};
int getGain(char *data, int x, int y) {
int aoff=aSamples*2*32;
int irow;
int isc = x / sc_width;
int icol = x % sc_width;
if (y < 200)
irow = sc_height - 1 - y;
else {
irow = y - sc_height;
isc++;
}
int ibit[32] = {-1, -1, -1, -1, -1, -1, 1, 3, 5, 7, -1,
-1, -1, -1, -1, -1, 62, 60, 58, 56, 54, 52,
50, 48, 63, 61, 59, 57, 55, 53, 51, 49};
int isample = irow * sc_width + icol;
uint64_t sample;
char *ptr;
if (isc < 0 || isc >= 32)
return 0;
if (ibit[isc] < 0 || ibit[isc] >= 64)
return 0;
if (dSamples > isample) {
ptr = sizeof(sls_detector_header) + data + 32 * (isample + 1) + 8 * isample;
sample = *((uint64_t *)ptr);
// cout << isc << " " << ibit[isc] << " " << isample << hex <<
// sample << dec << endl;
if (sample & (1 << ibit[isc]))
return 1;
else
return 0;
} else
return 0;
}
/**
Returns the frame number for the given dataset. Purely virtual func.

View File

@@ -5,6 +5,8 @@
#include "slsDetectorData.h"
#include "sls/sls_detector_defs.h"
#define CTB
using namespace std;
class moench04CtbZmq10GbData : public slsDetectorData<uint16_t> {
@@ -17,6 +19,9 @@ class moench04CtbZmq10GbData : public slsDetectorData<uint16_t> {
const int dSamples;
int off;
// Single point of definition if we need to customize
using header = sls::defs::sls_receiver_header;
public:
/**
Implements the slsReceiverData structure for the moench02 prototype read
@@ -28,7 +33,7 @@ class moench04CtbZmq10GbData : public slsDetectorData<uint16_t> {
// slsDetectorData<uint16_t>(400, 400, nas*2*32+nds*8), aSamples(nas),
// dSamples(nds), nadc(32), sc_width(25), sc_height(200) {
moench04CtbZmq10GbData(int nas = 5000, int nds = 0)
moench04CtbZmq10GbData(int nas = 5000, int nds = 0, int oo = 2 * 2)
: slsDetectorData<uint16_t>(400, 400,
#ifdef RAWDATA
sizeof(slsDetectorDefs::sls_receiver_header) +
@@ -36,7 +41,7 @@ class moench04CtbZmq10GbData : public slsDetectorData<uint16_t> {
((nas > 0) && (nds > 0)
? max(nas, nds) * (32 * 2 + 8)
: nas * 32 * 2 + nds * 8)),
nadc(32), sc_width(25), sc_height(200), aSamples(nas), dSamples(nds) {
nadc(32), sc_width(25), sc_height(200), aSamples(nas), dSamples(nds), off(oo) {
#ifdef RAWDATA
off=sizeof(slsDetectorDefs::sls_receiver_header);
#endif
@@ -108,6 +113,7 @@ class moench04CtbZmq10GbData : public slsDetectorData<uint16_t> {
int getGain(char *data, int x, int y) {
// int aoff=aSamples*2*32;
int aoff=off+aSamples*2*32;
int irow;
int isc = x / sc_width;
int icol = x % sc_width;
@@ -129,7 +135,8 @@ class moench04CtbZmq10GbData : public slsDetectorData<uint16_t> {
if (ibit[isc] < 0 || ibit[isc] >= 64)
return 0;
if (dSamples > isample) {
ptr = data + 32 * (isample + 1) + 8 * isample;
ptr = data + aoff + 8 * isample;
// ptr = data + 32 * (isample + 1) + 8 * isample;
sample = *((uint64_t *)ptr);
// cout << isc << " " << ibit[isc] << " " << isample << hex <<
// sample << dec << endl;

View File

@@ -22,6 +22,10 @@ jungfrauClusterFinderHighZ: jungfrauClusterFinder.cpp $(INCS) clean
g++ -o jungfrauClusterFinderHighZ jungfrauClusterFinder.cpp $(LDFLAG) $(INCDIR) $(LIBHDF5) $(LIBRARYCBF) -DSAVE_ALL -DHIGHZ
jungfrauClusterFinderStrx: jungfrauClusterFinder.cpp $(INCS) clean
g++ -o jungfrauClusterFinderStrx jungfrauClusterFinder.cpp $(LDFLAG) $(INCDIR) $(LIBHDF5) $(LIBRARYCBF) -DSAVE_ALL -DJFSTRX
jungfrauMakeEta: jungfrauInterpolation.cpp $(INCS) clean

View File

@@ -4,7 +4,12 @@
#include <iostream>
//#include "moench03T1ZmqData.h"
#ifndef JFSTRX
#include "jungfrauHighZSingleChipData.h"
#endif
#ifdef JFSTRX
#include "jungfrauLGADStrixelsData.h"
#endif
#include "multiThreadedAnalogDetector.h"
#include "singlePhotonDetector.h"
@@ -38,8 +43,13 @@ int main(int argc, char *argv[]) {
int ndark = 100;
int ok;
int iprog = 0;
#ifndef JFSTRX
jungfrauHighZSingleChipData *decoder = new jungfrauHighZSingleChipData();
#endif
#ifdef JFSTRX
cout << "bbb" << endl;
jungfrauLGADStrixelsData *decoder = new jungfrauLGADStrixelsData();
#endif
decoder->getDetectorSize(nx, ny);
cout << "nx " << nx << " ny " << ny << endl;
@@ -97,7 +107,7 @@ int main(int argc, char *argv[]) {
for (int irun = runmin; irun < runmax; irun++) {
sprintf(fn, fformat, irun);
sprintf(fname, "%s/%s.raw", indir, fn);
sprintf(fname, "%s/%s.dat", indir, fn);
sprintf(outfname, "%s/%s.clust", outdir, fn);
sprintf(imgfname, "%s/%s.tiff", outdir, fn);
std::time(&end_time);

View File

@@ -21,9 +21,9 @@ class commonModeSubtractionColumn : public commonModeSubtraction {
nCm[iroi]++;
if (nCm[iroi] > rows)
std::cout << "Too many pixels added " << nCm[iroi] << std::endl;
/* if (ix==10 && iy<20) */
/* cout << " ** "<<val << " " << mean[iroi] << " " <<
* nCm[iroi] << " " << getCommonMode(ix, iy) << endl; */
/* if (ix==10 && iy==20) */
/* std::cout << " ** "<<val << " " << mean[iroi] << " " << */
/* nCm[iroi] << " " << getCommonMode(ix, iy) << std::endl; */
}
}
};
@@ -36,6 +36,40 @@ class commonModeSubtractionColumn : public commonModeSubtraction {
int rows;
};
class commonModeSubtractionRow : public commonModeSubtraction {
public:
commonModeSubtractionRow(int nc = 400)
: commonModeSubtraction(200), cols(nc){};
virtual int getROI(int ix, int iy) {
if (iy/200<1) return 199-iy%200;
else return iy%200;
}
virtual void addToCommonMode(double val, int ix = 0, int iy = 0) {
if (ix < cols || ix > 399 - cols) {
int iroi = getROI(ix, iy);
// cout << iy << " " << ix << " " << iroi ;
if (iroi >= 0 && iroi < nROI) {
mean[iroi] += val;
mean2[iroi] += val * val;
nCm[iroi]++;
if (nCm[iroi] > 4*cols)
std::cout << "Too many pixels added " << nCm[iroi] << std::endl;
/* if (ix==10 && iy==20) */
/* std::cout << " ** "<<val << " " << mean[iroi] << " " << */
/* nCm[iroi] << " " << getCommonMode(ix, iy) << std::endl; */
}
}
};
virtual commonModeSubtractionRow *Clone() {
return new commonModeSubtractionRow(this->cols);
};
private:
int cols;
};
class commonModeSubtractionSuperColumn : public commonModeSubtraction {
public:
commonModeSubtractionSuperColumn() : commonModeSubtraction(32){};
@@ -51,14 +85,15 @@ class commonModeSubtractionHalf : public commonModeSubtraction {
};
};
class moench03CommonMode : public commonModeSubtractionColumn {
class moench03CommonMode : public commonModeSubtractionRow {
/** @short class to calculate the common mode noise for moench02 i.e. on 4
* supercolumns separately */
public:
/** constructor - initalizes a commonModeSubtraction with 4 different
regions of interest \param nn number of samples for the moving average
*/
moench03CommonMode(int nr = 20) : commonModeSubtractionColumn(nr){};
//moench03CommonMode(int nr = 20) : commonModeSubtractionColumn(nr){};
moench03CommonMode(int nr = 20) : commonModeSubtractionRow(nr){};
};
#endif

View File

@@ -2,11 +2,12 @@
// Copyright (C) 2021 Contributors to the SLS Detector Package
//#include "sls/ansi.h"
#include <iostream>
//#define CORR
#undef CORR
#define C_GHOST 0.0004
#define C_GHOST 0 //0.0004
#define CM_ROWS 50
#define CM_ROWS 20
#define RAWDATA
@@ -164,8 +165,8 @@ int main(int argc, char *argv[]) {
cout << "Applying common mode " << ncol_cm << endl;
cm = new moench03CommonMode(ncol_cm);
cout << "Applying ghost corrections " << xt_ghost << endl;
gs = new moench03GhostSummation(decoder, xt_ghost);
// cout << "Applying ghost corrections " << xt_ghost << endl;
// gs = new moench03GhostSummation(decoder, xt_ghost);
#endif
singlePhotonDetector *filter = new singlePhotonDetector(
@@ -222,15 +223,20 @@ int main(int argc, char *argv[]) {
// cout << "mt " << endl;
int ifr = 0;
char froot[1000];
double *ped=new double[nx * ny];//, *ped1;
int pos,pos1;
if (pedfile) {
if (string(pedfile).find(".raw") != std::string::npos) {
pos1=string(pedfile).rfind("/");
strcpy(froot,pedfile+pos1);
pos=string(froot).find(".raw");
froot[pos]='\0';
}
cout << "PEDESTAL " << endl;
sprintf(imgfname, "%s/pedestals.tiff", outdir);
if (string(pedfile).find(".tif") == std::string::npos) {
cout << "PEDESTAL " << endl;
if (string(pedfile).find(".tif") == std::string::npos) {
sprintf(fname, "%s", pedfile);
cout << fname << endl;
std::time(&end_time);
@@ -259,6 +265,10 @@ int main(int argc, char *argv[]) {
;
}
sprintf(imgfname, "%s/%s_ped.tiff", outdir,froot);
mt->writePedestal(imgfname);
sprintf(imgfname, "%s/%s_var.tiff", outdir,froot);
mt->writePedestalRMS(imgfname);
} else
cout << "Could not open pedestal file " << fname
<< " for reading " << endl;
@@ -276,7 +286,6 @@ int main(int argc, char *argv[]) {
<< " for reading " << endl;
}
}
mt->writePedestal(imgfname);
std::time(&end_time);
cout << std::ctime(&end_time) << endl;
}

View File

@@ -88,7 +88,7 @@ int main(int argc, char *argv[]) {
char *socketip2 = 0;
uint32_t portnum2 = 0;
zmqHeader zHeader, outHeader;
sls::zmqHeader zHeader, outHeader;
zHeader.jsonversion = SLS_DETECTOR_JSON_HEADER_VERSION;
outHeader.jsonversion = SLS_DETECTOR_JSON_HEADER_VERSION;
@@ -219,14 +219,14 @@ int main(int argc, char *argv[]) {
mt->StartThreads();
mt->popFree(buff);
ZmqSocket *zmqsocket = NULL;
sls::ZmqSocket *zmqsocket = NULL;
#ifdef NEWZMQ
// receive socket
try {
#endif
zmqsocket = new ZmqSocket(socketip, portnum);
zmqsocket = new sls::ZmqSocket(socketip, portnum);
#ifdef NEWZMQ
} catch (...) {
@@ -256,14 +256,14 @@ int main(int argc, char *argv[]) {
printf("Zmq Client at %s\n", zmqsocket->GetZmqServerAddress().c_str());
// send socket
ZmqSocket *zmqsocket2 = 0;
sls::ZmqSocket *zmqsocket2 = 0;
// cout << "zmq2 " << endl;
if (send) {
#ifdef NEWZMQ
// receive socket
try {
#endif
zmqsocket2 = new ZmqSocket(portnum2, socketip2);
zmqsocket2 = new sls::ZmqSocket(portnum2, socketip2);
#ifdef NEWZMQ
} catch (...) {

View File

@@ -229,7 +229,7 @@ class singlePhotonDetector : public analogDetector<uint16_t> {
double *rest = new double[ny * nx];
newFrame(data);
if (cmSub) {
cout << "add to common mode?" << endl;
//cout << "add to common mode?" << endl;
addToCommonMode(data);
}
for (iy = ymin; iy < ymax; ++iy) {
@@ -386,7 +386,7 @@ class singlePhotonDetector : public analogDetector<uint16_t> {
// double quadTot;
// quadrant quad;
double rms;
// if (cmSub) cm=1;
if (ph == NULL)
ph = image;