This commit is contained in:
2019-06-28 18:16:32 +02:00
parent 039a725c5c
commit a373609b08
11 changed files with 544 additions and 646 deletions

View File

@ -1,71 +1,60 @@
#include <unistd.h>
#include <cstring>
#ifndef DETECTOR_DATA_H
#define DETECTOR_DATA_H
#pragma once
/**
@short data structure to hold the detector data after postprocessing (e.g. to plot, store in a root tree etc.)
@short data structure to hold the detector data after postprocessing
*/
class detectorData {
public:
/** @short The constructor
\param f_ind file index
\param fname file name to which the data are saved
\param np number of points in x coordinate defaults to the number of detector channels (1D detector) or dimension in x (2D detector)
\param ny dimension in y (2D detector)
\param cval pointer to data in char* format
\param dbytes number of bytes of image pointed to by cval pointer
\param dr dynamic range or bits per pixel
\param file_ind file index
/**
* Constructor
* @param progress progress index
* @param fname file name prefix
* @param nx number of detector channels (1D detector) or dimension in x (2D detector)
* @param ny dimension in y (2D detector)
* @param d pointer to data in char* format
* @param dbytes number of bytes of image pointed to by cval pointer
* @param dr dynamic range or bits per pixel
* @param fIndex file index
*/
detectorData(double f_ind=-1,
const char *fname="", int np=-1, int ny=1, char *cval=NULL, int dbytes=0, int dr=0,
long long int file_ind=-1) :
progressIndex(f_ind),
npoints(np), npy(ny), cvalues(cval), databytes(dbytes),
dynamicRange(dr), dgainvalues(NULL), fileIndex(file_ind) {
strcpy(fileName,fname);
};
int64_t getChannel(int i) {
int off=dynamicRange/8;
if (off==1) {
char val=*(cvalues+i);
return val;
}
if (off==2) {
int16_t val=*((int16_t*)(cvalues+i*off));
return val;
}
if (off==4) {
int32_t val=*((int32_t*)(cvalues+i*off));
return val;
}
if (off==8) {
int64_t val=*((int64_t*)(cvalues+i*off));
return val;
}
return -1;
}
detectorData(double progress, std::string fname, int x, int y, char *d, int dbytes, int dr, uint64_t fIndex) :
progressIndex(progress), fileName(fname), nx(x), ny(y), data(d), databytes(dbytes), dynamicRange(dr), gain(nullptr), fileIndex(fIndex) {};
/**
@short The destructor
deletes also the arrays pointing to data/errors/angles if not NULL
cvalues are deleted by caller
* Destructor
* Also deletes gain
* data has to be deleted by caller
*/
~detectorData() {if(dgainvalues) delete [] dgainvalues;};
~detectorData() {if(gain) delete [] gain;};
int64_t getChannel(int i) {
int off=dynamicRange/8;
if (off==1) {
char val=*(data+i);
return val;
}
if (off==2) {
int16_t val=*((int16_t*)(data+i*off));
return val;
}
if (off==4) {
int32_t val=*((int32_t*)(data+i*off));
return val;
}
if (off==8) {
int64_t val=*((int64_t*)(data+i*off));
return val;
}
return -1;
}
//private:
double progressIndex;/**< @short file index */
char fileName[1000];/**< @short file name */
int npoints;/**< @short number of points */
int npy;/**< @short dimensions in y coordinate*/
char* cvalues; /**< @short pointer to the data as char arary */
int databytes; /**< @short number of bytes of data. Used with cvalues */
int dynamicRange; /**< @short dynamic range */
double* dgainvalues; /**< @short pointer to gain data as double array for Jungfrau only in show gain mode */
long long int fileIndex; /**< @short file index */
double progressIndex;
std::string fileName;
uint64_t fileIndex;
int nx;
int ny;
char* data;
double* gain;
int databytes;
int dynamicRange;
};
#endif

View File

@ -2091,16 +2091,16 @@ class multiSlsDetector : public virtual slsDetectorDefs {
* gets detector status and progress index as arguments
* @param pArg argument
*/
void registerAcquisitionFinishedCallback(int (*func)(double, int, void *),
void registerAcquisitionFinishedCallback(void (*func)(double, int, void *),
void *pArg);
/**
* register callback for accessing measurement final data
* @param func function to be called at the end of the acquisition.
* gets detector status and progress index as arguments
* gets measurement index
* @param pArg argument
*/
void registerMeasurementFinishedCallback(int (*func)(int, int, void *),
void registerMeasurementFinishedCallback(void (*func)(int, void *),
void *pArg);
/**
@ -2109,7 +2109,7 @@ class multiSlsDetector : public virtual slsDetectorDefs {
* gets detector status and progress index as arguments
* @param pArg argument
*/
void registerProgressCallback(int (*func)(double, void *), void *pArg);
void registerProgressCallback(void (*func)(double, void *), void *pArg);
/**
* register calbback for accessing detector final data,
@ -2120,7 +2120,7 @@ class multiSlsDetector : public virtual slsDetectorDefs {
* s is for subframe number for eiger for 32 bit mode
* @param pArg argument
*/
void registerDataCallback(int (*userCallback)(detectorData *, int, int,
void registerDataCallback(void (*userCallback)(detectorData *, uint64_t, uint32_t,
void *),
void *pArg);
@ -2299,16 +2299,16 @@ class multiSlsDetector : public virtual slsDetectorDefs {
/** detector data packed for the gui */
detectorData *thisData{nullptr};
int (*acquisition_finished)(double, int, void *){nullptr};
void (*acquisition_finished)(double, int, void *){nullptr};
void *acqFinished_p{nullptr};
int (*measurement_finished)(int, int, void *){nullptr};
void (*measurement_finished)(int, void *){nullptr};
void *measFinished_p{nullptr};
int (*progress_call)(double, void *){nullptr};
void (*progress_call)(double, void *){nullptr};
void *pProgressCallArg{nullptr};
int (*dataReady)(detectorData *, int, int, void *){nullptr};
void (*dataReady)(detectorData *, uint64_t, uint32_t, void *){nullptr};
void *pCallbackArg{nullptr};
};

View File

@ -813,7 +813,7 @@ public:
* @param pArg argument
*/
void registerDataCallback(int( *userCallback)(detectorData* d, int f, int s, void*), void *pArg);
void registerDataCallback(void( *userCallback)(detectorData* d, uint64_t f, uint32_t s, void*), void *pArg);
/**
* register callback for accessing acquisition final data in client,
@ -821,15 +821,15 @@ public:
* gets detector status and progress index as arguments
* @param pArg argument
*/
void registerAcquisitionFinishedCallback(int( *func)(double,int, void*), void *pArg);
void registerAcquisitionFinishedCallback(void( *func)(double,int, void*), void *pArg);
/**
* register callback for accessing measurement final data in client,
* @param func function to be called at the end of the acquisition.
* gets detector status and progress index as arguments
* gets measurement index
* @param pArg argument
*/
void registerMeasurementFinishedCallback(int( *func)(int,int, void*), void *pArg);
void registerMeasurementFinishedCallback(void( *func)(int, void*), void *pArg);
/**
* register callback for accessing detector progress in client,
@ -837,7 +837,7 @@ public:
* gets detector status and progress index as arguments
* @param pArg argument
*/
void registerProgressCallback(int( *func)(double,void*), void *pArg);
void registerProgressCallback(void( *func)(double,void*), void *pArg);
/**
@short [usage strongly discouraged] sets parameters trough command line interface http://www.psi.ch/detectors/UsersSupportEN/slsDetectorClientHowTo.pdf

View File

@ -4069,24 +4069,24 @@ int multiSlsDetector::dumpDetectorSetup(const std::string &fname, int level) {
return OK;
}
void multiSlsDetector::registerAcquisitionFinishedCallback(int (*func)(double, int, void *),
void multiSlsDetector::registerAcquisitionFinishedCallback(void (*func)(double, int, void *),
void *pArg) {
acquisition_finished = func;
acqFinished_p = pArg;
}
void multiSlsDetector::registerMeasurementFinishedCallback(int (*func)(int, int, void *),
void multiSlsDetector::registerMeasurementFinishedCallback(void (*func)(int, void *),
void *pArg) {
measurement_finished = func;
measFinished_p = pArg;
}
void multiSlsDetector::registerProgressCallback(int (*func)(double, void *), void *pArg) {
void multiSlsDetector::registerProgressCallback(void (*func)(double, void *), void *pArg) {
progress_call = func;
pProgressCallArg = pArg;
}
void multiSlsDetector::registerDataCallback(int (*userCallback)(detectorData *, int, int, void *),
void multiSlsDetector::registerDataCallback(void (*userCallback)(detectorData *, uint64_t, uint32_t, void *),
void *pArg) {
dataReady = userCallback;
pCallbackArg = pArg;
@ -4233,7 +4233,7 @@ int multiSlsDetector::acquire() {
findex = incrementFileIndex();
if (measurement_finished != nullptr) {
measurement_finished(im, findex, measFinished_p);
measurement_finished(im, measFinished_p);
}
if (multi_shm()->stoppedFlag != 0) {
break;

View File

@ -398,19 +398,19 @@ int slsDetectorUsers::setDetectorMode(int value, int detPos) {
*********************************************************************/
void slsDetectorUsers::registerDataCallback(int( *userCallback)(detectorData*, int, int, void*), void *pArg) {
void slsDetectorUsers::registerDataCallback(void( *userCallback)(detectorData*, uint64_t, uint32_t, void*), void *pArg) {
detector.registerDataCallback(userCallback,pArg);
}
void slsDetectorUsers::registerAcquisitionFinishedCallback(int( *func)(double,int, void*), void *pArg) {
void slsDetectorUsers::registerAcquisitionFinishedCallback(void( *func)(double,int, void*), void *pArg) {
detector.registerAcquisitionFinishedCallback(func,pArg);
}
void slsDetectorUsers::registerMeasurementFinishedCallback(int( *func)(int,int, void*), void *pArg) {
void slsDetectorUsers::registerMeasurementFinishedCallback(void( *func)(int,void*), void *pArg) {
detector.registerMeasurementFinishedCallback(func,pArg);
}
void slsDetectorUsers::registerProgressCallback(int( *func)(double,void*), void *pArg) {
void slsDetectorUsers::registerProgressCallback(void( *func)(double,void*), void *pArg) {
detector.registerProgressCallback(func,pArg);
}