scripting stuff added

git-svn-id: file:///afs/psi.ch/project/sls_det_software/svn/slsDetectorSoftware@26 951219d9-93cf-4727-9268-0efd64621fa3
This commit is contained in:
bergamaschi
2011-02-07 16:24:03 +00:00
parent 677523aa6b
commit 67cd4f9c14
3 changed files with 1221 additions and 154 deletions

View File

@ -330,11 +330,12 @@ string mythenDetector::executeLine(int narg, char *args[], int action) {
} else if (var=="trimen") {
if (action==PUT_ACTION) {
sscanf(args[1],"%d",&ival);
std::cout<< ival << std::endl ;
//std::cout<< ival << std::endl ;
if (ival>narg-2)
ival=narg-2;
int ene[ival];
for (int ie=0; ie<ival; ie++) {
std::cout<< ie << " " << args[2+ie] ;
std::cout<< sscanf(args[2+ie],"%d",ene+ie)<< std::endl;;
sscanf(args[2+ie],"%d",ene+ie);
}
setTrimEn(ival,ene);
}
@ -363,6 +364,196 @@ string mythenDetector::executeLine(int narg, char *args[], int action) {
sprintf(answer,"%d",setOnline());
return string(answer);
}
else if (var=="startscript") {
ival=startScript;
if (action==PUT_ACTION) {
setAction(ival,args[1]);
}
sprintf(answer,"%d %s",getActionMode(ival), getActionScript(ival).c_str());
return string(answer);
} else if (var=="startscriptpar") {
ival=startScript;
if (action==PUT_ACTION) {
setActionParameter(ival,args[1]);
}
return getActionParameter(ival);
} else if (var=="stopscript") {
ival=stopScript;
if (action==PUT_ACTION) {
setAction(ival,args[1]);
}
sprintf(answer,"%d %s",getActionMode(ival), getActionScript(ival).c_str());
return string(answer);
} else if (var=="stopscriptpar") {
ival=stopScript;
if (action==PUT_ACTION) {
setActionParameter(ival,args[1]);
}
return getActionParameter(ival);
} else if (var=="scriptbefore") {
ival=scriptBefore;
if (action==PUT_ACTION) {
setAction(ival,args[1]);
}
sprintf(answer,"%d %s",getActionMode(ival), getActionScript(ival).c_str());
return string(answer);
} else if (var=="scriptbeforepar") {
ival=scriptBefore;
if (action==PUT_ACTION) {
setActionParameter(ival,args[1]);
}
return getActionParameter(ival);
} else if (var=="scriptafter") {
ival=scriptAfter;
if (action==PUT_ACTION) {
setAction(ival,args[1]);
}
sprintf(answer,"%d %s",getActionMode(ival), getActionScript(ival).c_str());
return string(answer);
} else if (var=="scriptafterpar") {
ival=scriptAfter;
if (action==PUT_ACTION) {
setActionParameter(ival,args[1]);
}
return getActionParameter(ival);
} else if (var=="headerafter") {
ival=headerAfter;
if (action==PUT_ACTION) {
setAction(ival,args[1]);
}
sprintf(answer,"%d %s",getActionMode(ival), getActionScript(ival).c_str());
return string(answer);
} else if (var=="headerafterpar") {
ival=headerAfter;
if (action==PUT_ACTION) {
setActionParameter(ival,args[1]);
}
return getActionParameter(ival);
} else if (var=="headerbefore") {
ival=headerBefore;
if (action==PUT_ACTION) {
setAction(ival,args[1]);
}
sprintf(answer,"%d %s",getActionMode(ival), getActionScript(ival).c_str());
return string(answer);
} else if (var=="headerbeforepar") {
ival=headerBefore;
if (action==PUT_ACTION) {
setActionParameter(ival,args[1]);
}
return getActionParameter(ival);
}
else if (var=="scan0script") {
int ind=0;
if (action==PUT_ACTION) {
setScanScript(ind,args[1]);
}
return getScanScript(ind);
} else if (var=="scan0par") {
int ind=0;
if (action==PUT_ACTION) {
setScanParameter(ind,args[1]);
}
return getScanParameter(ind);
} else if (var=="scan0prec") {
int ind=0;
if (action==PUT_ACTION) {
sscanf(args[1],"%d",&ival);
setScanPrecision(ind,ival);
}
sprintf(answer,"%d",getScanPrecision(ind));
return string(answer);
} else if (var=="scan0steps") {
int ind=0;
if (action==PUT_ACTION) {
sscanf(args[1],"%d",&ival);
//cout << ival << " " << narg << endl;
if (ival>narg-2)
ival=narg-2;
float ene[ival];
for (int ie=0; ie<ival; ie++) {
sscanf(args[2+ie],"%f",ene+ie);
}
setScanSteps(ind,ival,ene);
}
int nen=getScanSteps(ind);
sprintf(answer,"%d",nen);
float oen[nen];
getScanSteps(ind,oen);
char form[20];
sprintf(form,"%%s %%0.%df",getScanPrecision(ind));
for (int ie=0; ie<nen;ie++) {
sprintf(answer,form,answer,oen[ie]);
}
return string(answer);
}
else if (var=="scan1script") {
int ind=1;
if (action==PUT_ACTION) {
setScanScript(ind,args[1]);
}
return getScanScript(ind);
} else if (var=="scan1par") {
int ind=1;
if (action==PUT_ACTION) {
setScanParameter(ind,args[1]);
}
return getScanParameter(ind);
} else if (var=="scan1prec") {
int ind=1;
if (action==PUT_ACTION) {
sscanf(args[1],"%d",&ival);
setScanPrecision(ind,ival);
}
sprintf(answer,"%d",getScanPrecision(ind));
return string(answer);
} else if (var=="scan1steps") {
int ind=1;
if (action==PUT_ACTION) {
sscanf(args[1],"%d",&ival);
if (ival>narg-2)
ival=narg-2;
float ene[ival];
for (int ie=0; ie<ival; ie++) {
sscanf(args[2+ie],"%f",ene+ie);
}
setScanSteps(ind,ival,ene);
}
int nen=getScanSteps(ind);
sprintf(answer,"%d",nen);
float oen[nen];
getScanSteps(ind,oen);
char form[20];
sprintf(form,"%%s %%0.%df",getScanPrecision(ind));
for (int ie=0; ie<nen;ie++) {
sprintf(answer,form,answer,oen[ie]);
}
return string(answer);
}
@ -837,6 +1028,71 @@ string mythenDetector::helpLine( int action) {
os << std::endl;
os << "trimen nen [e0 e1...en] \t sets the number of energies for which trimbit files exist and their value"<< std::endl;
os << std::endl;
os << "startscript script \t sets script to execute at the beginning of the measurements - \"none\" to unset - will be launched as a system call with arguments nrun=fileindex par=startscriptpar"<< std::endl;
os << std::endl;
os << "startscriptpar par \t sets start script parameter (see startscript)"<< std::endl;
os << std::endl;
os << "scan0script script \t sets script to launch at level 0 scan. If \"energy\" energy scan, if \"threshold\" threshold scan, if \"trimbits\" trimbits scan, \"none\" unsets otherwise will be launched as a system call with arguments nrun=fileindex fn=filename var=scan0var par=scan0par"<< std::endl;
os << std::endl;
os << "scan0par par\t sets the level 0 scan parameter. See scan0script"<< std::endl;
os << std::endl;
os << "scan0prec n \t sets the level 0 scan precision for the output file name. See scan0script"<< std::endl;
os << std::endl;
os << "scan0steps nsteps [s0 s1...] \t sets the level 0 scan steps. See scan0script - nsteps=0 unsets the scan level"<< std::endl;
os << std::endl;
os << "scan1script script \t sets script to launch at level 1 scan. If \"energy\" energy scan, if \"threshold\" threshold scan, if \"trimbits\" trimbits scan, \"none\" unsets otherwise will be launched as a system call with arguments nrun=fileindex fn=filename var=scan1var par=scan1par"<< std::endl;
os << std::endl;
os << "scan1par par\t sets the level 1 scan parameter. See scan1script"<< std::endl;
os << std::endl;
os << "scan1prec n \t sets the level 1 scan precision for the output file name. See scan1script"<< std::endl;
os << std::endl;
os << "scan1steps nsteps [s0 s1...] \t sets the level 1 scan steps. See scan1script - nsteps=0 unsets the scan level"<< std::endl;
os << std::endl;
os << "scriptbefore script \t sets script to execute at the beginning of the realtime acquisition - \"none\" to unset - will be launched as a system call with arguments nrun=fileindex fn=filename par=scriptbeforepar sv0=scan0var sv1=scan1var p0=scan0par p1=scan1par"<< std::endl;
os << std::endl;
os << "scriptbeforepar \t sets script before parameter (see scriptbefore)"<< std::endl;
os << std::endl;
os << "headerbefore script \n script to launch to acquire the headerfile just before the acquisition - \"none\" to unset - will be launched as a system call with arguments nrun=fileindex fn=filename acqtime=t gainmode=sett threshold=thr badfile=badf angfile=angf bloffset=bloffset fineoffset=fineoffset fffile=ffile tau=taucorr par=headerbeforepar"<< std::endl;
os << std::endl;
os << "headerbeforepar \t sets header before parameter (see headerbefore)"<< std::endl;
os << std::endl;
os << "headerafter script \n script to launch to acquire the headerfile just after the acquisition - \"none\" to unset - will be launched as a system call with arguments nrun=fileindex fn=filename acqtime=t gainmode=sett threshold=thr badfile=badf angfile=angf bloffset=bloffset fineoffset=fineoffset fffile=ffile tau=taucorr par=headerafterpar"<< std::endl;
os << std::endl;
os << "headerafterpar par \t sets header after parameter (see headerafter)"<< std::endl;
os << std::endl;
os << "scriptafter script \t sets script to execute at the end of the realtime acquisition - \"none\" to unset - will be launched as a system call with arguments nrun=fileindex fn=filename par=scriptafterpar sv0=scan0var sv1=scan1var p0=scan0par p1=scan1par"<< std::endl;
os << std::endl;
os << "scriptafterpar par \t sets script after parameter (see scriptafter)"<< std::endl;
os << std::endl;
os << "stopscript script \t sets script to execute at the end of the measurements - \"none\" to unset - will be launched as a system call with arguments nrun=fileindex par=stopscriptpar"<< std::endl;
os << std::endl;
os << "stopscriptpar par\t sets stop script parameter (see stopscript)"<< std::endl;
os << std::endl;
os << "outdir \t directory to which the files will be written by default" << std::endl;
os << std::endl;
os << "fname \t filename to which the files will be written by default (to which file and position indexes will eventually be attached)" << std::endl;
@ -940,6 +1196,85 @@ string mythenDetector::helpLine( int action) {
os << "trimdir \t Gets path of the trim files " << std::endl;
os << std::endl;
os << "trimen \t returns the number of energies for which trimbit files exist and their values"<< std::endl;
os << "startscript \t gets script to execute at the beginning of the measurements - \"none\" to unset - will be launched as a system call with arguments nrun=fileindex par=startscriptpar"<< std::endl;
os << std::endl;
os << "startscriptpar \t gets start script parameter (see startscript)"<< std::endl;
os << std::endl;
os << "scan0script \t gets script to launch at level 0 scan. If \"energy\" energy scan, if \"threshold\" threshold scan, if \"trimbits\" trimbits scan, \"none\" unsets otherwise will be launched as a system call with arguments nrun=fileindex fn=filename var=scan0var par=scan0par"<< std::endl;
os << std::endl;
os << "scan0par \t gets the level 0 scan parameter. See scan0script"<< std::endl;
os << std::endl;
os << "scan0prec \t gets the level 0 scan precision for the output file name. See scan0script"<< std::endl;
os << std::endl;
os << "scan0steps \t gets the level 0 scan steps. See scan0script - nsteps=0 unsets the scan level"<< std::endl;
os << std::endl;
os << "scan1script \t gets script to launch at level 1 scan. If \"energy\" energy scan, if \"threshold\" threshold scan, if \"trimbits\" trimbits scan, \"none\" unsets otherwise will be launched as a system call with arguments nrun=fileindex fn=filename var=scan1var par=scan1par"<< std::endl;
os << std::endl;
os << "scan1par \t gets the level 1 scan parameter. See scan1script"<< std::endl;
os << std::endl;
os << "scan1prec \t gets the level 1 scan precision for the output file name. See scan1script"<< std::endl;
os << std::endl;
os << "scan1steps \t gets the level 1 scan steps. See scan1script - nsteps=0 unsets the scan level"<< std::endl;
os << std::endl;
os << "scriptbefore \t gets script to execute at the beginning of the realtime acquisition - \"none\" to unset - will be launched as a system call with arguments nrun=fileindex fn=filename par=scriptbeforepar sv0=scan0var sv1=scan1var p0=scan0par p1=scan1par"<< std::endl;
os << std::endl;
os << "scriptbeforepar \t gets script before parameter (see scriptbefore)"<< std::endl;
os << std::endl;
os << "headerbefore \n gets the script to launch to acquire the headerfile just before the acquisition - \"none\" to unset - will be launched as a system call with arguments nrun=fileindex fn=filename acqtime=t gainmode=sett threshold=thr badfile=badf angfile=angf bloffset=bloffset fineoffset=fineoffset fffile=ffile tau=taucorr par=headerbeforepar"<< std::endl;
os << std::endl;
os << "headerbeforepar \t gets header before parameter (see headerbefore)"<< std::endl;
os << std::endl;
os << "headerafter \n gets the script to launch to acquire the headerfile just after the acquisition - \"none\" to unset - will be launched as a system call with arguments nrun=fileindex fn=filename acqtime=t gainmode=sett threshold=thr badfile=badf angfile=angf bloffset=bloffset fineoffset=fineoffset fffile=ffile tau=taucorr par=headerafterpar"<< std::endl;
os << std::endl;
os << "headerafterpar \t gets header after parameter (see headerafter)"<< std::endl;
os << std::endl;
os << "scriptafter \t gets script to execute at the end of the realtime acquisition - \"none\" to unset - will be launched as a system call with arguments nrun=fileindex fn=filename par=scriptafterpar sv0=scan0var sv1=scan1var p0=scan0par p1=scan1par"<< std::endl;
os << std::endl;
os << "scriptafterpar \t gets script after parameter (see scriptafter)"<< std::endl;
os << std::endl;
os << "stopscript \t gets script to execute at the end of the measurements - \"none\" to unset - will be launched as a system call with arguments nrun=fileindex par=stopscriptpar"<< std::endl;
os << std::endl;
os << "stopscriptpar\t gets stop script parameter (see stopscript)"<< std::endl;
os << std::endl;
os << "outdir \t directory to which the files will be written by default" << std::endl;
os << std::endl;
os << "fname \t filename to which the files will be written by default (to which file and position indexes will eventually be attached)" << std::endl;
@ -1564,7 +1899,7 @@ int mythenDetector::retrieveDetectorSetup(string fname1, int level){
strcpy(thisDetector->trimFile,fname.c_str());
return myMod;
} else {
std::cout<< "could not open file " << myfname<< std::endl;
std::cout<< "could not open trim file " << myfname << std::endl;
if (nflag)
deleteModule(myMod);
return NULL;
@ -1921,9 +2256,17 @@ int mythenDetector::setAngularConversion(string fname) {
if (fname=="") {
thisDetector->correctionMask&=~(1<< ANGULAR_CONVERSION);
//strcpy(thisDetector->angConvFile,"none");
//#ifdef VERBOSE
std::cout << "Unsetting angular conversion" << std::endl;
//#endif
} else {
if (fname=="default")
if (fname=="default") {
fname=string(thisDetector->angConvFile);
}
//#ifdef VERBOSE
std::cout << "Setting angular conversion to" << fname << std:: endl;
//#endif
if (readAngularConversion(fname)>=0) {
thisDetector->correctionMask|=(1<< ANGULAR_CONVERSION);
strcpy(thisDetector->angConvFile,fname.c_str());
@ -1932,6 +2275,12 @@ int mythenDetector::setAngularConversion(string fname) {
return thisDetector->correctionMask&(1<< ANGULAR_CONVERSION);
}
int mythenDetector::getAngularConversion(int &direction, angleConversionConstant *angconv) {
direction=thisDetector->angDirection;
if (angconv) {
@ -2064,7 +2413,6 @@ int mythenDetector::addToMerging(float *p1, float *v1, float *e1, float *mp, fl
int ibin=0;
int imod;
float ang=0;
if (thisDetector->binSize>0)
binsize=thisDetector->binSize;
else
@ -2133,10 +2481,19 @@ int mythenDetector::addToMerging(float *p1, float *v1, float *e1, float *mp, fl
void mythenDetector::acquire(int delflag){
void *status;
#ifdef VERBOSE
int iloop=0;
#endif
//#ifdef VERBOSE
//int iloop=0;
//#endif
int trimbit;
int startindex=thisDetector->fileIndex;
int lastindex=startindex;
char cmd[MAX_STR_LENGTH];
//string sett;
thisDetector->progressIndex=0;
thisDetector->stoppedFlag=0;
resetFinalDataQueue();
resetDataQueue();
@ -2144,6 +2501,11 @@ void mythenDetector::acquire(int delflag){
jointhread=0;
queuesize=0;
if (thisDetector->threadedProcessing) {
startThread(delflag);
}
@ -2152,9 +2514,119 @@ void mythenDetector::acquire(int delflag){
if (thisDetector->numberOfPositions>0)
np=thisDetector->numberOfPositions;
int ns0=1;
if (thisDetector->actionMask & (1 << MAX_ACTIONS)) {
ns0=thisDetector->nScanSteps[0];
}
if (ns0<1)
ns0=1;
int ns1=1;
if (thisDetector->actionMask & (1 << (MAX_ACTIONS+1))) {
ns1=thisDetector->nScanSteps[1];
}
if (ns1<1)
ns1=1;
//action at start
if (thisDetector->stoppedFlag==0) {
if (thisDetector->actionMask & (1 << startScript)) {
//"Custom start script. The arguments are passed as nrun=n par=p.");
sprintf(cmd,"%s nrun=%d par=%s",thisDetector->actionScript[startScript],thisDetector->fileIndex,thisDetector->actionParameter[startScript]);
#ifdef VERBOSE
cout << "Executing start script " << cmd << endl;
#endif
system(cmd);
}
}
for (int is0=0; is0<ns0; is0++) {//scan0 loop
if (thisDetector->stoppedFlag==0) {
currentScanVariable[0]=thisDetector->scanSteps[0][is0];
switch(thisDetector->scanMode[0]) {
case 1:
setThresholdEnergy((int)currentScanVariable[0]); //energy scan
break;
case 2:
setDAC(currentScanVariable[0],THRESHOLD); // threshold scan
break;
case 3:
trimbit=(int)currentScanVariable[0];
setChannel((trimbit<<((int)TRIMBIT_OFF))|((int)COMPARATOR_ENABLE)); // trimbit scan
break;
case 0:
currentScanVariable[0]=0;
break;
default:
//Custom scan script level 0. The arguments are passed as nrun=n fn=filename var=v par=p"
sprintf(cmd,"%s nrun=%d fn=%s var=%f par=%s",thisDetector->scanScript[0],thisDetector->fileIndex,createFileName().c_str(),currentScanVariable[0],thisDetector->scanParameter[0]);
#ifdef VERBOSE
cout << "Executing scan script 0 " << cmd << endl;
#endif
system(cmd);
}
} else
break;
for (int is1=0; is1<ns0; is1++) {//scan0 loop
if (thisDetector->stoppedFlag==0) {
currentScanVariable[1]=thisDetector->scanSteps[1][is1];
switch(thisDetector->scanMode[1]) {
case 1:
setThresholdEnergy((int)currentScanVariable[1]); //energy scan
break;
case 2:
setDAC(currentScanVariable[1],THRESHOLD); // threshold scan
break;
case 3:
trimbit=(int)currentScanVariable[1];
setChannel((trimbit<<((int)TRIMBIT_OFF))|((int)COMPARATOR_ENABLE)); // trimbit scan
break;
case 0:
currentScanVariable[1]=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",thisDetector->scanScript[1],thisDetector->fileIndex,createFileName().c_str(),currentScanVariable[1],thisDetector->scanParameter[1]);
#ifdef VERBOSE
cout << "Executing scan script 1 " << cmd << endl;
#endif
system(cmd);
}
} else
break;
if (thisDetector->stoppedFlag==0) {
if (thisDetector->actionMask & (1 << scriptBefore)) {
//Custom script before 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",thisDetector->actionScript[scriptBefore],thisDetector->fileIndex,createFileName().c_str(),thisDetector->actionParameter[scriptBefore],currentScanVariable[0],currentScanVariable[1],thisDetector->scanParameter[0],thisDetector->scanParameter[1]);
#ifdef VERBOSE
cout << "Executing script before " << cmd << endl;
#endif
system(cmd);
}
} else
break;
currentPositionIndex=0;
for (int ip=0; ip<np; ip++) {
if (thisDetector->stoppedFlag==0) {
if (thisDetector->numberOfPositions>0) {
go_to_position (thisDetector->detPositions[ip]);
currentPositionIndex=ip+1;
@ -2162,65 +2634,149 @@ void mythenDetector::acquire(int delflag){
std::cout<< "moving to position" << std::endl;
#endif
}
} else
break;
//write header before?
//cmd=headerBeforeScript;
//Custom script to write the header. \n The arguments will be passed as nrun=n fn=filenam acqtime=t gainmode=g threshold=thr badfile=badf angfile=angf bloffset=blo fineoffset=fo fffile=fffn tau=deadtau par=p")
if (thisDetector->stoppedFlag==0) {
if (thisDetector->correctionMask&(1<< I0_NORMALIZATION))
currentI0=get_i0();
//write header before?
if (thisDetector->actionMask & (1 << headerBefore)) {
//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 acqtime=%f gainmode=%d threshold=%d badfile=%s angfile=%s bloffset=%f fineoffset=%f fffile=%s/%s tau=%f par=%s",thisDetector->actionScript[headerBefore],thisDetector->fileIndex,createFileName().c_str(),((float)thisDetector->timerValue[ACQUISITION_TIME])*1E-9, thisDetector->currentSettings, thisDetector->currentThresholdEV, getBadChannelCorrectionFile().c_str(), getAngularConversion().c_str(), thisDetector->globalOffset, thisDetector->fineOffset,getFlatFieldCorrectionDir(),getFlatFieldCorrectionFile(), getRateCorrectionTau(), thisDetector->actionParameter[headerBefore]);
#ifdef VERBOSE
cout << "Executing header after " << cmd << endl;
#endif
system(cmd);
}
} else
break;
if (thisDetector->stoppedFlag==0) {
startAndReadAll();
//write header after?
if (thisDetector->correctionMask&(1<< I0_NORMALIZATION))
currentI0=get_i0();
if (thisDetector->correctionMask&(1<< ANGULAR_CONVERSION))
currentPosition=get_position();
if (thisDetector->correctionMask&(1<< I0_NORMALIZATION))
currentI0=get_i0()-currentI0;
if (thisDetector->threadedProcessing==0)
processData(delflag);
#ifdef ACQVERBOSE
std::cout<< "--------------------------------------------------waiting to empty raw data queue " << queuesize << std::endl ;
#endif
} else
break;
//while (!dataQueue.empty()){
while (queuesize){
usleep(100);
// #ifdef VERBOSE
// if (iloop%10000==0)
// std::cout<< "--------------------------------------------------looping raw data queue " << queuesize << std::endl ;
// // //std::cout<< "--------------------------------------------------looping raw data queue " << dataQueue.size() << std::endl ;
// iloop++;
// //usleep(100000);
// #endif
}
#ifdef ACQVERBOSE
std::cout<< "----------------------------------------------------raw data queue is empty!" << std::endl ;
if (thisDetector->fileIndex>lastindex)
lastindex=thisDetector->fileIndex;
if (thisDetector->stoppedFlag==0) {
if (thisDetector->actionMask & (1 << headerAfter)) {
//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 acqtime=%f gainmode=%d threshold=%d badfile=%s angfile=%s bloffset=%f fineoffset=%f fffile=%s/%s tau=%f par=%s", \
thisDetector->actionScript[headerAfter], \
thisDetector->fileIndex,\
createFileName().c_str(), \
((float)thisDetector->timerValue[ACQUISITION_TIME])*1E-9, \
thisDetector->currentSettings, \
thisDetector->currentThresholdEV, \
getBadChannelCorrectionFile().c_str(), \
getAngularConversion().c_str(), \
thisDetector->globalOffset, \
thisDetector->fineOffset, \
getFlatFieldCorrectionDir(), \
getFlatFieldCorrectionFile(), \
getRateCorrectionTau(), \
thisDetector->actionParameter[headerAfter]);
#ifdef VERBOSE
cout << "Executing header after " << cmd << endl;
#endif
system(cmd);
}
} else
break;
if (thisDetector->stoppedFlag) {
#ifdef VERBOSE
std::cout<< "exiting since the detector has been stopped" << std::endl;
#endif
break;
} else if (ip<(np-1))
thisDetector->fileIndex=thisDetector->fileIndex-thisDetector->timerValue[FRAME_NUMBER];
} else if (ip<(np-1)) {
thisDetector->fileIndex=startindex;
}
} // loop on position finished
//script after
if (thisDetector->stoppedFlag==0) {
if (thisDetector->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",thisDetector->actionScript[scriptAfter],thisDetector->fileIndex,createFileName().c_str(),thisDetector->actionParameter[scriptAfter],currentScanVariable[0],currentScanVariable[1],thisDetector->scanParameter[0],thisDetector->scanParameter[1]);
#ifdef VERBOSE
cout << "------------------------------------------------------Setting file index to " << thisDetector->fileIndex << endl;
cout << "Executing script after " << cmd << endl;
#endif
system(cmd);
}
} else
break;
if (thisDetector->stoppedFlag) {
#ifdef VERBOSE
std::cout<< "exiting since the detector has been stopped" << std::endl;
#endif
break;
} else if (is1<(ns1-1)) {
thisDetector->fileIndex=startindex;
}
#ifdef ACQVERBOSE
std::cout<< "------------------------------------------------------cancelling data processing thread " << std::endl ;
}
//end scan1 loop is1
//currentScanVariable[MAX_SCAN_LEVELS];
if (thisDetector->stoppedFlag) {
#ifdef VERBOSE
std::cout<< "exiting since the detector has been stopped" << std::endl;
#endif
break;
} else if (is0<(ns0-1)) {
thisDetector->fileIndex=startindex;
}
} //end scan0 loop is0
thisDetector->fileIndex=lastindex;
if (thisDetector->stoppedFlag==0) {
if (thisDetector->actionMask & (1 << stopScript)) {
//Custom stop script. The arguments are passed as nrun=n par=p.
sprintf(cmd,"%s nrun=%d par=%s",thisDetector->actionScript[stopScript],thisDetector->fileIndex,thisDetector->actionParameter[stopScript]);
#ifdef VERBOSE
cout << "Executing stop script " << cmd << endl;
#endif
system(cmd);
}
}
if (thisDetector->threadedProcessing) {
jointhread=1;
pthread_join(dataProcessingThread, &status);
/* while (pthread_cancel(dataProcessingThread)) {
;
}*/
#ifdef ACQVERBOSE
std::cout<< "----------------------------------------------------process canceled" << std::endl;
#endif
}
}
@ -2240,21 +2796,11 @@ void* mythenDetector::processData(int delflag) {
int np;
detectorData *thisData;
int dum=1;
// thisDetector->progressIndex=0;
#ifdef VERBOSE
int iloop=0;
#endif
#ifdef ACQVERBOSE
std::cout<< " processing data - threaded mode " << thisDetector->threadedProcessing;
#endif
//pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED,&outer_c_s );
//#ifdef VERBOSE
// std::cout<< "impossible to cancel process " << std::endl;
//#endif
// pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &outer_c_s);
while(dum | thisDetector->threadedProcessing) { // ????????????????????????
@ -2264,29 +2810,20 @@ void* mythenDetector::processData(int delflag) {
/** Pop data queue */
myData=dataQueue.front(); // get the data from the queue
//dataQueue.pop(); //remove the data from the queue
if (myData) {
//process data
/** decode data */
fdata=decodeData(myData);
//delete [] myData;
// myData=NULL;
/** write raw data file */
if (thisDetector->correctionMask==0 && delflag==1) {
#ifdef ACQVERBOSE
std::cout<< "------------------------------------no processing "<< delflag <<std::endl;
#endif
#ifdef VERBOSE
cout << "********************** no processing: writing file " << createFileName().append(".raw") << endl;
#endif
writeDataFile (createFileName().append(".raw"), fdata, NULL, NULL, 'i');
delete [] fdata;
} else {
writeDataFile (createFileName().append(".raw"), fdata, NULL, NULL, 'i');
#ifdef VERBOSE
std::cout << "********************** if (thisDetector->correctionMask!=0 || delflag==0) { writing raw data file " << createFileName() <<" " << thisDetector->correctionMask<< " " << delflag << endl;
#endif
/** rate correction */
if (thisDetector->correctionMask&(1<<RATE_CORRECTION)) {
rcdata=new float[thisDetector->nChans*thisDetector->nChips*thisDetector->nMods];
@ -2315,10 +2852,6 @@ void* mythenDetector::processData(int delflag) {
if (thisDetector->correctionMask&(1<< ANGULAR_CONVERSION)) {
/** angular conversion */
/** data merging */
// if (thisDetector->numberOfPositions) {
if (currentPositionIndex<=1) {
if (thisDetector->binSize>0)
bs=thisDetector->binSize;
@ -2347,27 +2880,13 @@ void* mythenDetector::processData(int delflag) {
}
if (thisDetector->correctionMask!=0)
#ifdef VERBOSE
std::cout << "********************** writing dat data file if (thisDetector->correctionMask!=0) { " << createFileName() <<" " << thisDetector->correctionMask << endl;
#endif
writeDataFile (createFileName().append(".dat"), ffcdata, ffcerr,ang);
addToMerging(ang, ffcdata, ffcerr, mergingBins, mergingCounts,mergingErrors, mergingMultiplicity);
if ((currentPositionIndex==thisDetector->numberOfPositions) || (currentPositionIndex==0)) {
np=finalizeMerging(mergingBins, mergingCounts,mergingErrors, mergingMultiplicity);
/** file writing */
currentPositionIndex++;
if (thisDetector->correctionMask!=0)
#ifdef VERBOSE
std::cout << "********************** writing dat data file if ((currentPositionIndex==thisDetector->numberOfPositions) || (currentPositionIndex==0))" << createFileName() << endl;
#endif
writeDataFile (createFileName().append(".dat"),mergingCounts, mergingErrors, mergingBins,'f',np);
if (delflag) {
delete [] mergingBins;
@ -2381,9 +2900,6 @@ void* mythenDetector::processData(int delflag) {
thisData=new detectorData(mergingCounts,mergingErrors,mergingBins,thisDetector->progressIndex+1,(createFileName().append(".raw")).c_str(),np);
finalDataQueue.push(thisData);
#ifdef ACQVERBOSE
std::cout<< "------------------------------------pushing final data queue " << finalDataQueue.size() << " " << createFileName() << std::endl;
#endif
}
}
@ -2393,13 +2909,9 @@ void* mythenDetector::processData(int delflag) {
delete [] ffcerr;
if (ang)
delete [] ang;
//}
} else {
if (thisDetector->correctionMask!=0) {
writeDataFile (createFileName().append(".dat"), ffcdata, ffcerr);
#ifdef VERBOSE
std::cout << "********************** if (thisDetector->correctionMask!=0) writing dat data file " << createFileName() << endl;
#endif
}
if (delflag) {
if (ffcdata)
@ -2415,50 +2927,18 @@ void* mythenDetector::processData(int delflag) {
thisData=new detectorData(ffcdata,ffcerr,NULL,thisDetector->progressIndex+1,(createFileName().append(".raw")).c_str(),thisDetector->nChans*thisDetector->nChips*thisDetector->nMods);
}
finalDataQueue.push(thisData);
#ifdef VERBOSE
std::cout<< "------------------------------------pushing final data queue with " << createFileName() << " " <<finalDataQueue.size() << std::endl;
#endif
}
}
}
thisDetector->fileIndex++;
#ifdef VERBOSE
cout << "setting file index to "<< thisDetector->fileIndex << endl;
#endif
thisDetector->progressIndex++;
#ifdef ACQVERBOSE
std::cout<< "------------------------------------raw data queueto be popped " << dataQueue.size() << " empty " << !dataQueue.empty() << std::endl;
#endif
delete [] myData;
myData=NULL;
dataQueue.pop(); //remove the data from the queue
queuesize=dataQueue.size();
#ifdef ACQVERBOSE
std::cout<< "------------------------------------raw data queue popped " << dataQueue.size() << " var " << queuesize << std::endl;
#endif
}
#ifdef ACQVERBOSE
else
std::cout<< "could not pop data queue " << std::endl;
#endif
//#ifdef VERBOSE
// std::cout<< "possible to cancel process " << std::endl;
//#endif
// pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, &outer_c_s);
// pthread_testcancel();
}
// #ifdef VERBOSE
// if (iloop%10000==0)
// std::cout<< "------------------------------------process idle " << dataQueue.size() << " empty " << !dataQueue.empty() << std::endl;
// iloop++;
// #endif
if (jointhread) {
#ifdef VERBOSE
std::cout<< "acquisition finished " << dataQueue.size() << " empty " << !dataQueue.empty() << "final data queue size: " << finalDataQueue.size() <<std::endl;
#endif
if (dataQueue.size()==0)
break;
}

View File

@ -241,6 +241,30 @@ int slsDetector::initializeDetectorSize(detectorType type) {
thisDetector->binSize=0;
thisDetector->stoppedFlag=0;
thisDetector->actionMask=0;
for (int ia=0; ia<MAX_ACTIONS; ia++) {
thisDetector->actionMode[ia]=0;
strcpy(thisDetector->actionScript[ia],"none");
strcpy(thisDetector->actionParameter[ia],"none");
}
for (int iscan=0; iscan<MAX_SCAN_LEVELS; iscan++) {
thisDetector->scanMode[iscan]=0;
strcpy(thisDetector->scanScript[iscan],"none");
strcpy(thisDetector->scanParameter[iscan],"none");
thisDetector->nScanSteps[iscan]=0;
thisDetector->scanPrecision[iscan]=0;
}
/** calculates the memory offsets for flat field coefficients and errors, module structures, dacs, adcs, chips and channels */
@ -627,11 +651,27 @@ string slsDetector::createFileName() {
/*directory name +root file name */
osfn << thisDetector->filePath << "/" << thisDetector->fileName;
// scan level 0
if (thisDetector->actionMask & (1 << (MAX_ACTIONS)))
osfn << "_S" << fixed << setprecision(thisDetector->scanPrecision[0]) << currentScanVariable[0];
//scan level 1
if (thisDetector->actionMask & (1 << (MAX_ACTIONS+1)))
osfn << "_s" << fixed << setprecision(thisDetector->scanPrecision[1]) << currentScanVariable[1];
//position
if (currentPositionIndex>0 && currentPositionIndex<=thisDetector->numberOfPositions)
osfn << "_p" << currentPositionIndex;
// file index
osfn << "_" << thisDetector->fileIndex;
#ifdef VERBOSE
cout << "created file name " << osfn.str() << endl;
#endif
return osfn.str();
}
@ -3094,11 +3134,11 @@ int slsDetector::setFlatFieldCorrection(string fname){
fillBadChannelMask();
} else {
std::cout<< "Flat field data from file " << fname << " are not valid " << std::endl;
std::cout<< "Flat field data from file " << fname << " are not valid (" << nmed << "///" << xmed[nmed/2] << std::endl;
return -1;
}
} else {
std::cout<< "Flat field from file " << fname << " is not valid " << std::endl;
std::cout<< "Flat field from file " << fname << " is not valid " << nch << std::endl;
return -1;
}
}
@ -3216,6 +3256,27 @@ int slsDetector::getRateCorrection(float &t){
return 0;
};
float slsDetector::getRateCorrectionTau(){
if (thisDetector->correctionMask&(1<<RATE_CORRECTION)) {
#ifdef VERBOSE
std::cout<< "Rate correction is enabled with dead time "<< thisDetector->tDead << std::endl;
#endif
return thisDetector->tDead;
//return 1;
} else
#ifdef VERBOSE
std::cout<< "Rate correction is disabled " << std::endl;
#endif
return 0;
};
int slsDetector::getRateCorrection(){
if (thisDetector->correctionMask&(1<<RATE_CORRECTION)) {
@ -3428,6 +3489,392 @@ int slsDetector::exitServer(){
};
/**
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 slsDetector::setAction(int iaction, string fname, string par) {
if (iaction>=0 && iaction<MAX_ACTIONS) {
if (fname=="") {
thisDetector->actionMode[iaction]=0;
} else if (fname=="none") {
thisDetector->actionMode[iaction]=0;
strcpy(thisDetector->actionScript[iaction],fname.c_str());
} else {
strcpy(thisDetector->actionScript[iaction],fname.c_str());
thisDetector->actionMode[iaction]=1;
}
if (par!="") {
strcpy(thisDetector->actionParameter[iaction],par.c_str());
}
if (thisDetector->actionMode[iaction]) {
#ifdef VERBOSE
cout << iaction << " " << hex << (1 << iaction) << " " << thisDetector->actionMask << dec;
#endif
thisDetector->actionMask |= (1 << iaction);
#ifdef VERBOSE
cout << " set " << hex << thisDetector->actionMask << dec << endl;
#endif
} else {
#ifdef VERBOSE
cout << iaction << " " << hex << thisDetector->actionMask << dec;
#endif
thisDetector->actionMask &= ~(1 << iaction);
#ifdef VERBOSE
cout << " unset " << hex << thisDetector->actionMask << dec << endl;
#endif
}
#ifdef VERBOSE
cout << iaction << " Action mask set to " << hex << thisDetector->actionMask << dec << endl;
#endif
return thisDetector->actionMode[iaction];
} else
return -1;
}
int slsDetector::setActionScript(int iaction, string fname) {
#ifdef VERBOSE
#endif
return setAction(iaction,fname,"");
}
int slsDetector::setActionParameter(int iaction, string par) {
if (iaction>=0 && iaction<MAX_ACTIONS) {
if (par!="") {
strcpy(thisDetector->actionParameter[iaction],par.c_str());
}
if (thisDetector->actionMode[iaction]) {
thisDetector->actionMask |= (1 << iaction);
} else {
thisDetector->actionMask &= ~(1 << iaction);
}
return thisDetector->actionMode[iaction];
} else
return -1;
}
/**
returns action script
\param iaction can be enum {startScript, scriptBefore, headerBefore, headerAfter,scriptAfter, stopScript}
\returns action script
*/
string slsDetector::getActionScript(int iaction){
if (iaction>=0 && iaction<MAX_ACTIONS)
return string(thisDetector->actionScript[iaction]);
else
return string("wrong index");
};
/**
returns action parameter
\param iaction can be enum {startScript, scriptBefore, headerBefore, headerAfter,scriptAfter, stopScript}
\returns action parameter
*/
string slsDetector::getActionParameter(int iaction){
if (iaction>=0 && iaction<MAX_ACTIONS)
return string(thisDetector->actionParameter[iaction]);
else
return string("wrong index");
}
/**
returns action mode
\param iaction can be enum {startScript, scriptBefore, headerBefore, headerAfter,scriptAfter, stopScript}
\returns action mode
*/
int slsDetector::getActionMode(int iaction){
if (iaction>=0 && iaction<MAX_ACTIONS) {
#ifdef VERBOSE
cout << "slsDetetctor : action " << iaction << " mode is " << thisDetector->actionMode[iaction] << endl;
#endif
return thisDetector->actionMode[iaction];
} else {
#ifdef VERBOSE
cout << "slsDetetctor : wrong action index " << iaction << endl;
#endif
return -1;
}
}
/**
set scan
\param index of the scan (0,1)
\param fname for script ("" disable)
\returns 0 if scan disabled, >0 otherwise
*/
int slsDetector::setScan(int iscan, string script, int nvalues, float *values, string par, int precision) {
if (iscan>=0 && iscan<MAX_SCAN_LEVELS) {
if (script=="") {
thisDetector->scanMode[iscan]=0;
} else {
strcpy(thisDetector->scanScript[iscan],script.c_str());
if (script=="none") {
thisDetector->scanMode[iscan]=0;
} else if (script=="energy") {
thisDetector->scanMode[iscan]=1;
} else if (script=="threshold") {
thisDetector->scanMode[iscan]=2;
} else if (script=="trimbits") {
thisDetector->scanMode[iscan]=3;
} else {
thisDetector->scanMode[iscan]=4;
}
}
if (par!="")
strcpy(thisDetector->scanParameter[iscan],par.c_str());
if (nvalues>=0) {
if (nvalues==0)
thisDetector->scanMode[iscan]=0;
else {
thisDetector->nScanSteps[iscan]=nvalues;
if (nvalues>MAX_SCAN_STEPS)
thisDetector->nScanSteps[iscan]=MAX_SCAN_STEPS;
}
}
if (values) {
for (int iv=0; iv<thisDetector->nScanSteps[iscan]; iv++) {
thisDetector->scanSteps[iscan][iv]=values[iv];
}
}
if (precision>=0)
thisDetector->scanPrecision[iscan]=precision;
if (thisDetector->scanMode[iscan]>0){
thisDetector->actionMask |= 1 >> (iscan+MAX_ACTIONS);
} else {
thisDetector->actionMask &= ~(1 >> (iscan+MAX_ACTIONS));
}
return thisDetector->scanMode[iscan];
} else
return -1;
}
int slsDetector::setScanScript(int iscan, string script) {
if (iscan>=0 && iscan<MAX_SCAN_LEVELS) {
if (script=="") {
thisDetector->scanMode[iscan]=0;
} else {
strcpy(thisDetector->scanScript[iscan],script.c_str());
if (script=="none") {
thisDetector->scanMode[iscan]=0;
} else if (script=="energy") {
thisDetector->scanMode[iscan]=1;
} else if (script=="threshold") {
thisDetector->scanMode[iscan]=2;
} else if (script=="trimbits") {
thisDetector->scanMode[iscan]=3;
} else {
thisDetector->scanMode[iscan]=4;
}
}
if (thisDetector->scanMode[iscan]>0){
thisDetector->actionMask |= (1 << (iscan+MAX_ACTIONS));
} else {
thisDetector->actionMask &= ~(1 << (iscan+MAX_ACTIONS));
}
return thisDetector->scanMode[iscan];
} else
return -1;
}
int slsDetector::setScanParameter(int iscan, string par) {
if (iscan>=0 && iscan<MAX_SCAN_LEVELS) {
if (par!="")
strcpy(thisDetector->scanParameter[iscan],par.c_str());
return thisDetector->scanMode[iscan];
} else
return -1;
}
int slsDetector::setScanPrecision(int iscan, int precision) {
if (iscan>=0 && iscan<MAX_SCAN_LEVELS) {
if (precision>=0)
thisDetector->scanPrecision[iscan]=precision;
return thisDetector->scanMode[iscan];
} else
return -1;
}
int slsDetector::setScanSteps(int iscan, int nvalues, float *values) {
if (iscan>=0 && iscan<MAX_SCAN_LEVELS) {
if (nvalues>=0) {
if (nvalues==0)
thisDetector->scanMode[iscan]=0;
else {
thisDetector->nScanSteps[iscan]=nvalues;
if (nvalues>MAX_SCAN_STEPS)
thisDetector->nScanSteps[iscan]=MAX_SCAN_STEPS;
}
}
if (values) {
for (int iv=0; iv<thisDetector->nScanSteps[iscan]; iv++) {
thisDetector->scanSteps[iscan][iv]=values[iv];
}
}
if (thisDetector->scanMode[iscan]>0){
thisDetector->actionMask |= (1 << (iscan+MAX_ACTIONS));
} else {
thisDetector->actionMask &= ~(1 << (iscan+MAX_ACTIONS));
}
return thisDetector->scanMode[iscan];
} else
return -1;
}
/**
returns scan script
\param iscan can be (0,1)
\returns scan script
*/
string slsDetector::getScanScript(int iscan){
if (iscan>=0 && iscan<MAX_SCAN_LEVELS)
return string(thisDetector->scanScript[iscan]);
else
return string("wrong index");
};
/**
returns scan parameter
\param iscan can be (0,1)
\returns scan parameter
*/
string slsDetector::getScanParameter(int iscan){
if (iscan>=0 && iscan<MAX_SCAN_LEVELS)
return string(thisDetector->scanParameter[iscan]);
else
return string("wrong index");
}
/**
returns scan mode
\param iscan can be (0,1)
\returns scan mode
*/
int slsDetector::getScanMode(int iscan){
if (iscan>=0 && iscan<MAX_SCAN_LEVELS)
return thisDetector->scanMode[iscan];
else
return -1;
}
/**
returns scan steps
\param iscan can be (0,1)
\param v is the pointer to the scan steps
\returns scan steps
*/
int slsDetector::getScanSteps(int iscan, float *v) {
if (iscan>=0 && iscan<MAX_SCAN_LEVELS) {
if (v) {
for (int iv=0; iv<thisDetector->nScanSteps[iscan]; iv++) {
v[iv]=thisDetector->scanSteps[iscan][iv];
}
}
return thisDetector->nScanSteps[iscan];
} else
return -1;
}
int slsDetector::getScanPrecision(int iscan){
if (iscan>=0 && iscan<MAX_SCAN_LEVELS) {
return thisDetector->scanPrecision[iscan];
} else
return -1;
}
/*
void slsDetector::startThread() {

View File

@ -28,6 +28,8 @@ extern "C" {
#define MAX_ROIS 100
#define MAX_BADCHANS 2000
#define MAXPOS 50
#define MAX_SCAN_LEVELS 2
#define MAX_SCAN_STEPS 2000
#define NMODMAXX 24
#define NMODMAXY 24
@ -43,6 +45,9 @@ extern "C" {
enum {startScript, scriptBefore, headerBefore, headerAfter,scriptAfter, stopScript, MAX_ACTIONS};
/**
data structure to hold the detector data after postprocessing (e.g. to plot, store in a root tree etc.)
*/
@ -243,6 +248,7 @@ typedef struct sharedSlsDetector {
/** readout flags */
readOutFlags roFlags;
/* detector setup - not needed */
/** name root of the output files */
char trimFile[MAX_STR_LENGTH];
@ -255,8 +261,27 @@ typedef struct sharedSlsDetector {
/** clock divider */
//int clkDiv;
/** Scans and scripts */
int actionMask;
int actionMode[MAX_ACTIONS];
char actionScript[MAX_ACTIONS][MAX_STR_LENGTH];
char actionParameter[MAX_ACTIONS][MAX_STR_LENGTH];
int scanMode[MAX_SCAN_LEVELS];
char scanScript[MAX_SCAN_LEVELS][MAX_STR_LENGTH];
char scanParameter[MAX_SCAN_LEVELS][MAX_STR_LENGTH];
int nScanSteps[MAX_SCAN_LEVELS];
float scanSteps[MAX_SCAN_LEVELS][MAX_SCAN_STEPS];
int scanPrecision[MAX_SCAN_LEVELS];
/*offsets*/
/** memory offsets for the flat filed coefficients */
/** memory offsets for the flat field coefficients */
int ffoff;
/** memory offsets for the flat filed coefficient errors */
int fferroff;
@ -1079,7 +1104,7 @@ s
get flat field corrections file name
\returns flat field correction file name
*/
char *getFlatFieldCorrectionFile(){return thisDetector->flatFieldFile;};
char *getFlatFieldCorrectionFile(){ if (thisDetector->correctionMask&(1<<FLAT_FIELD_CORRECTION)) return thisDetector->flatFieldFile; else return "none";};
/**
set rate correction
@ -1096,6 +1121,12 @@ s
*/
int getRateCorrection(float &t);
/**
get rate correction tau
\returns 0 if rate correction disabled, otherwise the tau used for the correction
*/
float getRateCorrectionTau();
/**
get rate correction
\returns 0 if rate correction disabled, >0 otherwise
@ -1210,6 +1241,106 @@ s
/**
set action
\param iaction can be enum {startScript, scriptBefore, headerBefore, headerAfter,scriptAfter, stopScript, MAX_ACTIONS}
\param fname for script ("" disable)
\param par for script
\returns 0 if action disabled, >0 otherwise
*/
int setAction(int iaction, string fname="", string par="");
/**
set action
\param iaction can be enum {startScript, scriptBefore, headerBefore, headerAfter,scriptAfter, stopScript, MAX_ACTIONS}
\param fname for script ("" disable)
\returns 0 if action disabled, >0 otherwise
*/
int setActionScript(int iaction, string fname="");
/**
set action
\param iaction can be enum {startScript, scriptBefore, headerBefore, headerAfter,scriptAfter, stopScript, MAX_ACTIONS}
\param par for script ("" disable)
\returns 0 if action disabled, >0 otherwise
*/
int setActionParameter(int iaction, string par="");
/**
returns action script
\param iaction can be enum {startScript, scriptBefore, headerBefore, headerAfter,scriptAfter, stopScript}
\returns action script
*/
string getActionScript(int iaction);
/**
returns action parameter
\param iaction can be enum {startScript, scriptBefore, headerBefore, headerAfter,scriptAfter, stopScript}
\returns action parameter
*/
string getActionParameter(int iaction);
/**
returns action mode
\param iaction can be enum {startScript, scriptBefore, headerBefore, headerAfter,scriptAfter, stopScript}
\returns action mode
*/
int getActionMode(int iaction);
/**
set scan
\param index of the scan (0,1)
\param fname for script ("" disables, "none" disables and overwrites current)
\param nvalues number of steps (0 disables, -1 leaves current value)
\param values pointer to steps (if NULL leaves current values)
\param par parameter for the scan script ("" leaves unchanged)
\returns 0 is scan disabled, >0 otherwise
*/
int setScan(int index, string script="", int nvalues=-1, float *values=NULL, string par="", int precision=-1);
int setScanScript(int index, string script="");
int setScanParameter(int index, string par="");
int setScanPrecision(int index, int precision=-1);
int setScanSteps(int index, int nvalues=-1, float *values=NULL);
/**
returns scan script
\param iscan can be (0,1)
\returns scan script
*/
string getScanScript(int iscan);
/**
returns scan parameter
\param iscan can be (0,1)
\returns scan parameter
*/
string getScanParameter(int iscan);
/**
returns scan mode
\param iscan can be (0,1)
\returns scan mode
*/
int getScanMode(int iscan);
/**
returns scan steps
\param iscan can be (0,1)
\param v is the pointer to the scan steps
\returns scan steps
*/
int getScanSteps(int iscan, float *v=NULL);
/**
returns scan precision
\param iscan can be (0,1)
\returns scan precision
*/
int getScanPrecision(int iscan);
/**
decode data from the detector converting them to an array of floats, one for each channle
@ -1409,6 +1540,20 @@ s
/**
current scan variable of the detector
*/
float currentScanVariable[MAX_SCAN_LEVELS];
/**
current scan variable index of the detector
*/
int currentScanIndex[MAX_SCAN_LEVELS];
/** merging bins */
float *mergingBins;
@ -1422,11 +1567,6 @@ s
int *mergingMultiplicity;
/** pointer to flat field coefficients */
float *ffcoefficients;
/** pointer to flat field coefficient errors */