#include "slsDetectorActions.h" #include #include using namespace std; /** set action \param iaction can be enum {startScript, scriptBefore, headerBefore, headerAfter,scriptAfter, stopScript, MAX_ACTIONS} \param fname for script ("" disable but leaves script unchanged, "none" disables and overwrites) \returns 0 if action disabled, >0 otherwise */ int slsDetectorActions::setAction(int iaction, string fname, string par) { int am; if (iaction>=0 && iaction=0 && iaction=0 && iaction=0 && iaction=0 && iaction0 otherwise */ int slsDetectorActions::setScan(int iscan, string script, int nvalues, double *values, string par, int precision) { if (iscan>=0 && iscan=0) { if (nvalues==0) scanMode[iscan]=0; else { nScanSteps[iscan]=nvalues; if (nvalues>MAX_SCAN_STEPS) nScanSteps[iscan]=MAX_SCAN_STEPS; } } if (values && scanMode[iscan]>0 ) { for (int iv=0; iv=0) scanPrecision[iscan]=precision; if (scanMode[iscan]>0){ *actionMask |= 1<< (iscan+MAX_ACTIONS); } else { *actionMask &= ~(1 << (iscan+MAX_ACTIONS)); } setTotalProgress(); return scanMode[iscan]; } else return -1; } int slsDetectorActions::setScanScript(int iscan, string script) { if (iscan>=0 && iscan0){ *actionMask |= (1 << (iscan+MAX_ACTIONS)); } else { *actionMask &= ~(1 << (iscan+MAX_ACTIONS)); } setTotalProgress(); #ifdef VERBOSE cout << "Action mask is " << hex << actionMask << dec << endl; #endif return scanMode[iscan]; } else return -1; } int slsDetectorActions::setScanParameter(int iscan, string par) { if (iscan>=0 && iscan=0 && iscan=0) scanPrecision[iscan]=precision; return scanMode[iscan]; } else return -1; } int slsDetectorActions::setScanSteps(int iscan, int nvalues, double *values) { if (iscan>=0 && iscan=0) { if (nvalues==0) scanMode[iscan]=0; else { nScanSteps[iscan]=nvalues; if (nvalues>MAX_SCAN_STEPS) nScanSteps[iscan]=MAX_SCAN_STEPS; } } if (values) { for (int iv=0; iv0){ *actionMask |= (1 << (iscan+MAX_ACTIONS)); } else { *actionMask &= ~(1 << (iscan+MAX_ACTIONS)); } #ifdef VERBOSE cout << "Action mask is " << hex << actionMask << dec << endl; #endif setTotalProgress(); return scanMode[iscan]; } else return -1; } /** returns scan script \param iscan can be (0,1) \returns scan script */ string slsDetectorActions::getScanScript(int iscan){ if (iscan>=0 && iscan=0 && iscan=0 && iscan=0 && iscan=0 && iscanMAX_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(),getFileIndex(),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(),getFileIndex(),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(),getFileIndex(),getCurrentFileName().c_str(),getActionParameter(level).c_str(),currentScanVariable[0],currentScanVariable[1],getScanParameter(0).c_str(),getScanParameter(1).c_str()); break; case headerBefore: fName=getCurrentFileName(); nowIndex=getFileIndexFromFileName(getCurrentFileName()); 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(), \ // ((double)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; }