added acquisition finished callback when the acquisition returns registerAcquisitionFinishedCallback

git-svn-id: file:///afs/psi.ch/project/sls_det_software/svn/slsDetectorSoftware@237 951219d9-93cf-4727-9268-0efd64621fa3
This commit is contained in:
bergamaschi 2012-09-04 09:47:47 +00:00
parent 2b59857032
commit 43c51f5be5
8 changed files with 146 additions and 27 deletions

View File

@ -1,6 +1,11 @@
#ifndef SLS_DETECTOR_DEFS_H
#define SLS_DETECTOR_DEFS_H
#ifdef __CINT__
#define MYROOT
#define __cplusplus
#endif
#include <stdint.h>
/** default maximum string length */
@ -507,11 +512,15 @@ enum angleConversionParameter {
protected:
#endif
#ifndef MYROOT
#include "sls_detector_funcs.h"
#endif
#ifdef __cplusplus
};
};
#endif
;
#endif
;

View File

@ -352,6 +352,13 @@ class slsDetectorUsers
*/
virtual void registerDataCallback(int( *userCallback)(detectorData*, void*), void *pArg)=0;
/**
@short register calbback for accessing detector final data
\param func function to be called at the end of the acquisition. gets detector status and progress index as arguments
*/
virtual void registerAcquisitionFinishedCallback(int( *func)(double,int, void*), void *pArg)=0;
/**
@short register calbback for reading detector position

View File

@ -17,6 +17,8 @@ slsDetectorUtils::slsDetectorUtils() {
#ifdef VERBOSE
cout << "setting callbacks" << endl;
#endif
acquisition_finished=NULL;
acqFinished_p=NULL;
registerGetPositionCallback(&defaultGetPosition, NULL);
registerConnectChannelsCallback(&defaultConnectChannels,NULL);
registerDisconnectChannelsCallback(&defaultDisconnectChannels,NULL);
@ -323,6 +325,11 @@ void slsDetectorUtils::acquire(int delflag){
if (eclog)
delete eclog;
if (acquisition_finished) {
acquisition_finished(getCurrentProgress(),getDetectorStatus(),acqFinished_p);
}
}

View File

@ -537,6 +537,10 @@ class slsDetectorUtils : public slsDetectorActions, public postProcessing {
void registerGoToPositionNoWaitCallback(int (*func)(double, void*),void*arg){go_to_position_no_wait=func;GTNarg=arg;};
void registerGetI0Callback( double (*func)(int, void*),void *arg){get_i0=func;IOarg=arg;};
virtual void registerAcquisitionFinishedCallback(int( *func)(double,int, void*), void *pArg){acquisition_finished=func; acqFinished_p=pArg;};
/**
Saves the detector setup to file
\param fname file to write to
@ -583,7 +587,8 @@ class slsDetectorUtils : public slsDetectorActions, public postProcessing {
int (*disconnect_channels)(void*);
double (*get_i0)(int, void*);
void *POarg,*CCarg,*DCarg,*GTarg,*GTNarg,*IOarg;
int (*acquisition_finished)(double,int,void*);
void *acqFinished_p;
};

View File

@ -1,8 +1,14 @@
#include "energyCalibration.h"
#ifdef ROOT
#ifdef __CINT
#define MYROOT
#endif
#ifdef MYROOT
#include <TMath.h>
#include <TH1F.h>
#include <TH2F.h>
#include <TGraphErrors.h>
#endif
@ -15,7 +21,7 @@
using namespace std;
#ifdef ROOT
#ifdef MYROOT
Double_t energyCalibrationFunctions::gaussChargeSharing(Double_t *x, Double_t *par) {
Double_t f, arg=0;
if (par[3]!=0) arg=(x[0]-par[2])/par[3];
@ -144,7 +150,7 @@ int energyCalibrationFunctions::kth_smallest(int *a, int n, int k){
#ifdef ROOT
#ifdef MYROOT
Double_t energyCalibrationFunctions::spectrum(Double_t *x, Double_t *par) {
return gaussChargeSharing(x,par);
}
@ -161,7 +167,7 @@ Double_t energyCalibrationFunctions::scurveFluo(Double_t *x, Double_t *par) {
#endif
energyCalibration::energyCalibration() :
#ifdef ROOT
#ifdef MYROOT
fit_min(-1),
fit_max(-1),
bg_offset(-1),
@ -178,7 +184,7 @@ energyCalibration::energyCalibration() :
cs_flag(1)
{
#ifdef ROOT
#ifdef MYROOT
funcs=new energyCalibrationFunctions();
fscurve=new TF1("fscurve",funcs,&energyCalibrationFunctions::scurve,0,1000,6,"energyCalibrationFunctions","scurve");
@ -193,15 +199,77 @@ energyCalibration::energyCalibration() :
}
void energyCalibration::fixParameter(int ip, Double_t val){
fscurve->FixParameter(ip, val);
fspectrum->FixParameter(ip, val);
}
void energyCalibration::releaseParameter(int ip){
fscurve->ReleaseParameter(ip);
fspectrum->ReleaseParameter(ip);
}
energyCalibration::~energyCalibration(){
#ifdef ROOT
#ifdef MYROOT
delete fscurve;
delete fspectrum;
#endif
}
#ifdef ROOT
#ifdef MYROOT
TH1F* energyCalibration::createMedianHistogram(TH2F* h2, int ch0, int nch) {
if (h2==NULL || nch==0)
return NULL;
double *x=new double[nch];
TH1F *h1=NULL;
double val=-1;
h1=new TH1F("median","Median",h2->GetYaxis()->GetNbins(),h2->GetYaxis()->GetXmin(),h2->GetYaxis()->GetXmax());
for (int ib=0; ib<h1->GetXaxis()->GetNbins(); ib++) {
for (int ich=0; ich<nch; ich++) {
x[ich]=h2->GetBinContent(ch0+ich+1,ib+1);
}
val=energyCalibrationFunctions::median(x, nch);
h1->SetBinContent(ib+1,val);
}
return h1;
}
void energyCalibration::setStartParameters(Double_t *par){
bg_offset=par[0];
bg_slope=par[1];
@ -225,7 +293,7 @@ void energyCalibration::getStartParameters(Double_t *par){
int energyCalibration::setChargeSharing(int p) {
if (p>=0) {
cs_flag=p;
#ifdef ROOT
#ifdef MYROOT
if (p) {
fscurve->ReleaseParameter(5);
fspectrum->ReleaseParameter(1);
@ -240,7 +308,7 @@ int energyCalibration::setChargeSharing(int p) {
}
#ifdef ROOT
#ifdef MYROOT
void energyCalibration::initFitFunction(TF1 *fun, TH1 *h1) {
Double_t min=fit_min, max=fit_max;
@ -291,7 +359,6 @@ void energyCalibration::initFitFunction(TF1 *fun, TH1 *h1) {
fun->SetRange(min,max);
}
@ -319,9 +386,6 @@ TF1* energyCalibration::fitFunction(TF1 *fun, TH1 *h1, Double_t *mypar, Double_t
}
TF1* energyCalibration::fitSCurve(TH1 *h1, Double_t *mypar, Double_t *emypar) {
initFitFunction(fscurve,h1);
return fitFunction(fscurve, h1, mypar, emypar);
}

View File

@ -2,11 +2,16 @@
#ifndef ENERGYCALIBRATION_H
#define ENERGYCALIBRATION_H
#ifdef __CINT
#define MYROOT
#endif
#ifdef ROOT
#ifdef MYROOT
#include <TROOT.h>
#include <TF1.h>
class TH1F;
class TH2F;
class TGraphErrors;
#endif
@ -62,7 +67,7 @@ class energyCalibrationFunctions {
int setScanSign(int s=0) {if (s==1 || s==-1) sign=s; return sign;};;
#ifdef ROOT
#ifdef MYROOT
/**
Gaussian Function with charge sharing pedestal
par[0] is the absolute height of the background pedestal
@ -197,7 +202,16 @@ class energyCalibration {
*/
int setChargeSharing(int p=-1);
#ifdef ROOT
void fixParameter(int ip, Double_t val);
void releaseParameter(int ip);
#ifdef MYROOT
static TH1F* createMedianHistogram(TH2F* h2, int ch0, int nch);
/** sets the s-curve fit range
\param mi minimum of the fit range (-1 is histogram x-min)
\param ma maximum of the fit range (-1 is histogram x-max)
@ -300,7 +314,7 @@ class energyCalibration {
#endif
private:
#ifdef ROOT
#ifdef MYROOT
/**
calculates gain and offset for the set of energies
\param nscan number of energy scans
@ -328,7 +342,7 @@ class energyCalibration {
/**
Perfors the fit according to the flags specified and returns the fitted function
Performs the fit according to the flags specified and returns the fitted function
\param fun function to fit
\param h1 histogram to fit
\param mypar pointer to fit parameters array
@ -339,7 +353,7 @@ class energyCalibration {
#endif
#ifdef ROOT
#ifdef MYROOT
Double_t fit_min; /**< minimum of the s-curve fitting range, -1 is histogram x-min */
Double_t fit_max; /**< maximum of the s-curve fitting range, -1 is histogram x-max */

View File

@ -56,6 +56,7 @@ int energyConversion::writeCalibrationFile(string fname, double gain, double off
};
#ifndef MYROOT
/* I/O */
@ -314,4 +315,4 @@ int energyConversion::writeSettingsFile(string fname, detectorType myDetectorTyp
#endif

View File

@ -1,7 +1,14 @@
#ifndef ENERGYCONVERSION_H
#define ENERGYCONVERSION_H
#ifdef __CINT
#define MYROOT
#endif
#ifndef MYROOT
#include "sls_detector_defs.h"
#endif
#include <string>
using namespace std;
@ -10,8 +17,11 @@ using namespace std;
*/
class energyConversion: private virtual slsDetectorDefs {
class energyConversion
#ifndef MYROOT
: private virtual slsDetectorDefs
#endif
{
public:
/** default constrauctor */
energyConversion(){};
@ -37,6 +47,7 @@ class energyConversion: private virtual slsDetectorDefs {
*/
static int writeCalibrationFile(string fname, double gain, double offset);
#ifndef MYROOT
/**
reads a trim/settings file
@ -76,6 +87,7 @@ class energyConversion: private virtual slsDetectorDefs {
char *settingsFile;
#endif
};
#endif