diff --git a/slsDetectorSoftware/slsDetector/slsDetectorActions.cpp b/slsDetectorSoftware/slsDetector/slsDetectorActions.cpp index 54e39cb85..7b145ed04 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorActions.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorActions.cpp @@ -401,3 +401,97 @@ int slsDetectorActions::getScanPrecision(int iscan){ } + +int slsDetectorActions::executeScan(int level, int istep) { + + int trimbit; + char cmd[MAX_STR_LENGTH]; + + if (level<0 || level>MAX_SCAN_LEVELS) + return -1; + + currentScanVariable[level]=getScanStep(level,istep); + currentScanIndex[level]=istep; + + switch(scanMode[level]) { + case 1: + setThresholdEnergy((int)currentScanVariable[level]); //energy scan + break; + case 2: + setDAC(currentScanVariable[level],THRESHOLD); // threshold scan + break; + case 3: + trimbit=(int)currentScanVariable[level]; + setChannel((trimbit<<((int)TRIMBIT_OFF))|((int)COMPARATOR_ENABLE)); // trimbit scan + break; + case 0: + currentScanVariable[level]=0; + break; + default: + //Custom scan script level 1. The arguments are passed as nrun=n fn=filename var=v par=p" + sprintf(cmd,"%s nrun=%d fn=%s var=%f par=%s",getScanScript(level).c_str(),*fileIndex,createFileName().c_str(),currentScanVariable[level],getScanParameter(level).c_str()); +#ifdef VERBOSE + cout << "Executing scan script "<< level << " " << cmd << endl; +#endif + system(cmd); + } + return 0; + +} + +int slsDetectorActions::executeAction(int level) { + + + if (*actionMask & (1 << level)) { + + char cmd[MAX_STR_LENGTH]; + switch (level) { + case startScript: + case stopScript: + sprintf(cmd,"%s nrun=%d par=%s",getActionScript(level).c_str(),*fileIndex,getActionParameter(level).c_str()); + break; + case scriptBefore: + case scriptAfter: + sprintf(cmd,"%s nrun=%d fn=%s par=%s sv0=%f sv1=%f p0=%s p1=%s",getActionScript(level).c_str(),*fileIndex,currentFileName.c_str(),getActionParameter(level).c_str(),currentScanVariable[0],currentScanVariable[1],getScanParameter(0).c_str(),getScanParameter(1).c_str()); + break; + case headerBefore: + fName=currentFileName; + nowIndex=getFileIndexFromFileName(currentFileName); + case headerAfter: +// sprintf(cmd,"%s nrun=%d fn=%s acqtime=%f gainmode=%d threshold=%d badfile=%s angfile=%s bloffset=%f fineoffset=%f fffile=%s/%s tau=%f par=%s", \ +// getActionScript(level).c_str(), \ +// getFileIndexFromFileName(currentFileName), \ +// currentFileName.c_str(), \ +// ((float)timerValue[ACQUISITION_TIME])*1E-9, \ +// *currentSettings, \ +// *currentThresholdEV, \ +// getBadChannelCorrectionFile().c_str(), \ +// angularConversion::getAngularConversionFile().c_str(), \ +// *globalOffset, \ +// *fineOffset, \ +// getFlatFieldCorrectionDir().c_str(), \ +// getFlatFieldCorrectionFile().c_str(), \ +// getRateCorrectionTau(), \ +// getActionParameter(level).c_str()); + +// all other parameters should be taken using text client calls in the header scripts! + + sprintf(cmd,"%s nrun=%d fn=%s par=%s", \ + getActionScript(level).c_str(), \ + nowIndex, \ + fName.c_str(), \ + getActionParameter(level).c_str()); + break; + default: + strcpy(cmd,""); + } +#ifdef VERBOSE + cout << "Executing script "<< level << " " << cmd << endl; +#endif + system(cmd); + return 1; + } + return 0; + + +} diff --git a/slsDetectorSoftware/slsDetector/slsDetectorActions.h b/slsDetectorSoftware/slsDetector/slsDetectorActions.h index 31183fe27..24ecf871a 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorActions.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorActions.h @@ -3,7 +3,7 @@ -#include "sls_detector_defs.h" +#include "postProcessing.h" #include #include @@ -20,7 +20,7 @@ using namespace std; */ -class slsDetectorActions : public slsDetectorDefs { +class slsDetectorActions : public postProcessing { public : /** default constructor */ slsDetectorActions(){}; @@ -179,8 +179,35 @@ class slsDetectorActions : public slsDetectorDefs { float getCurrentScanVariable(int index) {return currentScanVariable[index];}; // int getScanPrecision(int index) {return scanPrecision[index];}; + + + + /** + set dacs value + \param val value (in V) + \param index DAC index + \param imod module number (if -1 alla modules) + \returns current DAC value + */ + virtual float setDAC(float val, dacIndex index , int imod=-1)=0; + + + virtual int setThresholdEnergy(int, int im=-1, detectorSettings isettings=GET_SETTINGS)=0; + virtual int setChannel(long long, int ich=-1, int ichip=-1, int imod=-1)=0; + + + int setStartIndex(int i=-1){if (i>=0) {startIndex=i; lastIndex=startIndex; nowIndex=startIndex;};return startIndex;}; + int setLastIndex(int i=-1){if (i>=0 && i>lastIndex) lastIndex=i; return lastIndex;}; + + protected: + + int executeScan(int level, int istep); + int executeAction(int level); + + + /** action mask */ int *actionMask; /** array of action scripts */ @@ -222,7 +249,13 @@ class slsDetectorActions : public slsDetectorDefs { + private: + int startIndex; + int lastIndex; + int nowIndex; + string fName; + diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp b/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp index de032fb0a..cf3deea5d 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp @@ -18,31 +18,16 @@ void slsDetectorUtils::acquire(int delflag){ #ifdef VERBOSE cout << "Acquire function "<< delflag << endl; -#endif - -#ifdef VERBOSE cout << "Stopped flag is "<< stoppedFlag << delflag << endl; #endif - - posfinished=0; - - void *status; - int trimbit; + + setStartIndex(*fileIndex); + + // int lastindex=startindex, nowindex=startindex; - - - char cmd[MAX_STR_LENGTH]; - int startindex=*fileIndex; - int nowindex=startindex, lastindex=startindex; - string fn; - - - - - //string sett; if ((*correctionMask&(1<< ANGULAR_CONVERSION)) || (*correctionMask&(1<< I0_NORMALIZATION))) connect_channels(); @@ -54,16 +39,14 @@ void slsDetectorUtils::acquire(int delflag){ + + pthread_mutex_lock(&mp); resetFinalDataQueue(); resetDataQueue(); - - - //cout << "main mutex lock line 6188" << endl; - pthread_mutex_lock(&mp); jointhread=0; queuesize=0; + posfinished=0; pthread_mutex_unlock(&mp); - //cout << "main mutex unlock line 6188" << endl; @@ -75,9 +58,6 @@ void slsDetectorUtils::acquire(int delflag){ startThread(delflag); } - - - //cout << "data thread started " << endl; int np=1; if (*numberOfPositions>0) @@ -87,64 +67,30 @@ void slsDetectorUtils::acquire(int delflag){ if (*actionMask & (1 << MAX_ACTIONS)) { ns0=nScanSteps[0]; } + if (ns0<1) ns0=1; - int ns1=1; if (*actionMask & (1 << (MAX_ACTIONS+1))) { ns1=nScanSteps[1]; } + if (ns1<1) ns1=1; - //cout << "action at start" << endl; if (*stoppedFlag==0) { - if (*actionMask & (1 << startScript)) { - //"Custom start script. The arguments are passed as nrun=n par=p."); - sprintf(cmd,"%s nrun=%d par=%s",getActionScript(startScript).c_str(),*fileIndex,getActionParameter(startScript).c_str()); -#ifdef VERBOSE - cout << "Executing start script " << cmd << endl; -#endif - system(cmd); - } + executeAction(startScript); } for (int is0=0; is0lastindex) - lastindex=*fileIndex; - } else { - - - if (*fileIndex>lastindex) - lastindex=*fileIndex; - - break; - } + + if (*stoppedFlag==0) { + executeAction(headerAfter); + setLastIndex(*fileIndex); + } else { + setLastIndex(*fileIndex); + break; + } - if (*stoppedFlag) { + if (*stoppedFlag) { #ifdef VERBOSE - std::cout<< "exiting since the detector has been stopped" << std::endl; + std::cout<< "exiting since the detector has been stopped" << std::endl; #endif - break; - } else if (ip<(np-1)) { - *fileIndex=startindex; - } + break; + } else if (ip<(np-1)) { + *fileIndex=setStartIndex(); + } } // loop on position finished - - //script after - if (*stoppedFlag==0) { - if (*actionMask & (1 << scriptAfter)) { - //Custom script after each frame. The arguments are passed as nrun=n fn=filename par=p sv0=scanvar0 sv1=scanvar1 p0=par0 p1=par1" - sprintf(cmd,"%s nrun=%d fn=%s par=%s sv0=%f sv1=%f p0=%s p1=%s",getActionScript(scriptAfter).c_str(),*fileIndex,createFileName().c_str(),getActionParameter(scriptAfter).c_str(),currentScanVariable[0],currentScanVariable[1],getScanParameter(0).c_str(),getScanParameter(1).c_str()); -#ifdef VERBOSE - cout << "Executing script after " << cmd << endl; -#endif - system(cmd); - } - } else - break; - - + + //script after + if (*stoppedFlag==0) { + executeAction(scriptAfter); + } else + break; + + if (*stoppedFlag) { #ifdef VERBOSE std::cout<< "exiting since the detector has been stopped" << std::endl; #endif break; } else if (is1<(ns1-1)) { - *fileIndex=startindex; + *fileIndex=setStartIndex(); } - - } - + //end scan1 loop is1 - //currentScanVariable[MAX_SCAN_LEVELS]; - if (*stoppedFlag) { + if (*stoppedFlag) { #ifdef VERBOSE - std::cout<< "exiting since the detector has been stopped" << std::endl; + std::cout<< "exiting since the detector has been stopped" << std::endl; #endif - break; - } else if (is0<(ns0-1)) { - *fileIndex=startindex; - } + break; + } else if (is0<(ns0-1)) { + *fileIndex=setStartIndex(); + } + } //end scan0 loop is0 - *fileIndex=lastindex; + *fileIndex=setLastIndex(); if (*stoppedFlag==0) { - if (*actionMask & (1 << stopScript)) { - //Custom stop script. The arguments are passed as nrun=n par=p. - sprintf(cmd,"%s nrun=%d par=%s",getActionScript(stopScript).c_str(),*fileIndex,getActionParameter(stopScript).c_str()); -#ifdef VERBOSE - cout << "Executing stop script " << cmd << endl; -#endif - system(cmd); - } + executeAction(stopScript); } - + // waiting for the data processing thread to finish! if (*threadedProcessing) { - //#ifdef VERBOSE - // std::cout<< " ***********************waiting for data processing thread to finish " << queuesize <<" " << thisDetector->fileIndex << std::endl ; - //#endif - //cout << "main mutex lock line 6488" << endl; pthread_mutex_lock(&mp); jointhread=1; pthread_mutex_unlock(&mp); - //cout << "main mutex unlock line 6488" << endl; pthread_join(dataProcessingThread, &status); - // std::cout<< " ***********************data processing finished " << queuesize <<" " << thisDetector->fileIndex << std::endl ; } - if ((*correctionMask&(1<< ANGULAR_CONVERSION)) || (*correctionMask&(1<< I0_NORMALIZATION))) - disconnect_channels(); + + if ((*correctionMask&(1<< ANGULAR_CONVERSION)) || (*correctionMask&(1<< I0_NORMALIZATION))) + disconnect_channels(); + } diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h index aa99c634c..64a94db89 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h @@ -20,13 +20,6 @@ extern "C" { #include -#ifdef __MAKECINT__ -#pragma link off class _FTCOMSTAT-; -#pragma link off class _FTDCB-; -#endif - - -//#include "MySocketTCP.h" #include #include #include @@ -42,7 +35,6 @@ using namespace std; #include "sls_detector_defs.h" #include "slsDetectorBase.h" #include "energyConversion.h" -#include "postProcessing.h" #include "slsDetectorActions.h" #define MAX_TIMERS 10 @@ -57,7 +49,7 @@ using namespace std; (used in the PSi command line interface) */ -class slsDetectorUtils : public slsDetectorActions, public postProcessing, public slsDetectorBase { +class slsDetectorUtils : public slsDetectorActions, public slsDetectorBase { @@ -390,7 +382,7 @@ class slsDetectorUtils : public slsDetectorActions, public postProcessing, publi // virtual float* convertAngles(float pos)=0; virtual int setThresholdEnergy(int, int im=-1, detectorSettings isettings=GET_SETTINGS)=0; - virtual int setChannel(long long, int ich=-1, int ichip=-1, int imod=-1)=0; + virtual int setChannel(long long, int ich=-1, int ichip=-1, int imod=-1)=0; virtual float getRateCorrectionTau()=0; virtual int* startAndReadAll()=0; diff --git a/slsDetectorSoftware/slsDetectorAnalysis/fileIO.cpp b/slsDetectorSoftware/slsDetectorAnalysis/fileIO.cpp index f31895d83..69375548d 100644 --- a/slsDetectorSoftware/slsDetectorAnalysis/fileIO.cpp +++ b/slsDetectorSoftware/slsDetectorAnalysis/fileIO.cpp @@ -52,7 +52,7 @@ string fileIO::createFileName(char *filepath, char *filename, int aMask, float /* generates file name without extension*/ string fileIO::createFileName() { - return createFileName(filePath, \ + currentFileName=createFileName(filePath, \ fileName, \ getActionMask(), \ getCurrentScanVariable(0), \ @@ -63,6 +63,7 @@ string fileIO::createFileName() { getNumberOfPositions(), \ *fileIndex \ ); + return currentFileName; } diff --git a/slsDetectorSoftware/slsDetectorAnalysis/fileIO.h b/slsDetectorSoftware/slsDetectorAnalysis/fileIO.h index d4ce84194..f7cb6a265 100644 --- a/slsDetectorSoftware/slsDetectorAnalysis/fileIO.h +++ b/slsDetectorSoftware/slsDetectorAnalysis/fileIO.h @@ -402,6 +402,7 @@ class fileIO : public slsDetectorDefs { protected: + string currentFileName; /** output directory */ diff --git a/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.cpp b/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.cpp index 4b7e9063d..6130bfe44 100644 --- a/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.cpp +++ b/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.cpp @@ -112,8 +112,6 @@ int postProcessing::setBadChannelCorrection(string fname, int &nbad, int *badlis } else interrupt=1; } - - } } infile.close(); @@ -142,7 +140,7 @@ void postProcessing::processFrame(int *myData, int delflag) { //uses static function?!?!?!? writeDataFile (fname+string(".raw"),fdata, NULL, NULL, 'i'); - doProcessing(fdata,delflag); + doProcessing(fdata,delflag, fname); delete [] myData; myData=NULL; @@ -161,17 +159,7 @@ void postProcessing::processFrame(int *myData, int delflag) { -void postProcessing::doProcessing(float *fdata, int delflag) { - - - float *rcdata=NULL, *rcerr=NULL; - float *ffcdata=NULL, *ffcerr=NULL; - float *ang=NULL; - // int imod; - int np; - string ext; - string fname; - detectorData *thisData; +void postProcessing::doProcessing(float *fdata, int delflag, string fname) { /** write raw data file */ @@ -179,9 +167,21 @@ void postProcessing::doProcessing(float *fdata, int delflag) { // delete [] fdata; ; } else { + + - ext=".dat"; - fname=createFileName(); + + float *rcdata=NULL, *rcerr=NULL; + float *ffcdata=NULL, *ffcerr=NULL; + float *ang=NULL; + // int imod; + int np; + //string fname; + detectorData *thisData; + + + string ext=".dat"; + // fname=createFileName(); /** rate correction */ if (*correctionMask&(1<0) { #ifdef VERBOSE cout << "**************Current position index is " << currentPositionIndex << endl; #endif // if (*numberOfPositions>0) { if (currentPositionIndex<=1) { - - - + #ifdef VERBOSE cout << "reset merging " << endl; #endif @@ -270,7 +258,6 @@ void postProcessing::doProcessing(float *fdata, int delflag) { #endif np=finalizeMerging(); /** file writing */ - currentPositionIndex++; pthread_mutex_unlock(&mp); @@ -280,7 +267,7 @@ void postProcessing::doProcessing(float *fdata, int delflag) { #ifdef VERBOSE cout << "writing merged data file" << endl; #endif - writeDataFile (fname+string(".dat"),np,getMergedCounts(), getMergedErrors(), getMergedPositions(),'f'); + writeDataFile (fname+ext,np,getMergedCounts(), getMergedErrors(), getMergedPositions(),'f'); #ifdef VERBOSE cout << " done" << endl; #endif @@ -290,7 +277,7 @@ void postProcessing::doProcessing(float *fdata, int delflag) { if (delflag) { deleteMerging(); } else { - thisData=new detectorData(getMergedCounts(),getMergedErrors(),getMergedPositions(),getCurrentProgress(),(fname+string(ext)).c_str(),np); + thisData=new detectorData(getMergedCounts(),getMergedErrors(),getMergedPositions(),getCurrentProgress(),(fname+ext).c_str(),np); pthread_mutex_lock(&mg); finalDataQueue.push(thisData); @@ -321,7 +308,7 @@ void postProcessing::doProcessing(float *fdata, int delflag) { if ( ang) delete [] ang; } else { - thisData=new detectorData(ffcdata,ffcerr,NULL,getCurrentProgress(),(fname+string(ext)).c_str(),getTotalNumberOfChannels()); + thisData=new detectorData(ffcdata,ffcerr,NULL,getCurrentProgress(),(fname+ext).c_str(),getTotalNumberOfChannels()); pthread_mutex_lock(&mg); finalDataQueue.push(thisData); pthread_mutex_unlock(&mg); @@ -466,6 +453,7 @@ void* postProcessing::processData(int delflag) { if (fdata) delete [] fdata; + return 0; } @@ -509,7 +497,6 @@ void postProcessing::resetFinalDataQueue() { delete retval; } pthread_mutex_unlock(&mg); - } diff --git a/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.h b/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.h index da1b6cd8b..9dc1f7c78 100644 --- a/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.h +++ b/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.h @@ -193,7 +193,7 @@ s \returns nothing */ - void doProcessing(float* myData, int delflag); + void doProcessing(float* myData, int delflag, string fname); /** diff --git a/slsDetectorSoftware/usersFunctions/usersFunctions.cpp b/slsDetectorSoftware/usersFunctions/usersFunctions.cpp index 08e52d9aa..359b63b95 100644 --- a/slsDetectorSoftware/usersFunctions/usersFunctions.cpp +++ b/slsDetectorSoftware/usersFunctions/usersFunctions.cpp @@ -225,7 +225,7 @@ int go_to_position_no_wait(float p) { /* reads I0 and returns the intensity */ -float get_i0() { +float get_i0(int t) { #ifdef VERBOSE printf("Getting I0 readout \n"); #endif @@ -240,7 +240,15 @@ float get_i0() { #ifdef VERBOSE printf("caget: %f\n", value); #endif - i0=value; + + + if (t==0) + i0=value; + else + i0=value-i0; + + + } else printf(ca_message(status)); #else @@ -249,6 +257,7 @@ float get_i0() { //"ca_get X04SA-ES2-SC:CH6" return i0; + } diff --git a/slsDetectorSoftware/usersFunctions/usersFunctions.h b/slsDetectorSoftware/usersFunctions/usersFunctions.h index 9c454cc5b..59e2d1510 100644 --- a/slsDetectorSoftware/usersFunctions/usersFunctions.h +++ b/slsDetectorSoftware/usersFunctions/usersFunctions.h @@ -36,9 +36,10 @@ extern "C" { int connect_channels(); int disconnect_channels(); - float get_i0(); + float get_i0(int t); +