mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2026-01-17 22:51:30 +01:00
some changes for JF with LGADs
This commit is contained in:
355
slsDetectorCalibration/dataStructures/jungfrauLGADStrixelsData.h
Normal file
355
slsDetectorCalibration/dataStructures/jungfrauLGADStrixelsData.h
Normal 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
|
||||
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 (...) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user