#include "gotthardDetector.h" #include #include //using namespace std; char* gotthardDetector::gotthardStringname(string name) { char retval[100]; int fnum, set=0; char val[100]; if (name.length()==0){ fnum=F_GET_GOTTHARD; } else { fnum=F_SET_GOTTHARD; set=1; strcpy(val,name.c_str()); } int ret=FAIL; char mess[100]; // int arg[1]; // arg[0]=name; //#ifdef VERBOSE std::cout<< std::endl; if(set) std::cout<< "Setting Stringname" << std::endl; else std::cout<< "Retreiving stringname" << std::endl; //#endif 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 { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); std::cout<< "Detector returned error: " << mess << std::endl; } controlSocket->Disconnect(); } } //#ifdef VERBOSE std::cout<< "Stringname set to "<< retval << std::endl; //#endif if (ret==FAIL) { std::cout<< "Setting/Getting stringname failed " << std::endl; } return retval; } string gotthardDetector::executeLine(int narg, char *args[], int action) { #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); } else if (var=="temp") { if (action==PUT_ACTION) { return string("cannot set"); } sprintf(answer,"%f",getTemperature()); return string(answer); } //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; } 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; im> sargname; //if (ssstr.good()) { #ifdef VERBOSE std::cout<< iargval << " " << sargname << std::endl; #endif strcpy(args[iargval],sargname.c_str()); iargval++; //} } ans=executeLine(iargval,args,PUT_ACTION); #ifdef VERBOSE std::cout<< ans << std::endl; #endif } iline++; } infile.close(); } else { std::cout<< "Error opening configuration file " << fname << " for reading" << std::endl; return FAIL; } #ifdef VERBOSE std::cout<< "Read configuration file of " << iline << " lines" << std::endl; #endif return iline; }; int gotthardDetector::writeConfigurationFile(string const fname){ string names[]={\ "hostname",\ "caldir",\ "settingsdir",\ "trimen",\ "outdir",\ "ffdir",\ "headerbefore",\ "headerafter",\ "headerbeforepar",\ "headerafterpar",\ "nmod",\ "badchannels",\ "angconv",\ "globaloff",\ "binsize",\ "threaded",\ "waitstates",\ "setlength",\ "clkdivider"}; int nvar=19; ofstream outfile; int iv=0; char *args[100]; for (int ia=0; ia<100; ia++) { args[ia]=new char[1000]; } outfile.open(fname.c_str(),ios_base::out); if (outfile.is_open()) { for (iv=0; iv> sargname; // if (ssstr.good()) { strcpy(args[iargval],sargname.c_str()); #ifdef VERBOSE std::cout<< args[iargval] << std::endl; #endif iargval++; // } } if (level==2) { executeLine(iargval,args,PUT_ACTION); } else { if (string(args[0])==string("flatfield")) ; else if (string(args[0])==string("badchannels")) ; else if (string(args[0])==string("angconv")) ; else if (string(args[0])==string("trimbits")) ; else executeLine(iargval,args,PUT_ACTION); } } iline++; } infile.close(); } else { std::cout<< "Error opening " << fname << " for reading" << std::endl; return FAIL; } #ifdef VERBOSE std::cout<< "Read " << iline << " lines" << std::endl; #endif return iline; }; /* I/O */ sls_detector_module* gotthardDetector::readSettingsFile(string fname, sls_detector_module *myMod){ int nflag=0; if (myMod==NULL) { myMod=createModule(); nflag=1; } string myfname; string str; ifstream infile; ostringstream oss; int iline=0; // string names[]={"Vref", "VcascN","VcascP", "Vout", "Vcasc", "Vin", "Vref_comp", "Vib_test", "config", "HV"}; string sargname; int ival; int ichan=0, ichip=0, idac=0; #ifdef VERBOSE std::cout<< "reading settings file for module number "<< myMod->module << std::endl; #endif myfname=fname; #ifdef VERBOSE std::cout<< "settings file name is "<< myfname << std::endl; #endif infile.open(myfname.c_str(), ios_base::in); if (infile.is_open()) { for (int iarg=0; iargnDacs; iarg++) { getline(infile,str); iline++; #ifdef VERBOSE std::cout<< str << std::endl; #endif istringstream ssstr(str); ssstr >> sargname >> ival; #ifdef VERBOSE std::cout<< sargname << " dac nr. " << idac << " is " << ival << std::endl; #endif myMod->dacs[idac]=ival; idac++; } getline(infile,str); iline++; #ifdef VERBOSE std::cout<< str << std::endl; #endif istringstream ssstr(str); ssstr >> sargname >> ival; #ifdef VERBOSE std::cout<< sargname << " (config) is " << ival << std::endl; #endif int configval = ival;//myMod->dacs[idac]=ival; getline(infile,str); iline++; #ifdef VERBOSE std::cout<< str << std::endl; #endif istringstream sstr(str); sstr >> sargname >> ival; #ifdef VERBOSE std::cout<< sargname << " (HV) is " << ival << std::endl; #endif int HVval = ival;//myMod->dacs[idac]=ival; infile.close(); strcpy(thisDetector->settingsFile,fname.c_str()); return myMod; } else { std::cout<< "could not open settings file " << myfname << std::endl; if (nflag) deleteModule(myMod); return NULL; } }; int gotthardDetector::writeSettingsFile(string fname, sls_detector_module mod){ ofstream outfile; string names[]={"Vref", "VcascN","VcascP", "Vout", "Vcasc", "Vin", "Vref_comp", "Vib_test", "config", "HV"}; int iv, ichan, ichip; int iv1, idac; int nb; outfile.open(fname.c_str(), ios_base::out); if (outfile.is_open()) { for (idac=0; idacnChans; ichan++) { iv=mod.chanregs[ichip*thisDetector->nChans+ichan]; iv1= (iv&0x3f); outfile <>nb); outfile << iv1 << " "; nb=8; iv1=((iv&(1<>nb); outfile << iv1 << " "; nb=7; iv1=((iv&(1<>nb); outfile <>nb); outfile << iv1 << " "; nb=11; iv1= ((iv&0xfffff800)>>nb); outfile << iv1 << std::endl; } } outfile.close(); return OK; } else { std::cout<< "could not open trim file " << fname << std::endl; return FAIL; } }; int gotthardDetector::writeSettingsFile(string fname, int imod){ return writeSettingsFile(fname,detectorModules[imod]); }; int gotthardDetector::writeDataFile(string fname, float *data, float *err, float *ang, char dataformat, int nch){ if (nch==-1) nch=thisDetector->nChans*thisDetector->nChips*thisDetector->nMods; ofstream outfile; int idata; if (data==NULL) return FAIL; // args|=0x10; // one line per channel! outfile.open (fname.c_str(),ios_base::out); if (outfile.is_open()) { #ifdef VERBOSE std::cout<< "writeDataFile Writing to file " << fname << std::endl; #endif for (int ichan=0; ichannChans*thisDetector->nChips*thisDetector->nMods; ichan++) outfile << ichan << " " << *(data+ichan) << std::endl; outfile.close(); return OK; } else { std::cout<< "Could not open file " << fname << "for writing"<< std::endl; return FAIL; } }; int gotthardDetector::readDataFile(string fname, float *data, float *err, float *ang, char dataformat, int nch){ ifstream infile; int ichan, iline=0; int interrupt=0; float fdata, ferr, fang; int maxchans; int ich; string str; if (nch==0) maxchans=thisDetector->nChans*thisDetector->nChips*thisDetector->nMods; else if (nch<0) maxchans=0xfffffff; else maxchans=nch; #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); if (ang==NULL) { ssstr >> ichan >> fdata; ich=ichan; if (!ssstr.good()) { interrupt=1; break; } if (ich!=iline) std::cout<< "Channel number " << ichan << " does not match with line number " << iline << " " << dataformat << std::endl; } else { ssstr >> fang >> fdata; ich=iline; } if (!ssstr.good()) { interrupt=1; break; } if (err) ssstr >> ferr; if (!ssstr.good()) { interrupt=1; break; } if (ich> ichan >> idata; if (!ssstr.good()) { interrupt=1; break; } if (ichan!=iline) { std::cout<< " Expected channel "<< iline <<" but read channel "<< ichan << std::endl; interrupt=1; break; } else { if (ilinenChans*thisDetector->nChips*thisDetector->nMods) { data[iline]=idata; iline++; } else { interrupt=1; break; } } } } else { std::cout<< "Could not read file " << fname << std::endl; return -1; } return iline; }; int gotthardDetector::readCalibrationFile(string fname, float &gain, float &offset){ string str; ifstream infile; #ifdef VERBOSE std::cout<< "Opening file "<< fname << std::endl; #endif infile.open(fname.c_str(), ios_base::in); if (infile.is_open()) { getline(infile,str); #ifdef VERBOSE std::cout<< str << std::endl; #endif istringstream ssstr(str); ssstr >> offset >> gain; } else { std::cout<< "Could not open calibration file "<< fname << std::endl; gain=0.; offset=0.; return -1; } return 0; }; int gotthardDetector::writeCalibrationFile(string fname, float gain, float offset){ //std::cout<< "Function not yet implemented " << std::endl; ofstream outfile; outfile.open (fname.c_str()); // >> i/o operations here << if (outfile.is_open()) { outfile << offset << " " << gain << std::endl; } else { std::cout<< "Could not open calibration file "<< fname << " for writing" << std::endl; return -1; } outfile.close(); return 0; }; /* 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; }; 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; }