mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-04-23 15:00:02 +02:00
included files for data compression, saving only hits
git-svn-id: file:///afs/psi.ch/project/sls_det_software/svn/slsDetectorSoftware@671 951219d9-93cf-4727-9268-0efd64621fa3
This commit is contained in:
parent
a86cf645ed
commit
4811001680
@ -11,7 +11,7 @@ INCLUDES?= -IcommonFiles -IslsDetector -IMySocketTCP -IusersFunctions -ImultiSls
|
|||||||
CC=g++
|
CC=g++
|
||||||
|
|
||||||
|
|
||||||
SRC_CLNT= slsDetectorAnalysis/fileIO.cpp MySocketTCP/MySocketTCP.cpp usersFunctions/usersFunctions.cpp slsDetector/slsDetectorUtils.cpp slsDetector/slsDetectorCommand.cpp slsDetectorAnalysis/angularConversion.cpp slsDetectorAnalysis/angularConversionStatic.cpp slsDetectorAnalysis/energyConversion.cpp slsDetector/slsDetectorActions.cpp slsDetectorAnalysis/postProcessing.cpp slsDetector/slsDetector.cpp multiSlsDetector/multiSlsDetector.cpp slsDetector/slsDetectorUsers.cpp slsDetectorAnalysis/postProcessingFuncs.cpp slsReceiverInterface/receiverInterface.cpp slsReceiver/slsReceiverFunctionList.cpp slsReceiver/slsReceiver_funcs.cpp slsReceiver/slsReceiverUsers.cpp
|
SRC_CLNT= slsDetectorAnalysis/fileIO.cpp MySocketTCP/MySocketTCP.cpp usersFunctions/usersFunctions.cpp slsDetector/slsDetectorUtils.cpp slsDetector/slsDetectorCommand.cpp slsDetectorAnalysis/angularConversion.cpp slsDetectorAnalysis/angularConversionStatic.cpp slsDetectorAnalysis/energyConversion.cpp slsDetector/slsDetectorActions.cpp slsDetectorAnalysis/postProcessing.cpp slsDetector/slsDetector.cpp multiSlsDetector/multiSlsDetector.cpp slsDetector/slsDetectorUsers.cpp slsDetectorAnalysis/postProcessingFuncs.cpp slsReceiverInterface/receiverInterface.cpp slsReceiver/slsReceiverFunctionList.cpp slsReceiver/slsReceiver_funcs.cpp slsReceiver/slsReceiverUsers.cpp slsDetectorAnalysis/singlePhotonFilter.cpp
|
||||||
|
|
||||||
OBJS = $(SRC_CLNT:.cpp=.o)
|
OBJS = $(SRC_CLNT:.cpp=.o)
|
||||||
|
|
||||||
|
140
slsDetectorSoftware/slsDetectorAnalysis/movingStat.h
Normal file
140
slsDetectorSoftware/slsDetectorAnalysis/movingStat.h
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
/********************************************//**
|
||||||
|
* @file movingStat.h
|
||||||
|
* @short handles pedestal data and moves accordingly
|
||||||
|
***********************************************/
|
||||||
|
#ifndef MOVINGSTAT_H
|
||||||
|
#define MOVINGSTAT_H
|
||||||
|
|
||||||
|
#include "sls_detector_defs.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <cstring>
|
||||||
|
#include <string>
|
||||||
|
#include <sstream>
|
||||||
|
#include <queue>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
/**
|
||||||
|
@short class handling pedestal data and moves according to data
|
||||||
|
*/
|
||||||
|
|
||||||
|
class movingStat{
|
||||||
|
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*/
|
||||||
|
movingStat() : n(0), m_n(0), m_oldM(0), m_newM(0), m_oldM2(0), m_newM2(0){}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear number of data values
|
||||||
|
*/
|
||||||
|
void Clear(){
|
||||||
|
m_n = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Pedestal
|
||||||
|
*/
|
||||||
|
void SetN(int i) {n=i;};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Pedestal
|
||||||
|
*/
|
||||||
|
int GetN() {return n;};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate Pedestal
|
||||||
|
*/
|
||||||
|
void Calc(double x) {
|
||||||
|
if (m_n<n) Add(x);
|
||||||
|
else Push(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adding Pedestal
|
||||||
|
*/
|
||||||
|
void Add(double x){
|
||||||
|
m_n++;
|
||||||
|
|
||||||
|
// See Knuth TAOCP vol 2, 3rd edition, page 232
|
||||||
|
if (m_n == 1){
|
||||||
|
m_oldM = m_newM = x;
|
||||||
|
m_oldM2 = x*x;
|
||||||
|
}else{
|
||||||
|
m_newM = m_oldM + x;
|
||||||
|
m_newM2 = m_oldM2 + x*x;
|
||||||
|
//m_newM2 = m_oldM2 + (x*x - m_oldM*m_oldM)/m_n;
|
||||||
|
// set up for next iteration
|
||||||
|
m_oldM = m_newM;
|
||||||
|
m_oldM2 = m_newM2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Push Pedestal
|
||||||
|
*/
|
||||||
|
void Push(double x){
|
||||||
|
if (m_n == 1){
|
||||||
|
m_oldM = m_newM = x;
|
||||||
|
m_oldM2 = x*x;
|
||||||
|
}else{
|
||||||
|
m_newM = m_oldM + (x - m_oldM/m_n);
|
||||||
|
m_newM2 = m_oldM2 + (x*x - m_oldM2/m_n);
|
||||||
|
//m_newM2 = m_oldM2 + (x*x/m_n - m_oldM*m_oldM/(m_n*m_n));
|
||||||
|
// set up for next iteration
|
||||||
|
m_oldM = m_newM;
|
||||||
|
m_oldM2 = m_newM2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get number of data values
|
||||||
|
*/
|
||||||
|
int NumDataValues() const{
|
||||||
|
return m_n;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get mean
|
||||||
|
*/
|
||||||
|
double Mean() const{
|
||||||
|
return (m_n > 0) ? m_newM/m_n : 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get mean 2
|
||||||
|
*/
|
||||||
|
double M2() const{
|
||||||
|
return ( (m_n > 1) ? m_newM2/m_n : 0.0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get variance
|
||||||
|
*/
|
||||||
|
double Variance() const{
|
||||||
|
return ( (m_n > 1) ? (M2()-Mean()*Mean()) : 0.0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get standard deviation
|
||||||
|
*/
|
||||||
|
double StandardDeviation() const{
|
||||||
|
return ( (Variance() > 0) ? sqrt( Variance() ) : -1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
/** pedestal */
|
||||||
|
int n;
|
||||||
|
/** number of data values */
|
||||||
|
int m_n;
|
||||||
|
|
||||||
|
/** old and new mean */
|
||||||
|
double m_oldM, m_newM, m_oldM2, m_newM2;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
89
slsDetectorSoftware/slsDetectorAnalysis/runningStat.h
Normal file
89
slsDetectorSoftware/slsDetectorAnalysis/runningStat.h
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
/********************************************//**
|
||||||
|
* @file runningStat.h
|
||||||
|
* @short handles pedestal data and doesnt move
|
||||||
|
***********************************************/
|
||||||
|
#ifndef RUNNINGSTAT_H
|
||||||
|
#define RUNNINGSTAT_H
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "sls_detector_defs.h"
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@short class handling pedestal data that is static
|
||||||
|
*/
|
||||||
|
|
||||||
|
class runningStat{
|
||||||
|
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*/
|
||||||
|
runningStat() : m_n(0),m_oldM(0),m_newM(0),m_oldS(0),m_newS(0) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear number of data values
|
||||||
|
*/
|
||||||
|
void Clear(){
|
||||||
|
m_n = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Push Pedestal
|
||||||
|
*/
|
||||||
|
void Push(double x){
|
||||||
|
m_n++;
|
||||||
|
|
||||||
|
// See Knuth TAOCP vol 2, 3rd edition, page 232
|
||||||
|
if (m_n == 1){
|
||||||
|
m_oldM = m_newM = x;
|
||||||
|
m_oldS = 0.0;
|
||||||
|
}else{
|
||||||
|
m_newM = m_oldM + (x - m_oldM)/m_n;
|
||||||
|
m_newS = m_oldS + (x - m_oldM)*(x - m_newM);
|
||||||
|
|
||||||
|
// set up for next iteration
|
||||||
|
m_oldM = m_newM;
|
||||||
|
m_oldS = m_newS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get number of data values
|
||||||
|
*/
|
||||||
|
int NumDataValues() const{
|
||||||
|
return m_n;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get mean
|
||||||
|
*/
|
||||||
|
double Mean() const{
|
||||||
|
return (m_n > 0) ? m_newM : 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get variance
|
||||||
|
*/
|
||||||
|
double Variance() const{
|
||||||
|
return ( (m_n > 1) ? m_newS/(m_n - 1) : 0.0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get standard deviation
|
||||||
|
*/
|
||||||
|
double StandardDeviation() const{
|
||||||
|
return sqrt( Variance() );
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
/** number of data values */
|
||||||
|
int m_n;
|
||||||
|
|
||||||
|
/** old and new mean */
|
||||||
|
double m_oldM, m_newM, m_oldS, m_newS;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
544
slsDetectorSoftware/slsDetectorAnalysis/singlePhotonFilter.cpp
Normal file
544
slsDetectorSoftware/slsDetectorAnalysis/singlePhotonFilter.cpp
Normal file
@ -0,0 +1,544 @@
|
|||||||
|
/********************************************//**
|
||||||
|
* @file singlePhotonFilter.cpp
|
||||||
|
* @short single photon filter using trees
|
||||||
|
***********************************************/
|
||||||
|
#include "singlePhotonFilter.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*#define MOENCH_FRAME_INDEX_MASK 0xFFFFFF00
|
||||||
|
#define MOENCH_PACKET_INDEX_MASK 0xFF
|
||||||
|
#define MOENCH_FRAME_INDEX_OFFSET 8
|
||||||
|
*/
|
||||||
|
|
||||||
|
singlePhotonFilter::singlePhotonFilter(int x, int y, vector <vector<int16_t> >m, vector <vector<int16_t> >s, int d):
|
||||||
|
#ifdef MYROOT
|
||||||
|
myTree(NULL),
|
||||||
|
myFile(NULL),
|
||||||
|
#else
|
||||||
|
myFile(NULL),
|
||||||
|
#endif
|
||||||
|
nChannelsX(x),
|
||||||
|
nChannelsY(y),
|
||||||
|
nClusterX(CLUSTER_SIZE),
|
||||||
|
nClusterY(CLUSTER_SIZE),
|
||||||
|
map(m),
|
||||||
|
dataSize(d),
|
||||||
|
mask(s),
|
||||||
|
nped(DEFAULT_NUM_PEDESTAL),
|
||||||
|
nsigma(DEFAULT_SIGMA),
|
||||||
|
nbackground(DEFAULT_BACKGROUND),
|
||||||
|
outcorr(DEFAULT_CORRECTION),
|
||||||
|
fnum(0),
|
||||||
|
pnum(0),
|
||||||
|
ptot(0),
|
||||||
|
f0(0),
|
||||||
|
frame_index_mask(0x00000000),
|
||||||
|
packet_index_mask(0x00000000),
|
||||||
|
frame_index_offset(0),
|
||||||
|
packet_index_offset(0),
|
||||||
|
packets_per_frame(0){
|
||||||
|
|
||||||
|
|
||||||
|
if (x == 1)
|
||||||
|
nClusterX = 1;
|
||||||
|
|
||||||
|
stat.resize(x);
|
||||||
|
for(int i=0; i<x; i++)
|
||||||
|
stat[i].resize(y);
|
||||||
|
|
||||||
|
//struct
|
||||||
|
myPhotonHit.data.resize(nClusterX);
|
||||||
|
for(int i=0; i<nClusterX; i++)
|
||||||
|
myPhotonHit.data[i].resize(nClusterY);
|
||||||
|
myPhotonHit.x = 0;
|
||||||
|
myPhotonHit.y = 0;
|
||||||
|
myPhotonHit.rms = 0;
|
||||||
|
myPhotonHit.ped = 0;
|
||||||
|
myPhotonHit.iframe = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void singlePhotonFilter::initTree(char *outdir, char *fname){
|
||||||
|
//path
|
||||||
|
char outfname[MAX_STR_LENGTH];
|
||||||
|
sprintf(outfname, "%s/%s.root", outdir, fname);
|
||||||
|
|
||||||
|
#ifdef MYROOT
|
||||||
|
char c1[10],c2[10],cdata[100];
|
||||||
|
sprintf(c1,"%d",nClusterX);
|
||||||
|
sprintf(c2,"%d",nClusterY);
|
||||||
|
sprintf(cdata,"data[%s][%s]/D",c1,c2);
|
||||||
|
|
||||||
|
//file
|
||||||
|
myFile = new TFile(outfname, "RECREATE"); /** later return error if it exists */
|
||||||
|
//tree
|
||||||
|
myTree = new TTree(fname, fname);
|
||||||
|
myTree->Branch("x",&myPhotonHit.x,"x/I");
|
||||||
|
myTree->Branch("y",&myPhotonHit.y,"y/I");
|
||||||
|
myTree->Branch("data",myPhotonHit.data,cdata);
|
||||||
|
myTree->Branch("pedestal",&myPhotonHit.ped,"pedestal/D");
|
||||||
|
myTree->Branch("rms",&myPhotonHit.rms,"rms/D");
|
||||||
|
#else
|
||||||
|
myFile = fopen(outfname, "w");
|
||||||
|
#endif
|
||||||
|
//initialize
|
||||||
|
for (int ir=0; ir<nChannelsX; ir++){
|
||||||
|
for (int ic=0; ic<nChannelsY; ic++){
|
||||||
|
stat[ir][ic].Clear();
|
||||||
|
stat[ir][ic].SetN(nbackground);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int singlePhotonFilter::writeToFile(){
|
||||||
|
#ifdef MYROOT
|
||||||
|
if((myTree) && (myFile)){
|
||||||
|
myTree->Write();
|
||||||
|
|
||||||
|
myFile = myTree->GetCurrentFile();
|
||||||
|
myFile->Close();
|
||||||
|
delete myFile;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if(myFile){ /*&& (number of structs?)*/
|
||||||
|
fwrite((void*)(&myPhotonHit), 1, sizeof(myPhotonHit), myFile);
|
||||||
|
fclose(myFile);
|
||||||
|
delete myFile;
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int singlePhotonFilter::findHits(int16_t *myData, int myDataSize){
|
||||||
|
|
||||||
|
int nHits = 0;
|
||||||
|
int hits[nChannelsX][nChannelsY];
|
||||||
|
|
||||||
|
|
||||||
|
int ir,ic; // for indexing row, column
|
||||||
|
int dum;
|
||||||
|
double tot; // total value of pixel
|
||||||
|
|
||||||
|
//initialize to 0
|
||||||
|
for (ir=0; ir<nChannelsX; ir++)
|
||||||
|
for (ic=0; ic<nChannelsY;ic++)
|
||||||
|
hits[ir][ic]=0;
|
||||||
|
|
||||||
|
|
||||||
|
//for each pixel
|
||||||
|
for (ir=0; ir<160; ir++){
|
||||||
|
for (ic=0; ic<160;ic++){
|
||||||
|
|
||||||
|
//validate mapping
|
||||||
|
if ((map[ir][ic] < 0) || (map[ir][ic] >= (myDataSize))){
|
||||||
|
cout << "Bad Channel Mapping index: " << map[ir][ic] << endl;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//if frame within pedestal number
|
||||||
|
if (myPhotonHit.iframe < nped)
|
||||||
|
stat[ir][ic].Calc((double)(mask[ir][ic] ^ myData[map[ir][ic]]));
|
||||||
|
|
||||||
|
// frame outside pedestal number
|
||||||
|
else{
|
||||||
|
|
||||||
|
//if hit wasnt registered
|
||||||
|
if (hits[ir][ic] == 0){
|
||||||
|
|
||||||
|
myPhotonHit.rms = stat[ir][ic].StandardDeviation();
|
||||||
|
myPhotonHit.ped = stat[ir][ic].Mean();
|
||||||
|
|
||||||
|
dum = 1;
|
||||||
|
tot = 0;
|
||||||
|
|
||||||
|
//for 1d and 2d
|
||||||
|
int c = 1;
|
||||||
|
int d = 1;
|
||||||
|
if (nChannelsX == 1)
|
||||||
|
c = 0;
|
||||||
|
|
||||||
|
//center pixel
|
||||||
|
myPhotonHit.data[c][d] = ((double)(mask[ir][ic] ^ myData[map[ir][ic]])) - myPhotonHit.ped;
|
||||||
|
|
||||||
|
//check if neighbours are involved
|
||||||
|
for (int ih = -c; ih <= c ; ih++){
|
||||||
|
for (int iv = -d; iv <= d; iv++){
|
||||||
|
//validate neighbouring pixels (not really needed)
|
||||||
|
if (((ir+ih) >= 0) && ((ir+ih) < nChannelsX) && ((ic+iv) >= 0) && ((ic+iv) < nChannelsY)) {
|
||||||
|
//validate mapping
|
||||||
|
if ((map[ir+ih][ic+iv] < 0) || (map[ir+ih][ic+iv] >= myDataSize)){
|
||||||
|
cout << "Bad Channel Mapping index: " << map[ir][ic] << endl;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
myPhotonHit.data[iv+d][ih+c] = (double)(mask[ir][ic] ^ myData[map[ir+ih][ic+iv]])-stat[ir+ih][ic+iv].Mean();
|
||||||
|
tot += myPhotonHit.data[iv+c][ih+d];
|
||||||
|
if (myPhotonHit.data[iv+c][ih+d] > myPhotonHit.data[c][d])
|
||||||
|
dum = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (tot < CLUSTER_SIZE * nsigma * myPhotonHit.rms)
|
||||||
|
dum = 0;
|
||||||
|
|
||||||
|
if (myPhotonHit.data[c][d] < nsigma * myPhotonHit.rms && dum != 0)
|
||||||
|
dum = 3;
|
||||||
|
|
||||||
|
if (myPhotonHit.data[c][d] > -nsigma * myPhotonHit.rms &&
|
||||||
|
myPhotonHit.data[c][d] < nsigma * myPhotonHit.rms &&
|
||||||
|
dum == 0){
|
||||||
|
//Appriximated running average
|
||||||
|
stat[ir][ic].Calc((double)(mask[ir][ic]^myData[map[ir][ic]]));
|
||||||
|
}
|
||||||
|
else if (dum == 1){
|
||||||
|
myPhotonHit.x = ic;
|
||||||
|
myPhotonHit.y = ir;
|
||||||
|
#ifdef MYROOT
|
||||||
|
myTree->Fill();
|
||||||
|
#endif
|
||||||
|
hits[ir][ic] = 1;
|
||||||
|
nHits++;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (myPhotonHit.iframe%1000 == 0)
|
||||||
|
cout << "Frame: " << myPhotonHit.iframe << " Hits: " << nHits << endl;
|
||||||
|
|
||||||
|
return nHits;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
//inside the receiver
|
||||||
|
//pop fifo
|
||||||
|
|
||||||
|
int16_t myData[160*160];
|
||||||
|
if (singlePhotonFilter::verifyFrame(wbuf,rc, myData,firstTimeHere))
|
||||||
|
if(firstTimeHere){
|
||||||
|
firsttimeHere = 0;
|
||||||
|
//f0 = fnum;
|
||||||
|
}
|
||||||
|
//singlePhotonFilter:SetFrameNumber(fnum - f0); singlePhotonFilter:SetFrameNumber(int i){myPhotonHit.iframe = i;};
|
||||||
|
singlePhotonFilter.findhits(myData,1286*40);
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
void singlePhotonFilter::initialize(int fmask, int pmask, int foffset, int poffset, int pperf){
|
||||||
|
fnum = 0; pnum = 0; ptot = 0; f0 = 0;
|
||||||
|
frame_index_mask = fmask;
|
||||||
|
packet_index_mask = pmask;
|
||||||
|
frame_index_offset = foffset;
|
||||||
|
packet_index_offset = poffset;
|
||||||
|
packets_per_frame = pperf;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int singlePhotonFilter::verifyFrame(char *inData, int inDataSize, int16_t* myData, int firstTime){
|
||||||
|
int offset = 0;
|
||||||
|
int fIndex = 0;
|
||||||
|
int pIndex = 0;
|
||||||
|
|
||||||
|
|
||||||
|
while(offset < inDataSize){
|
||||||
|
fIndex = ((((int)(*((int*)inData))) & (frame_index_mask)) >> frame_index_offset);
|
||||||
|
pIndex = ((((int)(*((int*)inData))) & (packet_index_mask)) >> packet_index_offset);
|
||||||
|
|
||||||
|
offset += 4;
|
||||||
|
|
||||||
|
//check validity of packet index
|
||||||
|
if ((pIndex < 0) && (pIndex >= packets_per_frame)){
|
||||||
|
cout << "cannot decode packet index:" << pIndex << endl;
|
||||||
|
//its already dealt with cuz this frame will be discarded in the end
|
||||||
|
}
|
||||||
|
|
||||||
|
//put first packet last
|
||||||
|
if (pIndex == 0)
|
||||||
|
pIndex = packets_per_frame;
|
||||||
|
|
||||||
|
|
||||||
|
//copy packet to correct spot in outData
|
||||||
|
memcpy(((char*)(myData+(pIndex-1)*640)), (inData + offset), 1280);
|
||||||
|
offset += 1280 + 2;
|
||||||
|
|
||||||
|
//firsttime
|
||||||
|
if (firstTime){
|
||||||
|
firstTime = 0;
|
||||||
|
f0 = fIndex;
|
||||||
|
fnum = fIndex;
|
||||||
|
pnum = pIndex - 1; //should b 0 at first
|
||||||
|
ptot = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//if it is not matching withthe frame number
|
||||||
|
if (fIndex != fnum){
|
||||||
|
cout << "Missing Packet! " << fnum << " "
|
||||||
|
"Expected f" << fnum << " p " << pnum + 1 << " received f " << fnum << " p " << pIndex << endl;
|
||||||
|
fnum = fIndex;
|
||||||
|
pnum = pIndex - 1;
|
||||||
|
ptot = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//if missing a packet, discard
|
||||||
|
if (pIndex != pnum + 1){
|
||||||
|
cout << "Missing Packet! " << fnum << " "
|
||||||
|
"Expected f" << fnum << " p " << pnum + 1 << " received f " << fnum << " p " << pIndex << endl;
|
||||||
|
pnum = pIndex;
|
||||||
|
ptot = 0;/** should it be 0 or just not incrememnted */
|
||||||
|
}
|
||||||
|
//no missing packet
|
||||||
|
else{
|
||||||
|
pnum++;
|
||||||
|
ptot++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//if its the last index
|
||||||
|
if (pIndex == packets_per_frame){
|
||||||
|
//got all packets
|
||||||
|
if (ptot == packets_per_frame){
|
||||||
|
myPhotonHit.iframe = fnum - f0;/** ?? */
|
||||||
|
findHits(myData,nChannelsX*nChannelsY*2);
|
||||||
|
return 1;
|
||||||
|
}else{
|
||||||
|
cout << "* Some packets have been missed!" << fnum << endl;
|
||||||
|
ptot = 0;
|
||||||
|
pnum = 0;
|
||||||
|
fnum = fIndex + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//index not 40, but total is 40.. strange
|
||||||
|
else if (ptot == packets_per_frame){
|
||||||
|
cout << "** Some packets have been missed! " << fnum << endl;
|
||||||
|
ptot = 0;
|
||||||
|
pnum = pIndex - 1;
|
||||||
|
fnum = fIndex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delete myData;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
void singlePhotonFilter::makeRunTree(char *fformat, int runmin, int runmax, char *tname, int off) {
|
||||||
|
|
||||||
|
char buff[1286];
|
||||||
|
int *header=(int*)buff;
|
||||||
|
char *footer=buff+1284;
|
||||||
|
Short_t mydata[160*160];//=(Short_t*)(buff+4);
|
||||||
|
int pnum;
|
||||||
|
int fnum;
|
||||||
|
int ifr;
|
||||||
|
int ipa;
|
||||||
|
Double_t dd[3][3];
|
||||||
|
int ncol=colwidth*4;//=160;
|
||||||
|
int nch=nrow*ncol;
|
||||||
|
char fname[1000];
|
||||||
|
Int_t chan[160][160];
|
||||||
|
Int_t nHits=0;
|
||||||
|
char vtype[100];
|
||||||
|
int afifo_length;
|
||||||
|
ifstream filebin;
|
||||||
|
int ptot=0;
|
||||||
|
|
||||||
|
|
||||||
|
for (int irun=runmin; irun<=runmax; irun++) {
|
||||||
|
sprintf(fname,fformat,irun);
|
||||||
|
cout << "file name " << fname << " " << tall->GetEntries() << endl;
|
||||||
|
filebin.open((const char *)(fname), ios::in | ios::binary);
|
||||||
|
if (filebin.is_open()) {
|
||||||
|
while (readNextFrame(filebin, mydata, fnum)) {
|
||||||
|
//to get rid of the first frame number
|
||||||
|
if (iii==0) {
|
||||||
|
f0=fnum;
|
||||||
|
iii = 1;
|
||||||
|
}
|
||||||
|
iframe=fnum-f0;
|
||||||
|
findHits(mydata, tall);
|
||||||
|
}
|
||||||
|
if (filebin.is_open())
|
||||||
|
filebin.close();
|
||||||
|
} else
|
||||||
|
cout << "could not open file " << fname << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int readNextFrame(ifstream &filebin, int16_t *mydata, int &ifr){
|
||||||
|
|
||||||
|
char buff[1286];
|
||||||
|
int *header=(int*)buff;
|
||||||
|
char *footer=buff+1284;
|
||||||
|
// Short_t mydata[160*160];//=(Short_t*)(buff+4);
|
||||||
|
int pnum;
|
||||||
|
int fnum;
|
||||||
|
// int ifr;
|
||||||
|
int ipa;
|
||||||
|
int iii=0;
|
||||||
|
int nrow=160;
|
||||||
|
int colwidth=40;
|
||||||
|
// int nsigma=5;
|
||||||
|
int ncol=colwidth*4;//=160;
|
||||||
|
int nch=nrow*ncol;
|
||||||
|
int f0;
|
||||||
|
char fname[1000];
|
||||||
|
int ptot=0;
|
||||||
|
if (filebin.is_open()) {
|
||||||
|
while (filebin.read(buff,sizeof(4))) {
|
||||||
|
// while (filebin.read(buff,sizeof(buff))) {
|
||||||
|
pnum=(*header)&0xff;//packet num
|
||||||
|
fnum=((*header)&(0xffffff00))>>8;//frame num
|
||||||
|
if (pnum==0)
|
||||||
|
pnum=40;
|
||||||
|
filebin.read((char*)(mydata+(pnum-1)*640),1280);
|
||||||
|
filebin.read(footer,2);
|
||||||
|
if (iii==0) {
|
||||||
|
// cout << "fnum " << fnum << " pnum " << pnum << coff << endl;
|
||||||
|
ifr=fnum;
|
||||||
|
ipa=pnum-1;
|
||||||
|
f0=fnum;//not used
|
||||||
|
iii=1;
|
||||||
|
ptot=0;
|
||||||
|
}
|
||||||
|
if (fnum!=ifr) {
|
||||||
|
cout << "Missing packet! "<< ifr << " ";
|
||||||
|
cout << "Expected f " <<ifr << " p " << ipa+1 << " received f " << fnum << " p " << pnum << endl;
|
||||||
|
ifr=fnum;
|
||||||
|
ipa=pnum-1;
|
||||||
|
ptot=0;
|
||||||
|
}
|
||||||
|
if (pnum!=ipa+1) {
|
||||||
|
cout << "Missing packet! "<< ifr << " ";
|
||||||
|
cout << "Expected f " <<ifr << " p " << ipa+1 << " received f " << fnum << " p " << pnum << endl;
|
||||||
|
ipa=pnum;
|
||||||
|
ptot=0;
|
||||||
|
} else {
|
||||||
|
ipa++;
|
||||||
|
ptot++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pnum==40) {
|
||||||
|
if (ptot==40) {
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
cout << "* Some packets have been missed! " << ifr << endl;
|
||||||
|
ptot=0;
|
||||||
|
ipa=0;
|
||||||
|
ifr=fnum+1;
|
||||||
|
// return 0;
|
||||||
|
}
|
||||||
|
} else if (ptot==40) {
|
||||||
|
cout << "** Some packets have been missed! " << ifr << endl;
|
||||||
|
ptot=0;
|
||||||
|
ipa=pnum-1;
|
||||||
|
ifr=fnum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
int nch=nrow*ncol;
|
||||||
|
|
||||||
|
int f0;
|
||||||
|
|
||||||
|
char fname[1000];
|
||||||
|
|
||||||
|
int ptot=0;
|
||||||
|
|
||||||
|
if (filebin.is_open()) {
|
||||||
|
|
||||||
|
while (filebin.read(buff,sizeof(4))) {
|
||||||
|
// while (filebin.read(buff,sizeof(buff))) {
|
||||||
|
|
||||||
|
pnum=(*header)&0xff;
|
||||||
|
fnum=((*header)&(0xffffff00))>>8;
|
||||||
|
|
||||||
|
if (pnum==0)
|
||||||
|
pnum=40;
|
||||||
|
|
||||||
|
|
||||||
|
filebin.read((char*)(mydata+(pnum-1)*640),1280);
|
||||||
|
filebin.read(footer,2);
|
||||||
|
|
||||||
|
if (iii==0) {
|
||||||
|
// cout << "fnum " << fnum << " pnum " << pnum << coff << endl;
|
||||||
|
ifr=fnum;
|
||||||
|
ipa=pnum-1;
|
||||||
|
f0=fnum;
|
||||||
|
iii=1;
|
||||||
|
ptot=0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fnum!=ifr) {
|
||||||
|
cout << "Missing packet! "<< ifr << " ";
|
||||||
|
cout << "Expected f " <<ifr << " p " << ipa+1 << " received f " << fnum << " p " << pnum << endl;
|
||||||
|
ifr=fnum;
|
||||||
|
ipa=pnum-1;
|
||||||
|
ptot=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (pnum!=ipa+1) {
|
||||||
|
cout << "Missing packet! "<< ifr << " ";
|
||||||
|
cout << "Expected f " <<ifr << " p " << ipa+1 << " received f " << fnum << " p " << pnum << endl;
|
||||||
|
ipa=pnum;
|
||||||
|
ptot=0;
|
||||||
|
} else {
|
||||||
|
ipa++;
|
||||||
|
ptot++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pnum==40) {
|
||||||
|
if (ptot==40) {
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
cout << "* Some packets have been missed! " << ifr << endl;
|
||||||
|
ptot=0;
|
||||||
|
ipa=0;
|
||||||
|
ifr=fnum+1;
|
||||||
|
// return 0;
|
||||||
|
}
|
||||||
|
} else if (ptot==40) {
|
||||||
|
cout << "** Some packets have been missed! " << ifr << endl;
|
||||||
|
ptot=0;
|
||||||
|
ipa=pnum-1;
|
||||||
|
ifr=fnum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
260
slsDetectorSoftware/slsDetectorAnalysis/singlePhotonFilter.h
Normal file
260
slsDetectorSoftware/slsDetectorAnalysis/singlePhotonFilter.h
Normal file
@ -0,0 +1,260 @@
|
|||||||
|
/********************************************//**
|
||||||
|
* @file singlePhotonFilter.h
|
||||||
|
* @short single photon filter using trees
|
||||||
|
***********************************************/
|
||||||
|
#ifndef SINGLEPHOTONFILTER_H
|
||||||
|
#define SINGLEPHOTONFILTER_H
|
||||||
|
|
||||||
|
//#include "sls_detector_defs.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __CINT
|
||||||
|
#define MYROOT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef MYROOT
|
||||||
|
#include <TFile.h>
|
||||||
|
#include <TMath.h>
|
||||||
|
#include <TTree.h>
|
||||||
|
#include <TChain.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include <deque>
|
||||||
|
#include <list>
|
||||||
|
#include <queue>
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
|
||||||
|
#include "runningStat.h"
|
||||||
|
#include "movingStat.h"
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
|
typedef double double32_t;
|
||||||
|
typedef float float32_t;
|
||||||
|
typedef int int32_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
return values
|
||||||
|
*/
|
||||||
|
enum {
|
||||||
|
OK, /**< function succeeded */
|
||||||
|
FAIL /**< function failed */
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
@short structure for a single photon hit
|
||||||
|
*/
|
||||||
|
typedef struct{
|
||||||
|
vector < vector<double> > data; /**< data size */
|
||||||
|
int x; /**< x-coordinate of the center of hit */
|
||||||
|
int y; /**< x-coordinate of the center of hit */
|
||||||
|
double rms; /**< noise of central pixel */
|
||||||
|
double ped; /**< pedestal of the central pixel */
|
||||||
|
int iframe; /**< frame number */
|
||||||
|
}single_photon_hit;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@short class handling trees and its data file
|
||||||
|
*/
|
||||||
|
|
||||||
|
class singlePhotonFilter{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* @param nChannelsX Number of Channels in X direction
|
||||||
|
* @param nChannelsY Number of Channels in Y direction
|
||||||
|
* @param m Map to data without headers
|
||||||
|
* @param s mask as to which adcs are inverted
|
||||||
|
* @param d Size of data with the headers
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** why is the datasize -1, you need to know the datasize with headers so that you dont go over the limits */
|
||||||
|
singlePhotonFilter(int x, int y, vector <vector<int16_t> >m, vector <vector<int16_t> >s, int d = -1);
|
||||||
|
/*map[56][63]=656; data[map[56][63]] ^ 0x7fff*/
|
||||||
|
|
||||||
|
/** virtual destructor */
|
||||||
|
virtual ~singlePhotonFilter(){};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a tree, populate struct for the single photon hit
|
||||||
|
* @param outdir Output file directory
|
||||||
|
* @param fname Output file name
|
||||||
|
*/
|
||||||
|
void initTree(char *outdir, char *fname);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset Indices before starting acquisition and provide all the masks and offsets
|
||||||
|
* @param fmask frame index mask
|
||||||
|
* @param pmask packet index mask
|
||||||
|
* @param foffset frame index offset
|
||||||
|
* @param poffset packet index offset
|
||||||
|
* @param pperf packets per frame
|
||||||
|
*/
|
||||||
|
void initialize(int fmask, int pmask, int foffset, int poffset, int pperf);
|
||||||
|
|
||||||
|
/** Verify if all packets exist for the frame
|
||||||
|
* @param inData the data from socket to be verified
|
||||||
|
* @param inDataSize datasize of packet
|
||||||
|
* @param myData frame with all the packets
|
||||||
|
* @param firstTime the first frame received from socket
|
||||||
|
* */
|
||||||
|
int verifyFrame(char *inData, int inDataSize, int16_t* myData, int firstTime);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes tree/struct to file
|
||||||
|
* returns OK if successful, else FAIL
|
||||||
|
*/
|
||||||
|
int writeToFile();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find Hits frame by frame
|
||||||
|
* @param myData data for one frame
|
||||||
|
* @param myDataSize data size for one frame with headers
|
||||||
|
* returns number of hits
|
||||||
|
*/
|
||||||
|
int findHits(int16_t *myData, int myDataSize);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef MYROOT
|
||||||
|
/**
|
||||||
|
* returns tree
|
||||||
|
*/
|
||||||
|
TTree *getTree(){ return myTree; };
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* returns struct
|
||||||
|
*/
|
||||||
|
single_photon_hit getStructure(){ return myPhotonHit; };
|
||||||
|
|
||||||
|
/** Set number of frames to calculate pedestal at beginning */
|
||||||
|
void setNPed(int n){ nped = n; };
|
||||||
|
|
||||||
|
/** Get number of frames to calculate pedestal at beginning */
|
||||||
|
int getNPed(){return nped;};
|
||||||
|
|
||||||
|
/** Set Distance from pedestal to detect a hit */
|
||||||
|
void setNSigma(int n){ nsigma = n; };
|
||||||
|
|
||||||
|
/** Get Distance from pedestal to detect a hit */
|
||||||
|
int getNSigma(){return nsigma;};
|
||||||
|
|
||||||
|
/** Set background */
|
||||||
|
void setNBackground(int n){ nbackground = n; };
|
||||||
|
|
||||||
|
/** Get background */
|
||||||
|
int getNBackground(){return nbackground;};
|
||||||
|
|
||||||
|
/** Set correction */
|
||||||
|
void setOutCorr(double d){ outcorr = d; };
|
||||||
|
|
||||||
|
/** Get correction */
|
||||||
|
double getOutCorr(){return outcorr;};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
#ifdef MYROOT
|
||||||
|
/** Tree where the hits are stored */
|
||||||
|
TTree *myTree;
|
||||||
|
|
||||||
|
/** File where the tree is saved */
|
||||||
|
TFile *myFile;
|
||||||
|
#else
|
||||||
|
FILE *myFile;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Number of Channels in X direction */
|
||||||
|
int nChannelsX;
|
||||||
|
|
||||||
|
/** Number of Channels in Y direction */
|
||||||
|
int nChannelsY;
|
||||||
|
|
||||||
|
/** Cluster size in X direction */
|
||||||
|
int nClusterX;
|
||||||
|
|
||||||
|
/** Cluster size in Y direction */
|
||||||
|
int nClusterY;
|
||||||
|
|
||||||
|
/** map to the data without headers */
|
||||||
|
vector <vector<int16_t> >map;
|
||||||
|
|
||||||
|
/** Size of data with headers */
|
||||||
|
int dataSize;
|
||||||
|
|
||||||
|
/** mask as to which adcs are inverted */
|
||||||
|
vector <vector<int16_t> >mask;
|
||||||
|
|
||||||
|
/** movingStat object */
|
||||||
|
vector <vector<movingStat> > stat;
|
||||||
|
|
||||||
|
/** single Photon Hit structure */
|
||||||
|
single_photon_hit myPhotonHit;
|
||||||
|
|
||||||
|
/** Cluster size */
|
||||||
|
const static int CLUSTER_SIZE = 3;
|
||||||
|
|
||||||
|
/** Default Number of frames at the beginning to calculate pedestal */
|
||||||
|
const static int DEFAULT_NUM_PEDESTAL = 500;
|
||||||
|
|
||||||
|
/** Default Distance from pedestal to detect a hit */
|
||||||
|
const static int DEFAULT_SIGMA = 5;
|
||||||
|
|
||||||
|
/** Default Background */
|
||||||
|
const static int DEFAULT_BACKGROUND = 1000;
|
||||||
|
|
||||||
|
/** Default Correction Percentage */
|
||||||
|
const static double DEFAULT_CORRECTION = 1.0;
|
||||||
|
|
||||||
|
/** Number of frames at the beginning to calculate pedestal */
|
||||||
|
int nped;
|
||||||
|
|
||||||
|
/** Distance from pedestal to detect a hit */
|
||||||
|
int nsigma;
|
||||||
|
|
||||||
|
/** background */
|
||||||
|
int nbackground;
|
||||||
|
|
||||||
|
/** correction */
|
||||||
|
double outcorr;
|
||||||
|
|
||||||
|
/** previous frame index */
|
||||||
|
unsigned int fnum;
|
||||||
|
|
||||||
|
/** previous packet index */
|
||||||
|
unsigned int pnum;
|
||||||
|
|
||||||
|
/** total packets received */
|
||||||
|
unsigned int ptot;
|
||||||
|
|
||||||
|
/** first frame number */
|
||||||
|
unsigned int f0;
|
||||||
|
|
||||||
|
/** frame index mask */
|
||||||
|
int frame_index_mask;
|
||||||
|
|
||||||
|
/** packet index mask */
|
||||||
|
int packet_index_mask;
|
||||||
|
|
||||||
|
/** frame index offset */
|
||||||
|
int frame_index_offset;
|
||||||
|
|
||||||
|
/** packet index offset */
|
||||||
|
int packet_index_offset;
|
||||||
|
|
||||||
|
/** number of packets per frame */
|
||||||
|
int packets_per_frame;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
Loading…
x
Reference in New Issue
Block a user