diff --git a/slsDetectorSoftware/commonFiles/sls_detector_defs.h b/slsDetectorSoftware/commonFiles/sls_detector_defs.h index dffc96ab3..6f0d65627 100755 --- a/slsDetectorSoftware/commonFiles/sls_detector_defs.h +++ b/slsDetectorSoftware/commonFiles/sls_detector_defs.h @@ -1,6 +1,11 @@ #ifndef SLS_DETECTOR_DEFS_H #define SLS_DETECTOR_DEFS_H +#ifdef __CINT__ +#define MYROOT +#define __cplusplus +#endif + #include /** default maximum string length */ @@ -507,11 +512,15 @@ enum angleConversionParameter { protected: #endif + + +#ifndef MYROOT #include "sls_detector_funcs.h" - - +#endif + #ifdef __cplusplus - }; +}; #endif - +; #endif +; diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUsers.h b/slsDetectorSoftware/slsDetector/slsDetectorUsers.h index 7955bb216..7ba4b6700 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUsers.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorUsers.h @@ -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 diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp b/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp index 11fc1e407..5ff82812a 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp @@ -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); + } + } diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h index cab393f93..95cdfd522 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h @@ -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; }; diff --git a/slsDetectorSoftware/slsDetectorAnalysis/energyCalibration.cpp b/slsDetectorSoftware/slsDetectorAnalysis/energyCalibration.cpp index 1bfb9478b..6264182cf 100644 --- a/slsDetectorSoftware/slsDetectorAnalysis/energyCalibration.cpp +++ b/slsDetectorSoftware/slsDetectorAnalysis/energyCalibration.cpp @@ -1,8 +1,14 @@ #include "energyCalibration.h" -#ifdef ROOT +#ifdef __CINT +#define MYROOT +#endif + + +#ifdef MYROOT #include #include +#include #include #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; ibGetXaxis()->GetNbins(); ib++) { + for (int ich=0; ichGetBinContent(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); } diff --git a/slsDetectorSoftware/slsDetectorAnalysis/energyCalibration.h b/slsDetectorSoftware/slsDetectorAnalysis/energyCalibration.h index d34196519..8741efbf9 100644 --- a/slsDetectorSoftware/slsDetectorAnalysis/energyCalibration.h +++ b/slsDetectorSoftware/slsDetectorAnalysis/energyCalibration.h @@ -2,11 +2,16 @@ #ifndef ENERGYCALIBRATION_H #define ENERGYCALIBRATION_H +#ifdef __CINT +#define MYROOT +#endif -#ifdef ROOT + +#ifdef MYROOT #include #include 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 */ diff --git a/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.cpp b/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.cpp index ed453ec55..9a7a81b84 100644 --- a/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.cpp +++ b/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.cpp @@ -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 diff --git a/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.h b/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.h index fb57e2a37..a697843be 100644 --- a/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.h +++ b/slsDetectorSoftware/slsDetectorAnalysis/energyConversion.h @@ -1,7 +1,14 @@ #ifndef ENERGYCONVERSION_H #define ENERGYCONVERSION_H +#ifdef __CINT +#define MYROOT +#endif + +#ifndef MYROOT #include "sls_detector_defs.h" +#endif + #include 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