From 6edf6fa614c81d32a28df688b0265ac7a21051bb Mon Sep 17 00:00:00 2001 From: bergamaschi Date: Thu, 3 Nov 2011 14:37:21 +0000 Subject: [PATCH] gotthard and mythen detector merged git-svn-id: file:///afs/psi.ch/project/sls_det_software/svn/slsDetectorSoftware@42 951219d9-93cf-4727-9268-0efd64621fa3 --- .../commonFiles/sls_detector_defs.h | 27 +- .../gotthardDetector/gotthardDetector.cpp | 2531 +---------------- .../gotthardDetector/gotthardDetector.h | 188 -- 3 files changed, 106 insertions(+), 2640 deletions(-) diff --git a/slsDetectorSoftware/commonFiles/sls_detector_defs.h b/slsDetectorSoftware/commonFiles/sls_detector_defs.h index 06989312e..0b6f34031 100755 --- a/slsDetectorSoftware/commonFiles/sls_detector_defs.h +++ b/slsDetectorSoftware/commonFiles/sls_detector_defs.h @@ -254,14 +254,14 @@ enum dacIndex { VSH_POT, /**< chiptest board power supply vsh */ VIO_POT, /**< chiptest board power supply va */ HV_POT, /**< chiptest board high voltage */ - G_VREF_DS, /**< gotthard */ - G_VCASCN_PB, /**< gotthard */ - G_VCASCP_PB, /**< gotthard */ - G_VOUT_CM, /**< gotthard */ - G_VCASC_OUT, /**< gotthard */ - G_VIN_CM, /**< gotthard */ - G_VREF_COMP, /**< gotthard */ - G_IB_TESTC /**< gotthard */ + G_VREF_DS, /**< gotthard */ + G_VCASCN_PB, /**< gotthard */ + G_VCASCP_PB, /**< gotthard */ + G_VOUT_CM, /**< gotthard */ + G_VCASC_OUT, /**< gotthard */ + G_VIN_CM, /**< gotthard */ + G_VREF_COMP, /**< gotthard */ + G_IB_TESTC /**< gotthard */ }; /** @@ -316,6 +316,9 @@ enum timerIndex { GATES_NUMBER, /**< number of gates per frame (in gated mode) */ PROBES_NUMBER, /**< number of probe types in pump-probe mode */ CYCLES_NUMBER, /**< number of cycles: total number of acquisitions is number or frames*number of cycles */ + ACTUAL_TIME, /**< Actual time of the detector's internal timer */ + MEASUREMENT_TIME, /**< Time of the measurement from the detector (fifo) */ + PROGRESS /**< fraction of measurement elapsed - only get! */ }; @@ -459,11 +462,11 @@ enum { //Trimming F_EXECUTE_TRIMMING, /**< execute trimming */ - F_EXIT_SERVER, /**< turnoff detector server */ + F_EXIT_SERVER, /**< turn off detector server */ - - F_GET_ACTUAL_TIME, /**< Gets the actual time of the detector's internal timer */ - F_GET_MEASUREMENT_TIME /**< Gets the time of the measurement from the detector (fifo) */ + F_GET_TEMPERATURE, + F_SET_GOTTHARD, + F_GET_GOTTHARD /* Always append functions hereafter!!! */ diff --git a/slsDetectorSoftware/gotthardDetector/gotthardDetector.cpp b/slsDetectorSoftware/gotthardDetector/gotthardDetector.cpp index c32559196..54e7cc45c 100644 --- a/slsDetectorSoftware/gotthardDetector/gotthardDetector.cpp +++ b/slsDetectorSoftware/gotthardDetector/gotthardDetector.cpp @@ -6,1539 +6,73 @@ //using namespace std; -string gotthardDetector::executeLine(int narg, char *args[], int action) { +char* gotthardDetector::gotthardStringname(string name) { + + char retval[100]; + int fnum, set=0; + char val[100]; -#ifdef VERBOSE - for (int ia=0; ia1) - sval=string(args[1]); - else - sval="none"; - float corr[24*1280], ecorr[24*1280]; - if (getFlatFieldCorrection(corr,ecorr)) { - if (sval!="none") { - writeDataFile(sval,corr,ecorr,NULL,'i'); - return sval; - } - return string(getFlatFieldCorrectionFile()); - } else { - return string("none"); - } - } - } else if (var=="ffdir") { - if (action==PUT_ACTION) { - sval=string(args[1]); - if (sval=="none") - sval=""; - setFlatFieldCorrectionDir(sval); - } - return string(getFlatFieldCorrectionDir()); - } else if (var=="ratecorr") { - if (action==PUT_ACTION) { - sscanf(args[1],"%f",&fval); - setRateCorrection(fval); - } - float t; - if (getRateCorrection(t)) { - sprintf(answer,"%f",t); - } else { - sprintf(answer,"%f",0.); - } - return string(answer); - } else if (var=="badchannels") { - if (action==PUT_ACTION) { - sval=string(args[1]); - if (sval=="none") - sval=""; - setBadChannelCorrection(sval); - } else if (action==GET_ACTION) { - if (narg>1) - sval=string(args[1]); - else - sval="none"; - int bch[24*1280], nbch; - if ((nbch=getBadChannelCorrection(bch))) { - if (sval!="none") { - ofstream outfile; - outfile.open (sval.c_str(),ios_base::out); - if (outfile.is_open()) { - for (int ich=0; ich1) - sval=string(args[1]); - else - sval="none"; - int dir; - if (getAngularConversion(dir)) { - if (sval!="none") { - writeAngularConversion(sval.c_str()); - return sval; - } - return string(getAngularConversion()); - } else { - return string("none"); - } - } - } else if (var=="globaloff") { - if (action==PUT_ACTION) { - sscanf(args[1],"%f",&fval); - setGlobalOffset(fval); - } - sprintf(answer,"%f",getGlobalOffset()); - return string(answer); - } else if (var=="fineoff") { - if (action==PUT_ACTION) { - sscanf(args[1],"%f",&fval); - setFineOffset(fval); - } - sprintf(answer,"%f",getFineOffset()); - return string(answer); - } else if (var=="binsize") { - if (action==PUT_ACTION) { - sscanf(args[1],"%f",&fval); - setBinSize(fval); - } - sprintf(answer,"%f",getBinSize()); - return string(answer); - } else if (var=="positions") { - if (action==PUT_ACTION) { - sscanf(args[1],"%d",&ival); - float pos[ival]; - for (int ip=0; ipnarg-2) - ival=narg-2; - int ene[ival]; - for (int ie=0; ienarg-2) - ival=narg-2; - float ene[ival]; - for (int ie=0; ienarg-2) - ival=narg-2; - float ene[ival]; - for (int ie=0; ie> ival; - if (vvstr.fail()) - return string("syntax is extsig:i where signal is signal number"); - externalSignalFlag flag=GET_EXTERNAL_SIGNAL_FLAG, ret; - if (action==PUT_ACTION) { - sval=string(args[1]); -#ifdef VERBOSE - std::cout<< "sig " << ival << " flag " << sval; -#endif - if (sval=="off") flag=SIGNAL_OFF; - else if (sval=="gate_in_active_high") flag=GATE_IN_ACTIVE_HIGH; - else if (sval=="gate_in_active_low") flag=GATE_IN_ACTIVE_LOW; - else if (sval=="trigger_in_rising_edge") flag=TRIGGER_IN_RISING_EDGE; - else if (sval=="trigger_in_falling_edge") flag=TRIGGER_IN_FALLING_EDGE; - else if (sval=="ro_trigger_in_rising_edge") flag=RO_TRIGGER_IN_RISING_EDGE; - else if (sval=="ro_trigger_in_falling_edge") flag=RO_TRIGGER_IN_FALLING_EDGE; - else if (sval=="gate_out_active_high") flag=GATE_OUT_ACTIVE_HIGH; - else if (sval=="gate_out_active_low") flag=GATE_OUT_ACTIVE_LOW; - else if (sval=="trigger_out_rising_edge") flag=TRIGGER_OUT_RISING_EDGE; - else if (sval=="trigger_out_falling_edge") flag=TRIGGER_OUT_FALLING_EDGE; - else if (sval=="ro_trigger_out_rising_edge") flag=RO_TRIGGER_OUT_RISING_EDGE; - else if (sval=="ro_trigger_out_falling_edge") flag=RO_TRIGGER_OUT_FALLING_EDGE; - - - } - ret= setExternalSignalFlags(flag,ival); - switch (ret) { - case SIGNAL_OFF: - return string( "off"); - case GATE_IN_ACTIVE_HIGH: - return string( "gate_in_active_high"); - case GATE_IN_ACTIVE_LOW: - return string( "gate_in_active_low"); - case TRIGGER_IN_RISING_EDGE: - return string( "trigger_in_rising_edge"); - case TRIGGER_IN_FALLING_EDGE: - return string( "trigger_in_falling_edge"); - case RO_TRIGGER_IN_RISING_EDGE: - return string( "ro_trigger_in_rising_edge"); - case RO_TRIGGER_IN_FALLING_EDGE: - return string( "ro_trigger_in_falling_edge"); - case GATE_OUT_ACTIVE_HIGH: - return string( "gate_out_active_high"); - case GATE_OUT_ACTIVE_LOW: - return string( "gate_out_active_low"); - case TRIGGER_OUT_RISING_EDGE: - return string( "trigger_out_rising_edge"); - case TRIGGER_OUT_FALLING_EDGE: - return string( "trigger_out_falling_edge"); - case RO_TRIGGER_OUT_RISING_EDGE: - return string( "ro_trigger_out_rising_edge"); - case RO_TRIGGER_OUT_FALLING_EDGE: - return string( "ro_trigger_out_falling_edge"); - default: - return string( "unknown"); - } - } else if (var.find("modulenumber")==0) {//else if (var=="modulenumber") { - cout << "modulenumber" << endl; - if (action==PUT_ACTION) { - return string("cannot set"); - } - if (var.size()<=13) - return string("syntax is modulenumber:i where is is module number"); - istringstream vvstr(var.substr(13)); - vvstr >> ival; - if (vvstr.fail()) - return string("syntax is modulenumber:i where is is module number"); - //cout << var.substr(13) << endl; - sprintf(answer,"%llx",getId(MODULE_SERIAL_NUMBER,ival)); - return string(answer); - } else if (var=="moduleversion") { - if (action==PUT_ACTION) { - return string("cannot set" ); - } - sprintf(answer,"%llx",getId(MODULE_FIRMWARE_VERSION)); - return string(answer); - } else if (var=="detectornumber") { - if (action==PUT_ACTION) { - return string("cannot set "); - } - sprintf(answer,"%llx",getId(DETECTOR_SERIAL_NUMBER)); - return string(answer); - } else if (var=="detectorversion") { - if (action==PUT_ACTION) { - return string("cannot set "); - } - sprintf(answer,"%llx",getId(DETECTOR_FIRMWARE_VERSION)); - return string(answer); - } else if (var=="softwareversion") { - if (action==PUT_ACTION) { - return string("cannot set "); - } - sprintf(answer,"%llx",getId(DETECTOR_SOFTWARE_VERSION)); - return string(answer); - } else if (var=="thisversion") { - if (action==PUT_ACTION) { - return string("cannot set "); - } - sprintf(answer,"%llx",getId(THIS_SOFTWARE_VERSION)); - return string(answer); - } - - else if (var.find("digitest")==0) {//else if (var=="digitest") { - cout << "digitest" << endl; - if (action==PUT_ACTION) { - return string("cannot set "); - } - if (var.size()<=9) - return string("syntax is digitest:i where i is the module number"); - - - istringstream vvstr(var.substr(9)); - vvstr >> ival; - if (vvstr.fail()) - return string("syntax is digitest:i where i is the module number"); - sprintf(answer,"%x",digitalTest(CHIP_TEST, ival)); - return string(answer); - } else if (var=="bustest") { - if (action==PUT_ACTION) { - return string("cannot set "); - } - sprintf(answer,"%x",digitalTest(DETECTOR_BUS_TEST)); - return string(answer); - } else if (var=="settings") { - detectorSettings sett=GET_SETTINGS; - if (action==PUT_ACTION) { - sval=string(args[1]); - if (sval=="highgain") - sett=HIGHGAIN; - else if (sval=="dynamicgain") - sett=DYNAMICGAIN; - else if (sval=="gain1") - sett=GAIN1; - else if (sval=="gain2") - sett=GAIN2; - else if (sval=="gain3") - sett=GAIN3; - else { - sprintf(answer,"%s not defined for this detector",sval.c_str()); - return string(answer); - } - } - switch (setSettings(sett)) { - case STANDARD: - return string("standard"); - case FAST: - return string("fast"); - case HIGHGAIN: - return string("highgain"); - case DYNAMICGAIN: - return string("dynamicgain"); - case GAIN1: - return string("gain1"); - case GAIN2: - return string("gain2"); - case GAIN3: - return string("gain3"); - default: - return string("undefined"); - } - } else if (var=="threshold") { - if (action==PUT_ACTION) { - sscanf(args[1],"%d",&ival); - setThresholdEnergy(ival); - } - sprintf(answer,"%d",getThresholdEnergy()); - return string(answer); - } else if (var=="vref_ds") { - if (action==PUT_ACTION) { - sscanf(args[1],"%f",&fval); - setDAC(fval,G_VREF_DS ); - } - sprintf(answer,"%f",setDAC(-1,G_VREF_DS)); - return string(answer); - } else if (var=="vcascn_pb") { - if (action==PUT_ACTION) { - sscanf(args[1],"%f",&fval); - setDAC(fval,G_VCASCN_PB ); - } - sprintf(answer,"%f",setDAC(-1,G_VCASCN_PB)); - return string(answer); - } else if (var=="vcascp_pb") { - if (action==PUT_ACTION) { - sscanf(args[1],"%f",&fval); - setDAC(fval, G_VCASCP_PB); - } - sprintf(answer,"%f",setDAC(-1,G_VCASCP_PB)); - return string(answer); - } else if (var=="vout_cm") { - if (action==PUT_ACTION) { - sscanf(args[1],"%f",&fval); - setDAC(fval,G_VOUT_CM ); - } - sprintf(answer,"%f",setDAC(-1,G_VOUT_CM)); - return string(answer); - } else if (var=="vcasc_out") { - if (action==PUT_ACTION) { - sscanf(args[1],"%f",&fval); - setDAC(fval,G_VCASC_OUT ); - } - sprintf(answer,"%f",setDAC(-1,G_VCASC_OUT)); - return string(answer); - } else if (var=="vin_cm") { - if (action==PUT_ACTION) { - sscanf(args[1],"%f",&fval); - setDAC(fval,G_VIN_CM ); - } - sprintf(answer,"%f",setDAC(-1,G_VIN_CM)); - return string(answer); - } else if (var=="vref_comp") { - if (action==PUT_ACTION) { - sscanf(args[1],"%f",&fval); - setDAC(fval,G_VREF_COMP); - } - sprintf(answer,"%f",setDAC(-1,G_VREF_COMP)); - return string(answer); - } else if (var=="ib_test_c") { - if (action==PUT_ACTION) { - sscanf(args[1],"%f",&fval); - setDAC(fval,G_IB_TESTC ); - } - sprintf(answer,"%f",setDAC(-1,G_IB_TESTC)); - return string(answer); - } - - //////////////////////////////////////////////////////////////////////enter new stuff here if required - //timers - - else if (var=="exptime") { - if (action==PUT_ACTION) { - sscanf(args[1],"%f",&fval);// in seconds! - setTimer(ACQUISITION_TIME,(int64_t)(fval*1E+9)); - } - sprintf(answer,"%f",(float)setTimer(ACQUISITION_TIME)*1E-9); - return string(answer); - } else if (var=="period") { - if (action==PUT_ACTION) { - sscanf(args[1],"%f",&fval);// in seconds! - setTimer(FRAME_PERIOD,(int64_t)(fval*1E+9)); - } - sprintf(answer,"%f",(float)setTimer(FRAME_PERIOD)*1E-9); - return string(answer); - } else if (var=="delay") { - if (action==PUT_ACTION) { - sscanf(args[1],"%f",&fval);// in seconds! - setTimer(DELAY_AFTER_TRIGGER,(int64_t)(fval*1E+9)); - } - sprintf(answer,"%f",(float)setTimer(DELAY_AFTER_TRIGGER)*1E-9); - return string(answer); - } else if (var=="gates") { - if (action==PUT_ACTION) { - sscanf(args[1],"%d",&ival); - setTimer( GATES_NUMBER,ival); - } - - sprintf(answer,"%lld",setTimer(GATES_NUMBER)); - return string(answer); - } else if (var=="frames") { - if (action==PUT_ACTION) { - sscanf(args[1],"%d",&ival); - setTimer(FRAME_NUMBER,ival); - } - sprintf(answer,"%lld",setTimer(FRAME_NUMBER)); - return string(answer); - } else if (var=="cycles") { - if (action==PUT_ACTION) { - sscanf(args[1],"%d",&ival); - setTimer(CYCLES_NUMBER,ival); - } - sprintf(answer,"%lld",setTimer(CYCLES_NUMBER)); - return string(answer); - } else if (var=="probes") { - if (action==PUT_ACTION) { - sscanf(args[1],"%d",&ival); - setTimer(PROBES_NUMBER,ival); - } - sprintf(answer,"%lld",setTimer(PROBES_NUMBER)); - return string(answer); - } - - else if (var=="exptimel") { - if (action==PUT_ACTION) { - sprintf(answer,"Cannot set\n"); - } else - sprintf(answer,"%f",(float)getTimeLeft(ACQUISITION_TIME)*1E-9); - return string(answer); - } else if (var=="periodl") { - if (action==PUT_ACTION) { - sprintf(answer,"Cannot set\n"); - } else - sprintf(answer,"%f",(float)getTimeLeft(FRAME_PERIOD)*1E-9); - return string(answer); - } else if (var=="delayl") { - if (action==PUT_ACTION) { - sprintf(answer,"Cannot set\n"); - } else - sprintf(answer,"%f",(float)getTimeLeft(DELAY_AFTER_TRIGGER)*1E-9); - return string(answer); - } else if (var=="gatesl") { - if (action==PUT_ACTION) { - sprintf(answer,"Cannot set\n"); - } else - sprintf(answer,"%f",(float)getTimeLeft(GATES_NUMBER)); - return string(answer); - } else if (var=="framesl") { - if (action==PUT_ACTION) { - sprintf(answer,"Cannot set\n"); - } else - sprintf(answer,"%f",(float)getTimeLeft(FRAME_NUMBER)+2); - return string(answer); - } else if (var=="cyclesl") { - if (action==PUT_ACTION) { - sprintf(answer,"Cannot set\n"); - } else - sprintf(answer,"%f",(float)getTimeLeft(CYCLES_NUMBER)+2); - return string(answer); - } else if (var=="progress") { - if (action==PUT_ACTION) { - setTotalProgress(); - sprintf(answer,"Cannot set\n"); - } else - sprintf(answer,"%f",getCurrentProgress()); - return string(answer); - } - - - else if (var=="dr") { - if (action==PUT_ACTION) { - sscanf(args[1],"%d",&ival); - setDynamicRange(ival); - } - sprintf(answer,"%d",setDynamicRange()); - return string(answer); - } else if (var=="flags") { - if (action==PUT_ACTION) { - sval=string(args[1]); - readOutFlags flag=GET_READOUT_FLAGS; - if (sval=="none") - flag=NORMAL_READOUT; - //else if (sval=="pumpprobe") - // flag=PUMP_PROBE_MODE; - else if (sval=="storeinram") - flag=STORE_IN_RAM; - else if (sval=="tot") - flag=TOT_MODE; - else if (sval=="continous") - flag=CONTINOUS_RO; - setReadOutFlags(flag); - - } - - switch (setReadOutFlags(GET_READOUT_FLAGS)) { - case NORMAL_READOUT: - return string("none"); - case STORE_IN_RAM: - return string("storeinram"); - case TOT_MODE: - return string("tot"); - case CONTINOUS_RO: - return string("continous"); - default: - return string("unknown"); - } - } - /*else if (var=="settingsbits") { - if (narg>=2) { - int nm=setNumberOfModules(GET_FLAG,X)*setNumberOfModules(GET_FLAG,Y); - sls_detector_module *myMod=NULL; - sval=string(args[1]); - std::cout<< " settingsfile " << sval << std::endl; - - for (int im=0; immodule=im; - setModule(*myMod); - deleteModule(myMod); - } //else cout << "myMod NULL" << endl; - } - } - } - std::cout<< "Returning settingsfile " << std::endl; - return string(getSettingsFile()); - } else if (var.find("trim")==0) { - if (action==GET_ACTION) { - trimMode mode=NOISE_TRIMMING; - int par1=0, par2=0; - if (var.size()<=5) - return string("trim:mode fname"); - - if (var.substr(5)=="noise") { - // par1 is countlim; par2 is nsigma - mode=NOISE_TRIMMING; - par1=500; - par2=4; - } else if (var.substr(5)=="beam") { - // par1 is countlim; par2 is nsigma - mode=BEAM_TRIMMING; - par1=1000; - par2=4; - } else if (var.substr(5)=="improve") { - // par1 is maxit; if par2!=0 vthresh will be optimized - mode=IMPROVE_TRIMMING; - par1=5; - par2=0; - } else if (var.substr(5)=="fix") { - // par1 is countlim; if par2<0 then trimwithlevel else trim with median - mode=FIXEDSETTINGS_TRIMMING; - par1=1000; - par2=1; - } else if (var.substr(5)=="offline") { - mode=OFFLINE_TRIMMING; + + if (controlSocket) { + std::cout<< "controlsocket worked\n"; + if (controlSocket->Connect()>=0) { + std::cout<< "connectsocket worked\n"; + std::cout<<"fnum:"<SendDataOnly(&fnum,sizeof(fnum)); + //controlSocket->SendDataOnly(arg,sizeof(arg)); + if(set) + controlSocket->SendDataOnly(val,sizeof(val)); + controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); + if (ret==OK) { + controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); } else { - return string("Unknown trim mode ")+var.substr(5); - } - executeTrimming(mode, par1, par2); - sval=string(args[1]); - sls_detector_module *myMod=NULL; - int nm=setNumberOfModules(GET_FLAG,X)*setNumberOfModules(GET_FLAG,Y); - for (int im=0; imReceiveDataOnly(mess,sizeof(mess)); + std::cout<< "Detector returned error: " << mess << std::endl; } + controlSocket->Disconnect(); } -*/ else if (var=="clkdivider") { - if (action==PUT_ACTION) { - sscanf(args[1],"%d",&ival); - setSpeed(CLOCK_DIVIDER,ival); - } - sprintf(answer,"%d", setSpeed(CLOCK_DIVIDER)); - return string(answer); - } else if (var=="setlength") { - if (action==PUT_ACTION) { - sscanf(args[1],"%d",&ival); - setSpeed(SET_SIGNAL_LENGTH,ival); - - } - - sprintf(answer,"%d", setSpeed(SET_SIGNAL_LENGTH)); - return string(answer); - } else if (var=="waitstates") { - if (action==PUT_ACTION) { - sscanf(args[1],"%d",&ival); - setSpeed(WAIT_STATES,ival); - - } - sprintf(answer,"%d", setSpeed(WAIT_STATES)); - return string(answer); - - } else if (var=="totdivider") { - if (action==PUT_ACTION) { - sscanf(args[1],"%d",&ival); - setSpeed(TOT_CLOCK_DIVIDER,ival); - } - sprintf(answer,"%d", setSpeed(TOT_CLOCK_DIVIDER)); - return string(answer); - } else if (var=="totdutycycle") { - if (action==PUT_ACTION) { - sscanf(args[1],"%d",&ival); - setSpeed(TOT_DUTY_CYCLE,ival); - } - sprintf(answer,"%d", setSpeed(TOT_DUTY_CYCLE)); - return string(answer); - } - return ("Unknown command"); - -} - - -string gotthardDetector::helpLine( int action) { + } - - ostringstream os; - - if (action==READOUT_ACTION) { - os << "Usage is "<< std::endl << "gotthard_acquire id " << std::endl; - os << "where id is the id of the detector " << std::endl; - os << "the detector will be started, the data acquired, processed and written to file according to the preferences configured " << std::endl; - } else if (action==PUT_ACTION) { - os << "help \t This help " << std::endl; - os << std::endl; - os << "config fname\t reads the configuration file specified and sets the values " << std::endl; - os << std::endl; - os << "parameters fname\t sets the detector parameters specified in the file " << std::endl; - os << std::endl; - os << "setup rootname\t reads the files specfied (and that could be created by get setup) and resets the complete detector configuration including flatfield corrections, badchannels, trimbits etc. " << std::endl; - os << std::endl; - os << "status s \t either start or stop " << std::endl; - os << std::endl; - os << "hostname name \t Sets the detector hostname (or IP address) " << std::endl; - os << std::endl; - os << "caldir path \t Sets path of the calibration files " << std::endl; - os << std::endl; - os << "settingsdir path \t Sets path of the settings files " << std::endl; - 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; - os << std::endl; - os << "index \t start index of the files (automatically incremented by the acquisition functions)" << std::endl; - os << std::endl; - os << "nmod n \t Sets number of detector modules " << std::endl; - os << std::endl; - os << "extsig:i mode \t Sets usage of the external digital signal i. mode can be: " << std::endl; - os << "\t off"; - os << std::endl; - os << "\t gate_in_active_high"; - os << std::endl; - os << "\t gate_in_active_low"; - os << std::endl; - os << "\t trigger_in_rising_edge"; - os << std::endl; - os << "\t trigger_in_falling_edge"; - os << std::endl; - os << "\t ro_trigger_in_rising_edge"; - os << std::endl; - os << "\t ro_trigger_in_falling_edge"; - os << std::endl; - os << "\t gate_out_active_high"; - os << std::endl; - os << "\t gate_out_active_low"; - os << std::endl; - os << "\t trigger_out_rising_edge"; - os << std::endl; - os << "\t trigger_out_falling_edge"; - os << std::endl; - os << "\t ro_trigger_out_rising_edge"; - os << std::endl; - os << "\t ro_trigger_out_falling_edge" << std::endl; - os << std::endl; - os << "settings sett \t Sets detector settings. Can be: " << std::endl; - os << "\t standard \t fast \t highgain \t dynamicgain \t gain1 \t gain2 \t gain3" << std::endl; - os << "\t depending on trheshold energy and maximum count rate: please refere to manual for limit values!"<< std::endl; - os << std::endl; - os << "threshold ev \t Sets detector threshold in eV. Should be half of the beam energy. It is precise only if the detector is calibrated"<< std::endl; - os << std::endl; - os << "vthreshold dacu\t sets the detector threshold in dac units (0-1024). The energy is approx 800-15*keV" << std::endl; - os << std::endl; - - os << "vcalibration " << "dacu\t sets the calibration pulse amplitude in dac units (0-1024)." << std::endl; - os << std::endl; - os << "vtrimbit " << "dacu\t sets the trimbit amplitude in dac units (0-1024)." << std::endl; - os << std::endl; - os << "vpreamp " << "dacu\t sets the preamp feedback voltage in dac units (0-1024)." << std::endl; - os << std::endl; - os << "vshaper1 " << "dacu\t sets the shaper1 feedback voltage in dac units (0-1024)." << std::endl; - os << std::endl; - os << "vshaper2 " << "dacu\t sets the shaper2 feedback voltage in dac units (0-1024)." << std::endl; - os << std::endl; - os << "vhighvoltage " << "dacu\t CHIPTEST BOARD ONLY - sets the detector HV in dac units (0-1024)." << std::endl; - os << std::endl; - os << "vapower " << "dacu\t CHIPTEST BOARD ONLY - sets the analog power supply in dac units (0-1024)." << std::endl; - os << std::endl; - os << "vddpower " << "dacu\t CHIPTEST BOARD ONLY - sets the digital power supply in dac units (0-1024)." << std::endl; - os << std::endl; - os << "vshpower " << "dacu\t CHIPTEST BOARD ONLY - sets the comparator power supply in dac units (0-1024)." << std::endl; - os << std::endl; - os << "viopower " << "dacu\t CHIPTEST BOARD ONLY - sets the FPGA I/O power supply in dac units (0-1024)." << std::endl; - - os << std::endl; - os << "exptime t \t Sets the exposure time per frame (in s)"<< std::endl; - os << std::endl; - os << "period t \t Sets the frames period (in s)"<< std::endl; - os << std::endl; - os << "delay t \t Sets the delay after trigger (in s)"<< std::endl; - os << std::endl; - os << "gates n \t Sets the number of gates per frame"<< std::endl; - os << std::endl; - os << "frames n \t Sets the number of frames per cycle (e.g. after each trigger)"<< std::endl; - os << std::endl; - os << "cycles n \t Sets the number of cycles (e.g. number of triggers)"<< std::endl; - os << std::endl; - os << "probes n \t Sets the number of probes to accumulate (max 3)"<< std::endl; - os << std::endl; - os << "dr n \t Sets the dynamic range - can be 1, 4, 8,16 or 24 bits"<< std::endl; - os << std::endl; - os << "flags mode \t Sets the readout flags - can be none or storeinram"<< std::endl; - os << std::endl; - os << "ffdir dir \t Sets the default directory where the flat field are located"<< std::endl; - os << std::endl; - os << "flatfield fname \t Sets the flatfield file name - none disable flat field corrections"<< std::endl; - os << std::endl; - os << "ratecorr t \t Sets the rate corrections with dead time t ns (0 unsets, -1 uses default dead time for chosen settings"<< std::endl; - os << std::endl; - os << "badchannels fname \t Sets the badchannels file name - none disable bad channels corrections"<< std::endl; - os << std::endl; - os << "angconv fname \t Sets the angular conversion file name"<< std::endl; - os << std::endl; - os << "globaloff o \t sets the fixed angular offset of your encoder - should be almost constant!"<< std::endl; - os << std::endl; - os << "fineoff o \t sets a possible angular offset of your setup - should be small but can be senseful to modify"<< std::endl; - os << std::endl; - os << "binsize s\t sets the binning size of the angular conversion (otherwise defaults from the angualr conversion constants)"<< std::endl; - os << std::endl; - os << "positions np [pos0 pos1...posnp] \t sets the number of positions at which the detector is moved during the acquisition and their values"<< std::endl; - os << std::endl; - os << "threaded b \t sets whether the postprocessing and file writing of the data is done in a separate thread (0 sequencial, 1 threaded). Please remeber to set the threaded mode if you acquire long real time measurements and/or use the storeinram option otherwise you risk to lose your data"<< std::endl; - os << std::endl; - os << "online b\t sets the detector in online (1) or offline (0) state " << std::endl; - os << std::endl; - } else if (action==GET_ACTION) { - os << "help \t This help " << std::endl; - - - os << "status \t gets the detector status - can be: running, error, transmitting, finished, waiting or idle" << std::endl; - os << "data \t gets all data from the detector (if any) processes them and writes them to file according to the preferences already setup" << std::endl; - os << "frame \t gets a single frame from the detector (if any) processes it and writes it to file according to the preferences already setup" << std::endl; - os << "config fname\t writes the configuration file" << std::endl; - os << std::endl; - os << "parameters fname\t writes the main detector parameters for the measuremen tin the file " << std::endl; - os << std::endl; - os << "setup rootname\t writes the complete detector setup (including configuration, trimbits, flat field coefficients, badchannels etc.) in a set of files for which the extension is automatically generated " << std::endl; - os << std::endl; - os << "hostname \t Gets the detector hostname (or IP address) " << std::endl; - os << std::endl; - os << "caldir \t Gets path of the calibration files " << std::endl; - os << std::endl; - os << "settingsdir \t Gets path of the settings 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; - os << std::endl; - os << "index \t start index of the files (automatically incremented by the acquisition functions)" << std::endl; - os << std::endl; - os << "nmod \t Gets number of detector modules " << std::endl; - os << std::endl; - os << "maxmod \t Gets maximum number of detector modules " << std::endl; - os << std::endl; - os << "extsig:i\t Gets usage of the external digital signal i. The return value can be: " << std::endl; - os << "\t 0 off"; - os << std::endl; - os << "\t 1 gate_in_active_high"; - os << std::endl; - os << "\t 2 gate_in_active_low"; - os << std::endl; - os << "\t 3 trigger_in_rising_edge"; - os << std::endl; - os << "\t 4 trigger_in_falling_edge"; - os << std::endl; - os << "\t 5 ro_trigger_in_rising_edge"; - os << std::endl; - os << "\t 6 ro_trigger_in_falling_edge"; - os << std::endl; - os << "\t 7 gate_out_active_high"; - os << std::endl; - os << "\t 8 gate_out_active_low"; - os << std::endl; - os << "\t 9 trigger_out_rising_edge"; - os << std::endl; - os << "\t 10 trigger_out_falling_edge"; - os << std::endl; - os << "\t 11 ro_trigger_out_rising_edge"; - os << std::endl; - os << "\t 12 ro_trigger_out_falling_edge" << std::endl; - os << std::endl; - os << "modulenumber:i \t Gets the serial number of module i" << std::endl; - os << std::endl; - os << "moduleversion\t Gets the module version " << std::endl; - os << std::endl; - os << "detectornumber\t Gets the detector number (MAC address) " << std::endl; - os << std::endl; - os << "detectorversion\t Gets the detector firmware version " << std::endl; - os << std::endl; - os << "softwareversion\t Gets the detector software version " << std::endl; - os << std::endl; - os << "thisversion\t Gets the version of this software" << std::endl; - os << std::endl; - os << "digitest:i\t Makes a digital test of the detector module i. Returns 0 if it succeeds " << std::endl; - os << std::endl; - os << "bustest\t Makes a test of the detector bus. Returns 0 if it succeeds " << std::endl; - os << std::endl; - os << "settings\t Gets detector settings. Can be: " << std::endl; - os << "\t 0 standard \t 1 fast \t 2 highgain \t dynamicgain \t gain1 \t gain2 \t gain3 \t else undefined" << std::endl; - os << std::endl; - os << "threshold\t Gets detector threshold in eV. It is precise only if the detector is calibrated"<< std::endl; - os << std::endl; - os << "vthreshold \t Gets the detector threshold in dac units (0-1024). The energy is approx 800-15*keV" << std::endl; - os << std::endl; - - os << "vcalibration " << "dacu\t gets the calibration pulse amplitude in dac units (0-1024)." << std::endl; - os << std::endl; - os << "vtrimbit " << "dacu\t gets the trimbit amplitude in dac units (0-1024)." << std::endl; - os << std::endl; - os << "vpreamp " << "dacu\t gets the preamp feedback voltage in dac units (0-1024)." << std::endl; - os << std::endl; - os << "vshaper1 " << "dacu\t gets the shaper1 feedback voltage in dac units (0-1024)." << std::endl; - os << std::endl; - os << "vshaper2 " << "dacu\t gets the shaper2 feedback voltage in dac units (0-1024)." << std::endl; - os << std::endl; - os << "vhighvoltage " << "dacu\t CHIPTEST BOARD ONLY - gets the detector HV in dac units (0-1024)." << std::endl; - os << std::endl; - os << "vapower " << "dacu\t CHIPTEST BOARD ONLY - gets the analog power supply in dac units (0-1024)." << std::endl; - os << std::endl; - os << "vddpower " << "dacu\t CHIPTEST BOARD ONLY - gets the digital power supply in dac units (0-1024)." << std::endl; - os << std::endl; - os << "vshpower " << "dacu\t CHIPTEST BOARD ONLY - gets the comparator power supply in dac units (0-1024)." << std::endl; - os << std::endl; - os << "viopower " << "dacu\t CHIPTEST BOARD ONLY - gets the FPGA I/O power supply in dac units (0-1024)." << std::endl; - os << std::endl; - - - os << "exptime\t Gets the exposure time per frame (in s)"<< std::endl; - os << std::endl; - os << "period \t Gets the frames period (in s)"<< std::endl; - os << std::endl; - os << "delay \t Gets the delay after trigger (in s)"<< std::endl; - os << std::endl; - os << "gates \t Gets the number of gates per frame"<< std::endl; - os << std::endl; - os << "frames \t Gets the number of frames per cycle (e.g. after each trigger)"<< std::endl; - os << std::endl; - os << "cycles \t Gets the number of cycles (e.g. number of triggers)"<< std::endl; - os << std::endl; - os << "probes \t Gets the number of probes to accumulate (max 3)"<< std::endl; - - - - - os << "exptimel\t Gets the exposure time left in the current frame (in s)"<< std::endl; - os << std::endl; - os << "periodl \t Gets the period left in the current frame (in s)"<< std::endl; - os << std::endl; - os << "delayl \t Gets the delay after current trigger left (in s)"<< std::endl; - os << std::endl; - os << "gatesl \t Gets the number of gates left in the current frame"<< std::endl; - os << std::endl; - os << "framesl \t Gets the number of frames left (after the current trigger)"<< std::endl; - os << std::endl; - os << "cyclesl \t Gets the number of cycles left (e.g. number of triggers)"<< std::endl; - //os << std::endl; - //os << "progress \t Gets acquisition progress - to be implemented"<< std::endl; - - - - - - - - os << std::endl; - os << "dr \t Gets the dynamic range"<< std::endl; - os << std::endl; - os << "trim:mode fname \t trims the detector and writes the trimfile fname.snxx "<< std::endl; - os << "\t mode can be:\t noise\t beam\t improve\t fix\t offline "<< std::endl; - os << "Check that the start conditions are OK!!!"<< std::endl; - os << std::endl; - os << "ffdir \t Returns the default directory where the flat field are located"<< std::endl; - os << std::endl; - os << "flatfield fname \t returns wether the flat field corrections are enabled and if so writes the coefficients to the specified filename. If fname is none it is not written"<< std::endl; - os << std::endl; - os << "ratecorr \t returns wether teh rate corrections are enabled and what is the dead time used in ns"<< std::endl; - os << std::endl; - os << "badchannels fname \t returns wether the bad channels corrections are enabled and if so writes the bad channels to the specified filename. If fname is none it is not written"<< std::endl; - os << std::endl; - os << "angconv fname \t returns wether the angular conversion is enabled and if so writes the angular conversion coefficients to the specified filename. If fname is none, it is not written"<< std::endl; - os << std::endl; - os << "globaloff \t returns the fixed angular offset of your encoder - should be almost constant!"<< std::endl; - os << std::endl; - os << "fineoff \t returns a possible angualr offset of your setup - should be small but can be senseful to modify"<< std::endl; - os << std::endl; - os << "binsize \t returns the binning size of the anular conversion"<< std::endl; - os << std::endl; - os << "positions \t returns the number of positions at which the detector is moved during the acquisition and their values"<< std::endl; - os << std::endl; - os << "threaded \t gets whether the postprocessing and file writing of the data is done in a separate thread (0 sequencial, 1 threaded). Check that it is set to 1 if you acquire long real time measurements and/or use the storeinram option otherwise you risk to lose your data"<< std::endl; - os << std::endl; - os << "online \t gets the detector online (1) or offline (0) state " << std::endl; - os << std::endl; - - + //#ifdef VERBOSE + std::cout<< "Stringname set to "<< retval << std::endl; + //#endif + if (ret==FAIL) { + std::cout<< "Setting/Getting stringname failed " << std::endl; } + return retval; - - return os.str(); } + + /* detector configuration (no communication to server) */ /* @@ -2285,929 +819,46 @@ int gotthardDetector::writeCalibrationFile(string fname, float gain, float offse }; - /* Communication to server */ - - // calibration functions -/* - really needed? - -int gotthardDetector::setCalibration(int imod, detectorSettings isettings, float gain, float offset){ - std::cout<< "function not yet implemented " << std::endl; - - - - return OK; - -} -int gotthardDetector::getCalibration(int imod, detectorSettings isettings, float &gain, float &offset){ - - std::cout<< "function not yet implemented " << std::endl; - - - -} -*/ - -/* - -int gotthardDetector::setROI(int nroi, int *xmin, int *xmax, int *ymin, int *ymax){ - - -}; -*/ - -//Corrections - -int gotthardDetector::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") { - 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()); - } - } - return thisDetector->correctionMask&(1<< ANGULAR_CONVERSION); - -} - - - - - - - -int gotthardDetector::getAngularConversion(int &direction, angleConversionConstant *angconv) { - - direction=thisDetector->angDirection; - if (angconv) { - for (int imod=0; imodnMods; imod++) { - (angconv+imod)->center=thisDetector->angOff[imod].center; - (angconv+imod)->r_conversion=thisDetector->angOff[imod].r_conversion; - (angconv+imod)->offset=thisDetector->angOff[imod].offset; - (angconv+imod)->ecenter=thisDetector->angOff[imod].ecenter; - (angconv+imod)->er_conversion=thisDetector->angOff[imod].er_conversion; - (angconv+imod)->eoffset=thisDetector->angOff[imod].eoffset; - } - } - if (thisDetector->correctionMask&(1<< ANGULAR_CONVERSION)) { - return 1; - } else { - return 0; - } -} - - - -int gotthardDetector::readAngularConversion(string fname) { - string str; - ifstream infile; - int mod; - float center, ecenter; - float r_conv, er_conv; - float off, eoff; - string ss; - int interrupt=0; - - //" module %i center %E +- %E conversion %E +- %E offset %f +- %f \n" -#ifdef VERBOSE - std::cout<< "Opening file "<< fname << std::endl; -#endif - infile.open(fname.c_str(), ios_base::in); - if (infile.is_open()) { - while (infile.good() and interrupt==0) { - getline(infile,str); -#ifdef VERBOSE - std::cout<< str << std::endl; -#endif - istringstream ssstr(str); - ssstr >> ss >> mod; - ssstr >> ss >> center; - ssstr >> ss >> ecenter; - ssstr >> ss >> r_conv; - ssstr >> ss >> er_conv; - ssstr >> ss >> off; - ssstr >> ss >> eoff; - if (modnModsMax && mod>=0) { - thisDetector->angOff[mod].center=center; - thisDetector->angOff[mod].r_conversion=r_conv; - thisDetector->angOff[mod].offset=off; - thisDetector->angOff[mod].ecenter=ecenter; - thisDetector->angOff[mod].er_conversion=er_conv; - thisDetector->angOff[mod].eoffset=eoff; - } - } - } else { - std::cout<< "Could not open calibration file "<< fname << std::endl; - return -1; - } - return 0; -} - - -int gotthardDetector:: writeAngularConversion(string fname) { - - ofstream outfile; - outfile.open (fname.c_str(),ios_base::out); - if (outfile.is_open()) - { - for (int imod=0; imodnMods; imod++) { - outfile << " module " << imod << " center "<< thisDetector->angOff[imod].center<<" +- "<< thisDetector->angOff[imod].ecenter<<" conversion "<< thisDetector->angOff[imod].r_conversion << " +- "<< thisDetector->angOff[imod].er_conversion << " offset "<< thisDetector->angOff[imod].offset << " +- "<< thisDetector->angOff[imod].eoffset << std::endl; - } - outfile.close(); - } else { - std::cout<< "Could not open file " << fname << "for writing"<< std::endl; - return -1; - } - //" module %i center %E +- %E conversion %E +- %E offset %f +- %f \n" -} - -int gotthardDetector::resetMerging(float *mp, float *mv, float *me, int *mm) { - float binsize; - if (thisDetector->binSize>0) - binsize=thisDetector->binSize; - else - return FAIL; - - for (int ibin=0; ibin<(360./binsize); ibin++) { - mp[ibin]=0; - mv[ibin]=0; - me[ibin]=0; - mm[ibin]=0; - } - return OK; -} - - -int gotthardDetector::finalizeMerging(float *mp, float *mv, float *me, int *mm) { - float binsize; - int np=0; - - if (thisDetector->binSize>0) - binsize=thisDetector->binSize; - else - return FAIL; - - for (int ibin=0; ibin<(360./binsize); ibin++) { - if (mm[ibin]>0) { - mp[np]=mp[ibin]/mm[ibin]; - mv[np]=mv[ibin]/mm[ibin]; - me[np]=me[ibin]/mm[ibin]; - me[np]=sqrt(me[ibin]); - mm[np]=mm[ibin]; - np++; - } - } - return OK; -} - -int gotthardDetector::addToMerging(float *p1, float *v1, float *e1, float *mp, float *mv,float *me, int *mm) { - float binsize; - float binmi=-180., binma; - int ibin=0; - int imod; - float ang=0; - if (thisDetector->binSize>0) - binsize=thisDetector->binSize; - else - return FAIL; - binmi=-180.; - binma=binmi+binsize; - - - if (thisDetector->angDirection>0) { - for (int ip=0; ipnChans*thisDetector->nChips*thisDetector->nMods; ip++) { - if (thisDetector->correctionMask&DISCARD_BAD_CHANNELS) { - if (badChannelMask[ip]) - continue; - } - imod=ip/(thisDetector->nChans*thisDetector->nChips); - if (p1) - ang=p1[ip]; - else - ang=angle(ip,currentPosition,thisDetector->fineOffset+thisDetector->globalOffset,thisDetector->angOff[imod].r_conversion,thisDetector->angOff[imod].center, thisDetector->angOff[imod].offset,thisDetector->angOff[imod].tilt,thisDetector->angDirection); - - - - while (binmanChans*thisDetector->nChips*thisDetector->nMods-1; ip>=0; ip--) { - if (thisDetector->correctionMask&(1<< DISCARD_BAD_CHANNELS)) { - if (badChannelMask[ip]) - continue; - } - - while (binmafileIndex; - int lastindex=startindex; - char cmd[MAX_STR_LENGTH]; - //string sett; - - thisDetector->progressIndex=0; - thisDetector->stoppedFlag=0; - - - - resetFinalDataQueue(); - resetDataQueue(); - - - jointhread=0; - queuesize=0; - - - - - - if (thisDetector->threadedProcessing) { - startThread(delflag); - } - - int np=1; - 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; is0stoppedFlag==0) { - - currentScanVariable[0]=thisDetector->scanSteps[0][is0]; - currentScanIndex[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; is1stoppedFlag==0) { - - currentScanVariable[1]=thisDetector->scanSteps[1][is1]; - currentScanIndex[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; ipstoppedFlag==0) { - if (thisDetector->numberOfPositions>0) { - go_to_position (thisDetector->detPositions[ip]); - currentPositionIndex=ip+1; -#ifdef VERBOSE - 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(); - 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(); - - 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); - - - } else - break; - - //while (!dataQueue.empty()){ - while (queuesize){ - usleep(1000); - } - - - 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=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 << "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; - } - - - } - - //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) { -#ifdef VERBOSE - std::cout<< " ***********************waiting for data processing thread to finish " << queuesize << std::endl ; -#endif - jointhread=1; - pthread_join(dataProcessingThread, &status); - } -} - - -void* gotthardDetector::processData(int delflag) { - - - int *myData; - float *fdata; - float *rcdata=NULL, *rcerr=NULL; - float *ffcdata=NULL, *ffcerr=NULL; - float *ang=NULL; - float bs=0.004; - int imod; - int nb; - int np; - detectorData *thisData; - int dum=1; - string ext; - - -#ifdef ACQVERBOSE - std::cout<< " processing data - threaded mode " << thisDetector->threadedProcessing; -#endif - - if (thisDetector->correctionMask!=0) { - ext=".dat"; - } else { - ext=".raw"; - } - while(dum | thisDetector->threadedProcessing) { // ???????????????????????? - - - while( !dataQueue.empty() ) { - queuesize=dataQueue.size(); - - /** Pop data queue */ - myData=dataQueue.front(); // get the data from the queue - if (myData) { - - - - thisDetector->progressIndex++; -#ifdef VERBOSE - cout << "Progress is " << getCurrentProgress() << " \%" << endl; -#endif - - //process data - /** decode data */ - fdata=decodeData(myData); - - /** write raw data file */ - if (thisDetector->correctionMask==0 && delflag==1) { - - - writeDataFile (createFileName().append(".raw"), fdata, NULL, NULL, 'i'); - delete [] fdata; - } else { - writeDataFile (createFileName().append(".raw"), fdata, NULL, NULL, 'i'); - - /** rate correction */ - if (thisDetector->correctionMask&(1<nChans*thisDetector->nChips*thisDetector->nMods]; - rcerr=new float[thisDetector->nChans*thisDetector->nChips*thisDetector->nMods]; - rateCorrect(fdata,NULL,rcdata,rcerr); - delete [] fdata; - } else { - rcdata=fdata; - fdata=NULL; - } - - /** flat field correction */ - if (thisDetector->correctionMask&(1<nChans*thisDetector->nChips*thisDetector->nMods]; - ffcerr=new float[thisDetector->nChans*thisDetector->nChips*thisDetector->nMods]; - flatFieldCorrect(rcdata,rcerr,ffcdata,ffcerr); - delete [] rcdata; - delete [] rcerr; - } else { - ffcdata=rcdata; - ffcerr=rcerr; - rcdata=NULL; - rcerr=NULL; - } - - if (thisDetector->correctionMask&(1<< ANGULAR_CONVERSION)) { - - if (currentPositionIndex<=1) { - if (thisDetector->binSize>0) - bs=thisDetector->binSize; - else if (thisDetector->angOff[0].r_conversion>0) { - bs=180./PI*atan(thisDetector->angOff[0].r_conversion); - thisDetector->binSize=bs; - } else - thisDetector->binSize=bs; - - - nb=(int)(360./bs); - - mergingBins=new float[nb]; - mergingCounts=new float[nb]; - mergingErrors=new float[nb]; - mergingMultiplicity=new int[nb]; - - resetMerging(mergingBins, mergingCounts,mergingErrors, mergingMultiplicity); - } - /* it would be better to create an ang0 with 0 encoder position and add to merging/write to file simply specifying that offset so that when it cycles writing the data or adding to merging it also calculates the angular position */ - - ang=new float[thisDetector->nChans*thisDetector->nChips*thisDetector->nMods]; - for (int ip=0; ipnChans*thisDetector->nChips*thisDetector->nMods; ip++) { - imod=ip/(thisDetector->nChans*thisDetector->nChips); - ang[ip]=angle(ip%(thisDetector->nChans*thisDetector->nChips),currentPosition,thisDetector->fineOffset+thisDetector->globalOffset,thisDetector->angOff[imod].r_conversion,thisDetector->angOff[imod].center, thisDetector->angOff[imod].offset,thisDetector->angOff[imod].tilt,thisDetector->angDirection); - } - - if (thisDetector->correctionMask!=0) - 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) - writeDataFile (createFileName().append(".dat"),mergingCounts, mergingErrors, mergingBins,'f',np); - if (delflag) { - delete [] mergingBins; - delete [] mergingCounts; - delete [] mergingErrors; - delete [] mergingMultiplicity; - } else { - thisData=new detectorData(mergingCounts,mergingErrors,mergingBins,getCurrentProgress(),(createFileName().append(ext)).c_str(),np);/* - if (thisDetector->correctionMask!=0) { - //thisData=new detectorData(mergingCounts,mergingErrors,mergingBins,thisDetector->progressIndex+1,(createFileName().append(".dat")).c_str(),np); - thisData=new detectorData(mergingCounts,mergingErrors,mergingBins,getCurrentProgress(),(createFileName().append(".dat")).c_str(),np); - } else { - thisData=new detectorData(mergingCounts,mergingErrors,mergingBins,getCurrentProgress(),(createFileName().append(".raw")).c_str(),np); - //thisData=new detectorData(mergingCounts,mergingErrors,mergingBins,thisDetector->progressIndex+1,(createFileName().append(".raw")).c_str(),np); - }*/ - finalDataQueue.push(thisData); - } - } - - if (ffcdata) - delete [] ffcdata; - if (ffcerr) - delete [] ffcerr; - if (ang) - delete [] ang; - } else { - if (thisDetector->correctionMask!=0) { - writeDataFile (createFileName().append(".dat"), ffcdata, ffcerr); - } - if (delflag) { - if (ffcdata) - delete [] ffcdata; - if (ffcerr) - delete [] ffcerr; - if (ang) - delete [] ang; - } else { - thisData=new detectorData(ffcdata,ffcerr,NULL,getCurrentProgress(),(createFileName().append(ext)).c_str(),thisDetector->nChans*thisDetector->nChips*thisDetector->nMods);/* - if (thisDetector->correctionMask!=0) { - thisData=new detectorData(ffcdata,ffcerr,NULL,getCurrentProgress(),(createFileName().append(".dat")).c_str(),thisDetector->nChans*thisDetector->nChips*thisDetector->nMods); - //thisData=new detectorData(ffcdata,ffcerr,NULL,thisDetector->progressIndex+1,(createFileName().append(".dat")).c_str(),thisDetector->nChans*thisDetector->nChips*thisDetector->nMods); - } else { - thisData=new detectorData(ffcdata,ffcerr,NULL,getCurrentProgress(),(createFileName().append(".raw")).c_str(),thisDetector->nChans*thisDetector->nChips*thisDetector->nMods); - //thisData=new detectorData(ffcdata,ffcerr,NULL,thisDetector->progressIndex+1,(createFileName().append(".raw")).c_str(),thisDetector->nChans*thisDetector->nChips*thisDetector->nMods); - }*/ - finalDataQueue.push(thisData); - } - } - } - thisDetector->fileIndex++; - - /* - thisDetector->progressIndex++; -#ifdef VERBOSE - cout << "Progress is " << getCurrentProgress() << " \%" << endl; -#endif - */ - - delete [] myData; - myData=NULL; - dataQueue.pop(); //remove the data from the queue - queuesize=dataQueue.size(); - } - } - if (jointhread) { - if (dataQueue.size()==0) - break; - } - dum=0; - } // ???????????????????????? - return 0; - -} - - - -void gotthardDetector::startThread(int delflag) { - pthread_attr_t tattr; - int ret; - sched_param param, mparam; - int policy= SCHED_OTHER; - - - // set the priority; others are unchanged - //newprio = 30; - mparam.sched_priority =1; - param.sched_priority =1; - - - /* Initialize and set thread detached attribute */ - pthread_attr_init(&tattr); - pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_JOINABLE); - - - - // param.sched_priority = 5; - // scheduling parameters of main thread - ret = pthread_setschedparam(pthread_self(), policy, &mparam); - //#ifdef VERBOSE - // printf("current priority is %d\n",param.sched_priority); - //#endif - if (delflag) - ret = pthread_create(&dataProcessingThread, &tattr,startProcessData, (void*)this); - else - ret = pthread_create(&dataProcessingThread, &tattr,startProcessDataNoDelete, (void*)this); - - pthread_attr_destroy(&tattr); - // scheduling parameters of target thread - ret = pthread_setschedparam(dataProcessingThread, policy, ¶m); - -} - - -void* startProcessData(void *n) { - - //void* processData(void *n) { - gotthardDetector *myDet=(gotthardDetector*)n; - myDet->processData(1); - pthread_exit(NULL); - -} - -void* startProcessDataNoDelete(void *n) { - - //void* processData(void *n) { - gotthardDetector *myDet=(gotthardDetector*)n; - myDet->processData(0); - pthread_exit(NULL); - -} - -runStatus gotthardDetector::getRunStatus(){ - - - int fnum=F_GET_RUN_STATUS; - int ret=FAIL; - char mess[100]; - runStatus retval=ERROR; -#ifdef VERBOSE - std::cout<< "GOTTHARD Getting status "<< std::endl; -#endif - if (thisDetector->onlineFlag==ONLINE_FLAG) { - if (stopSocket) { - if (stopSocket->Connect()>=0) { - stopSocket->SendDataOnly(&fnum,sizeof(fnum)); - stopSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret!=OK) { - stopSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; - } else { - stopSocket->ReceiveDataOnly(&retval,sizeof(retval)); - } - stopSocket->Disconnect(); - } - } - } - return retval; - - -}; - -int64_t gotthardDetector::getTimeLeft(timerIndex index){ - - - int fnum=F_GET_TIME_LEFT; - int64_t retval; - char mess[100]; - int ret=OK; - -#ifdef VERBOSE - std::cout<< "GOTTHARD Getting timer "<< index << std::endl; -#endif - if (thisDetector->onlineFlag==ONLINE_FLAG) { - if (stopSocket) { - if (stopSocket->Connect()>=0) { - stopSocket->SendDataOnly(&fnum,sizeof(fnum)); - stopSocket->SendDataOnly(&index,sizeof(index)); - stopSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret!=OK) { - stopSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; - } else { - stopSocket->ReceiveDataOnly(&retval,sizeof(retval)); - //thisDetector->timerValue[index]=retval; - } - stopSocket->Disconnect(); - } - } - } -#ifdef VERBOSE - std::cout<< "Time left is "<< retval << std::endl; -#endif - return retval; - -}; - - - - - - - - /* - set positions for the acquisition - \param nPos number of positions - \param pos array with the encoder positions - \returns number of positions - */ -int gotthardDetector::setPositions(int nPos, float *pos){ - - if (nPos>=0) - thisDetector->numberOfPositions=nPos; - for (int ip=0; ipdetPositions[ip]=pos[ip]; - - - setTotalProgress(); - - return thisDetector->numberOfPositions; - -} -/* - get positions for the acquisition - \param pos array which will contain the encoder positions - \returns number of positions -*/ -int gotthardDetector::getPositions(float *pos){ - - if (pos ) { - for (int ip=0; ipnumberOfPositions; ip++) - pos[ip]=thisDetector->detPositions[ip]; - } - setTotalProgress(); - - - return thisDetector->numberOfPositions; -}; - +/* Please use getDAC(TEMPERATURE) instead of writing your own function*/ + +// float gotthardDetector::getTemperature(int imod){ + +// float retval; +// int fnum=F_GET_TEMPERATURE; +// int ret=FAIL; +// char mess[100]; +// //int arg = imod; + +// //#ifdef VERBOSE +// std::cout<< "GOTTHARD Getting Temperature of module "<< imod << std::endl; +// //#endif +// if (thisDetector->onlineFlag==ONLINE_FLAG) { + +// std::cout<< "onlineflag worked\n"; +// if (controlSocket) { +// std::cout<< "controlsocket worked\n"; +// if (controlSocket->Connect()>=0) { +// controlSocket->SendDataOnly(&fnum,sizeof(fnum)); +// controlSocket->SendDataOnly(&imod,sizeof(imod)); +// controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); +// if (ret==OK) { +// controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); +// } else { +// controlSocket->ReceiveDataOnly(mess,sizeof(mess)); +// std::cout<< "Detector returned error: " << mess << std::endl; +// } +// controlSocket->Disconnect(); +// } +// } +// } +// //#ifdef VERBOSE +// std::cout<< "Temperature is "<< retval << std::endl; +// //#endif +// if (ret==FAIL) { +// std::cout<< "Getting temperature failed " << std::endl; +// } +// return retval; + +// } diff --git a/slsDetectorSoftware/gotthardDetector/gotthardDetector.h b/slsDetectorSoftware/gotthardDetector/gotthardDetector.h index 7a17e8459..fbae64fe6 100644 --- a/slsDetectorSoftware/gotthardDetector/gotthardDetector.h +++ b/slsDetectorSoftware/gotthardDetector/gotthardDetector.h @@ -41,28 +41,6 @@ class gotthardDetector : public slsDetector{ - /** - executes a set of string arguments according to a given format. It is used to read/write configuration file, dump and retrieve detector settings and for the command line interface command parsing - \param narg number of arguments - \param args array of string arguments - \param action can be PUT_ACTION or GET_ACTION (from text client even READOUT_ACTION for acquisition) - \returns answer string - */ - string executeLine(int narg, char *args[], int action=GET_ACTION); - - /** - returns the help for the executeLine command - \param os output stream to return the help to - \param action can be PUT_ACTION or GET_ACTION (from text client even READOUT_ACTION for acquisition) - */ - static string helpLine(int action=GET_ACTION); - - - /** - type of action performed - */ -enum {GET_ACTION, PUT_ACTION, READOUT_ACTION}; - /** reads configuration file fname calling executeLine @@ -179,174 +157,8 @@ enum {GET_ACTION, PUT_ACTION, READOUT_ACTION}; int writeCalibrationFile(string fname, float gain, float offset); - /** - reads an angular conversion file - \param fname file to be read - \sa angleConversionConstant - */ - int readAngularConversion(string fname=""); - /** - writes an angular conversion file - \param fname file to be written - \sa angleConversionConstant - */ - int writeAngularConversion(string fname=""); - - - - //Corrections - - - /** - set angular conversion - \param fname file with angular conversion constants ("" disable) - \returns 0 if angular conversion disabled, >0 otherwise - */ - int setAngularConversion(string fname=""); - - /** - get angular conversion - \param reference to diffractometer direction - \param angconv array that will be filled with the angular conversion constants - \returns 0 if angular conversion disabled, >0 otherwise - */ - int getAngularConversion(int &direction, angleConversionConstant *angconv=NULL); - - - /** returns the angular conversion file */ - string getAngularConversion() {if (thisDetector->correctionMask&(1<< ANGULAR_CONVERSION)) return string(thisDetector->angConvFile); else return string("none");}; - - /** - set detector global offset - */ - float setGlobalOffset(float f){thisDetector->globalOffset=f; return thisDetector->globalOffset;}; - - /** - set detector fine offset - */ - float setFineOffset(float f){thisDetector->fineOffset=f; return thisDetector->fineOffset;}; - /** - get detector fine offset - */ - float getFineOffset(){return thisDetector->fineOffset;}; - - /** - get detector global offset - */ - float getGlobalOffset(){return thisDetector->globalOffset;}; - - /** - set positions for the acquisition - \param nPos number of positions - \param pos array with the encoder positions - \returns number of positions - */ - int setPositions(int nPos, float *pos); - /** - get positions for the acquisition - \param pos array which will contain the encoder positions - \returns number of positions - */ - int getPositions(float *pos=NULL); - - - /** set detector bin size used for merging (approx angular resolution)*/ - float setBinSize(float bs) {thisDetector->binSize=bs; return thisDetector->binSize;} - /** return detector bin size used for merging (approx angular resolution)*/ - float getBinSize() {return thisDetector->binSize;} - - - - - /** sets the arrays of the merged data to 0. NB The array should be created with size >= 360./getBinSize(); - \param mp already merged postions - \param mv already merged data - \param me already merged errors (squared sum) - \param mm multiplicity of merged arrays - \returns OK or FAIL - */ - int resetMerging(float *mp, float *mv,float *me, int *mm); - /** merge dataset - \param p1 angular positions of dataset - \param v1 data - \param e1 errors - \param mp already merged postions - \param mv already merged data - \param me already merged errors (squared sum) - \param mm multiplicity of merged arrays - */ - int addToMerging(float *p1, float *v1, float *e1, float *mp, float *mv,float *me, int *mm); - - /** - calculates the "final" positions, data value and errors for the emrged data - \param mp already merged postions - \param mv already merged data - \param me already merged errors (squared sum) - \param mm multiplicity of merged arrays - \returns FAIL or the - */ - int finalizeMerging(float *mp, float *mv,float *me, int *mm); - - - /** - function for processing data - \param delflag if 1 the data are deleted, else left there for further processing (or plotting?) - */ - void* processData(int delflag=1); // thread function - - /** performs the complete acquisition and data processing - moves the detector to next position
- starts and reads the detector
- reads the IC (if required)
- reads the encoder (iof required for angualr conversion)
- processes the data (flat field, rate, angular conversion and merging ::processData()) - \param delflag if 1 the data are deleted, else left there for further processing (or plotting?) - */ - - void acquire(int delflag=1); - - /** - get current timer value on the stop socket - \param index timer index - \returns elapsed time value in ns or number of...(e.g. frames, gates, probes) - */ - - int64_t getTimeLeft(timerIndex index); - - /** - get run status on the stop socket - \returns status mask - */ - runStatus getRunStatus(); - - - /** - get current temperature - \returns current temperature - */ - - float getTemperature(int imod=0); - - private: - /** - start data processing thread - */ - void startThread(int delflag=1); // - /** the data processing thread */ - - pthread_t dataProcessingThread; - - /** sets when the acquisition is finished */ - int jointhread; - - /** data queue size */ - int queuesize; }; - -static void* startProcessData(void *n); -static void* startProcessDataNoDelete(void *n); - #endif