mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-04-24 15:20:02 +02:00
Raw data file write/read now uses absolute channel values in multidetector systems. Flat field and bad channel corrections and angular conversion debugged
git-svn-id: file:///afs/psi.ch/project/sls_det_software/svn/slsDetectorSoftware@135 951219d9-93cf-4727-9268-0efd64621fa3
This commit is contained in:
parent
5e086b9ee6
commit
461fd8824f
@ -1,14 +1,12 @@
|
|||||||
CFLAGS= -DC_ONLY
|
CFLAGS= -DC_ONLY
|
||||||
FLAGS=-DVERBOSE
|
FLAGS=-DVERBOSE
|
||||||
INCLUDES= -IcommonFiles -IslsDetector -IMySocketTCP -IusersFunctions -ImultiSlsDetector -IslsDetectorUtils -IslsDetectorCommand
|
INCLUDES= -IcommonFiles -IslsDetector -IMySocketTCP -IusersFunctions -ImultiSlsDetector -IslsDetectorUtils -IslsDetectorCommand
|
||||||
#-I eigerDetector -ImythenDetector -IgotthardDetector
|
|
||||||
#EPICSFLAGS=-D EPICS -I/usr/local/epics/base/include/ -I /usr/local/epics/base/include/os/Linux/ -L /usr/local/epics/base/lib/SL5-x86/ -Wl,-R/usr/local/epics/base/lib/SL5-x86 -lca -lCom
|
#EPICSFLAGS=-D EPICS -I/usr/local/epics/base/include/ -I /usr/local/epics/base/include/os/Linux/ -L /usr/local/epics/base/lib/SL5-x86/ -Wl,-R/usr/local/epics/base/lib/SL5-x86 -lca -lCom
|
||||||
|
|
||||||
|
|
||||||
SRC_CLNT= slsDetector/slsDetector.cpp MySocketTCP/MySocketTCP.cpp usersFunctions/usersFunctions.c multiSlsDetector/multiSlsDetector.cpp slsDetector/slsDetectorUtils.cpp slsDetector/slsDetectorCommand.cpp
|
SRC_CLNT= slsDetector/slsDetector.cpp MySocketTCP/MySocketTCP.cpp usersFunctions/usersFunctions.c multiSlsDetector/multiSlsDetector.cpp slsDetector/slsDetectorUtils.cpp slsDetector/slsDetectorCommand.cpp
|
||||||
#mythenDetector/mythenDetector.cpp eigerDetector/eigerDetector.cpp gotthardDetector/gotthardDetector.cpp
|
|
||||||
SRC_MYTHEN_SVC = mythenDetectorServer/server.c mythenDetectorServer/server_funcs.c mythenDetectorServer/communication_funcs.c mythenDetectorServer/firmware_funcs.c mythenDetectorServer/mcb_funcs.c mythenDetectorServer/trimming_funcs.c
|
SRC_MYTHEN_SVC = mythenDetectorServer/server.c mythenDetectorServer/server_funcs.c mythenDetectorServer/communication_funcs.c mythenDetectorServer/firmware_funcs.c mythenDetectorServer/mcb_funcs.c mythenDetectorServer/trimming_funcs.c
|
||||||
#mythenDetectorServer/sharedmemory.c
|
|
||||||
|
|
||||||
all: package mythenServer doc picassoServer
|
all: package mythenServer doc picassoServer
|
||||||
|
|
||||||
@ -33,10 +31,9 @@ package: $(SRC_CLNT)
|
|||||||
$(CXX) -fPIC -g -o objs/slsDetectorUtils.o -c -Wall slsDetector/slsDetectorUtils.cpp $(INCLUDES) $(FLAGS)
|
$(CXX) -fPIC -g -o objs/slsDetectorUtils.o -c -Wall slsDetector/slsDetectorUtils.cpp $(INCLUDES) $(FLAGS)
|
||||||
$(CXX) -fPIC -g -o objs/slsDetector.o -c -Wall slsDetector/slsDetector.cpp $(INCLUDES) $(FLAGS)
|
$(CXX) -fPIC -g -o objs/slsDetector.o -c -Wall slsDetector/slsDetector.cpp $(INCLUDES) $(FLAGS)
|
||||||
$(CXX) -fPIC -g -o objs/multiSlsDetector.o -c -Wall multiSlsDetector/multiSlsDetector.cpp $(INCLUDES) $(FLAGS)
|
$(CXX) -fPIC -g -o objs/multiSlsDetector.o -c -Wall multiSlsDetector/multiSlsDetector.cpp $(INCLUDES) $(FLAGS)
|
||||||
$(CXX) -fPIC -g -o objs/usersFunctions.o -c -Wall usersFunctions/usersFunctions.c $(INCLUDES) $(FLAGS) $(EPICSFLAGS)
|
$(CXX) -fPIC -g -o objs/usersFunctions.o -c -Wall usersFunctions/usersFunctions.c $(INCLUDES) $(FLAGS) $(EPICSFLAGS)
|
||||||
$(CXX) -fPIC -g -o objs/MySocketTCP.o -c -Wall MySocketTCP/MySocketTCP.cpp $(INCLUDES) $(FLAGS)
|
$(CXX) -fPIC -g -o objs/MySocketTCP.o -c -Wall MySocketTCP/MySocketTCP.cpp $(INCLUDES) $(FLAGS)
|
||||||
$(CXX) -shared -Wl,-soname,libSlsDetector.so.1 -o libSlsDetector.so.1.0.1 objs/slsDetector.o objs/slsDetectorUtils.o objs/slsDetectorCommand.o objs/multiSlsDetector.o objs/usersFunctions.o objs/MySocketTCP.o -lc $(INCLUDES) $(FLAGS) $(EPICSFLAGS)
|
$(CXX) -shared -Wl,-soname,libSlsDetector.so.1 -o libSlsDetector.so.1.0.1 objs/slsDetector.o objs/slsDetectorUtils.o objs/slsDetectorCommand.o objs/multiSlsDetector.o objs/usersFunctions.o objs/MySocketTCP.o -lc $(INCLUDES) $(FLAGS) $(EPICSFLAGS)
|
||||||
#objs/mythenDetector.o objs/gotthardDetector.o
|
|
||||||
ln -sf libSlsDetector.so libSlsDetector.so.1
|
ln -sf libSlsDetector.so libSlsDetector.so.1
|
||||||
ln -sf libSlsDetector.so libSlsDetector.so.1.0.1
|
ln -sf libSlsDetector.so libSlsDetector.so.1.0.1
|
||||||
ar rcs libSlsDetector.a objs/slsDetector.o objs/usersFunctions.o objs/MySocketTCP.o objs/multiSlsDetector.o objs/slsDetectorUtils.o objs/slsDetectorCommand.o
|
ar rcs libSlsDetector.a objs/slsDetector.o objs/usersFunctions.o objs/MySocketTCP.o objs/multiSlsDetector.o objs/slsDetectorUtils.o objs/slsDetectorCommand.o
|
||||||
|
@ -105,6 +105,7 @@ multiSlsDetector::multiSlsDetector(int id) : slsDetectorUtils(), shmId(-1)
|
|||||||
thisMultiDetector->dataBytes=0;
|
thisMultiDetector->dataBytes=0;
|
||||||
thisMultiDetector->numberOfChannels=0;
|
thisMultiDetector->numberOfChannels=0;
|
||||||
|
|
||||||
|
thisMultiDetector->maxNumberOfChannels=0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -225,15 +226,15 @@ multiSlsDetector::multiSlsDetector(int id) : slsDetectorUtils(), shmId(-1)
|
|||||||
&thisMultiDetector->fileIndex);
|
&thisMultiDetector->fileIndex);
|
||||||
|
|
||||||
|
|
||||||
#ifdef VERBOSE
|
// #ifdef VERBOSE
|
||||||
cout << "filling bad channel mask" << endl;
|
// cout << "filling bad channel mask" << endl;
|
||||||
#endif
|
// #endif
|
||||||
/** fill the BadChannelMask \sa fillBadChannelMask */
|
// /** fill the BadChannelMask \sa fillBadChannelMask */
|
||||||
fillBadChannelMask();
|
// fillBadChannelMask();
|
||||||
|
|
||||||
#ifdef VERBOSE
|
// #ifdef VERBOSE
|
||||||
cout << "done" << endl;
|
// cout << "done" << endl;
|
||||||
#endif
|
// #endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -297,7 +298,8 @@ int multiSlsDetector::addSlsDetector(int id, int pos) {
|
|||||||
|
|
||||||
thisMultiDetector->dataBytes+=detectors[pos]->getDataBytes();
|
thisMultiDetector->dataBytes+=detectors[pos]->getDataBytes();
|
||||||
|
|
||||||
thisMultiDetector->numberOfChannels+=detectors[pos]->getNChans()*detectors[pos]->getNChips()*detectors[pos]->getNMods();
|
thisMultiDetector->numberOfChannels+=detectors[pos]->getTotalNumberOfChannels();
|
||||||
|
thisMultiDetector->maxNumberOfChannels-=detectors[j]->getMaxNumberOfChannels();
|
||||||
|
|
||||||
#ifdef VERBOSE
|
#ifdef VERBOSE
|
||||||
cout << "Detector added " << thisMultiDetector->numberOfDetectors<< endl;
|
cout << "Detector added " << thisMultiDetector->numberOfDetectors<< endl;
|
||||||
@ -528,7 +530,8 @@ int multiSlsDetector::removeSlsDetector(int pos) {
|
|||||||
if (detectors[j]) {
|
if (detectors[j]) {
|
||||||
|
|
||||||
thisMultiDetector->dataBytes-=detectors[j]->getDataBytes();
|
thisMultiDetector->dataBytes-=detectors[j]->getDataBytes();
|
||||||
thisMultiDetector->numberOfChannels-=detectors[j]->getNChans()*detectors[pos]->getNChips()*detectors[pos]->getNMods();
|
thisMultiDetector->numberOfChannels-=detectors[j]->getTotalNumberOfChannels();
|
||||||
|
thisMultiDetector->maxNumberOfChannels-=detectors[j]->getMaxNumberOfChannels();
|
||||||
|
|
||||||
delete detectors[j];
|
delete detectors[j];
|
||||||
thisMultiDetector->numberOfDetectors--;
|
thisMultiDetector->numberOfDetectors--;
|
||||||
@ -738,7 +741,7 @@ int multiSlsDetector::getThresholdEnergy(int pos) {
|
|||||||
ret=detectors[i]->getThresholdEnergy();
|
ret=detectors[i]->getThresholdEnergy();
|
||||||
if (ret1==-100)
|
if (ret1==-100)
|
||||||
ret1=ret;
|
ret1=ret;
|
||||||
else if (ret!=ret1)
|
else if (ret<(ret1-200) || ret>(ret1+200))
|
||||||
ret1=FAIL;
|
ret1=FAIL;
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -767,11 +770,17 @@ int multiSlsDetector::setThresholdEnergy(int e_eV, int pos, detectorSettings ise
|
|||||||
for (i=posmin; i<posmax; i++) {
|
for (i=posmin; i<posmax; i++) {
|
||||||
if (detectors[i]) {
|
if (detectors[i]) {
|
||||||
ret=detectors[i]->setThresholdEnergy(e_eV,-1,isettings);
|
ret=detectors[i]->setThresholdEnergy(e_eV,-1,isettings);
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "detetcor " << i << " threshold " << ret << endl;
|
||||||
|
#endif
|
||||||
if (ret1==-100)
|
if (ret1==-100)
|
||||||
ret1=ret;
|
ret1=ret;
|
||||||
else if (ret!=ret1)
|
else if (ret<(ret1-200) || ret>(ret1+200))
|
||||||
ret1=FAIL;
|
ret1=FAIL;
|
||||||
|
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "return value " << ret1 << endl;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -1350,14 +1359,14 @@ float* multiSlsDetector::decodeData(int *datain) {
|
|||||||
float *dataout=new float[thisMultiDetector->numberOfChannels];
|
float *dataout=new float[thisMultiDetector->numberOfChannels];
|
||||||
int ich=0;
|
int ich=0;
|
||||||
float *detp;
|
float *detp;
|
||||||
int *datap=datain;
|
int *datap=datain;
|
||||||
|
|
||||||
|
|
||||||
for (int i=0; i<thisMultiDetector->numberOfDetectors; i++) {
|
for (int i=0; i<thisMultiDetector->numberOfDetectors; i++) {
|
||||||
if (detectors[i]) {
|
if (detectors[i]) {
|
||||||
detp=detectors[i]->decodeData(datap);
|
detp=detectors[i]->decodeData(datap);
|
||||||
datap+=detectors[i]->getDataBytes();
|
datap+=detectors[i]->getDataBytes()/sizeof(int);
|
||||||
for (int j=0; j<detectors[i]->getNChans()*detectors[i]->getNChips()*detectors[i]->getNMods(); j++) {
|
for (int j=0; j<detectors[i]->getTotalNumberOfChannels(); j++) {
|
||||||
dataout[ich]=detp[j];
|
dataout[ich]=detp[j];
|
||||||
ich++;
|
ich++;
|
||||||
}
|
}
|
||||||
@ -1429,7 +1438,7 @@ int multiSlsDetector::setFlatFieldCorrection(string fname){
|
|||||||
|
|
||||||
for (int ichan=0; ichan<nch; ichan++) {
|
for (int ichan=0; ichan<nch; ichan++) {
|
||||||
if (detectors[idet]) {
|
if (detectors[idet]) {
|
||||||
if (ichdet>=detectors[idet]->getNChans()*detectors[idet]->getNChips()*detectors[idet]->getNMods()) {
|
if (ichdet>=detectors[idet]->getTotalNumberOfChannels()) {
|
||||||
ichdet=0;
|
ichdet=0;
|
||||||
detectors[idet]->setBadChannelCorrection(nbad,badlist,1);
|
detectors[idet]->setBadChannelCorrection(nbad,badlist,1);
|
||||||
idet++;
|
idet++;
|
||||||
@ -1468,13 +1477,18 @@ int multiSlsDetector::setFlatFieldCorrection(string fname){
|
|||||||
|
|
||||||
idet=0;
|
idet=0;
|
||||||
ichdet=0;
|
ichdet=0;
|
||||||
|
int detoff=0;
|
||||||
|
|
||||||
for (int ichan=0; ichan<nch; ichan++) {
|
for (int ichan=0; ichan<nch; ichan++) {
|
||||||
|
|
||||||
if (detectors[idet]) {
|
if (detectors[idet]) {
|
||||||
if (ichdet>=detectors[idet]->getNChans()*detectors[idet]->getNChips()*detectors[idet]->getNMods()) {
|
if (ichdet>=detectors[idet]->getTotalNumberOfChannels()) {
|
||||||
detectors[idet]->setFlatFieldCorrection(ffcoefficients+ichdet, fferrors+ichdet);
|
#ifdef VERBOSE
|
||||||
ichdet=ichan;
|
cout << "Set flat field detector " << idet << "(offset "<< detoff << ")" << endl;
|
||||||
|
#endif
|
||||||
|
detectors[idet]->setFlatFieldCorrection(ffcoefficients+detoff, fferrors+detoff);
|
||||||
|
ichdet=0;//ichan;
|
||||||
|
detoff=ichan;
|
||||||
idet++;
|
idet++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1487,9 +1501,13 @@ int multiSlsDetector::setFlatFieldCorrection(string fname){
|
|||||||
ffcoefficients[ichan]=0.;
|
ffcoefficients[ichan]=0.;
|
||||||
fferrors[ichan]=1.;
|
fferrors[ichan]=1.;
|
||||||
}
|
}
|
||||||
|
ichdet++;
|
||||||
}
|
}
|
||||||
if (detectors[idet]) {
|
if (detectors[idet]) {
|
||||||
detectors[idet]->setFlatFieldCorrection(ffcoefficients+ichdet, fferrors+ichdet);
|
#ifdef VERBOSE
|
||||||
|
cout << "**Set flat field detector " << idet << "(offset "<< detoff << ")" << endl;
|
||||||
|
#endif
|
||||||
|
detectors[idet]->setFlatFieldCorrection(ffcoefficients+detoff, fferrors+detoff);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
std::cout<< "Flat field data from file " << fname << " are not valid (" << nmed << "///" << xmed[nmed/2] << std::endl;
|
std::cout<< "Flat field data from file " << fname << " are not valid (" << nmed << "///" << xmed[nmed/2] << std::endl;
|
||||||
@ -1500,7 +1518,7 @@ int multiSlsDetector::setFlatFieldCorrection(string fname){
|
|||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
std::cout<< "Flat field from file " << fname << " is not valid " << nch << std::endl;
|
std::cout<< "Flat field from file " << fname << " is not valid " << nch << std::endl;
|
||||||
thisMultiDetector->correctionMask&=~(1<<FLAT_FIELD_CORRECTION);
|
thisMultiDetector->correctionMask&=~(1<<FLAT_FIELD_CORRECTION);
|
||||||
for (int i=0; i<thisMultiDetector->numberOfDetectors; i++) {
|
for (int i=0; i<thisMultiDetector->numberOfDetectors; i++) {
|
||||||
@ -1531,7 +1549,7 @@ int multiSlsDetector::setFlatFieldCorrection(float *corr, float *ecorr) {
|
|||||||
else
|
else
|
||||||
ep=NULL;
|
ep=NULL;
|
||||||
detectors[idet]->setFlatFieldCorrection(p, ep);
|
detectors[idet]->setFlatFieldCorrection(p, ep);
|
||||||
ichdet+=detectors[idet]->getNChans()*detectors[idet]->getNChips()*detectors[idet]->getNMods();
|
ichdet+=detectors[idet]->getTotalNumberOfChannels();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -1559,7 +1577,7 @@ int multiSlsDetector::getFlatFieldCorrection(float *corr, float *ecorr) {
|
|||||||
else
|
else
|
||||||
ep=NULL;
|
ep=NULL;
|
||||||
detectors[idet]->getFlatFieldCorrection(p, ep);
|
detectors[idet]->getFlatFieldCorrection(p, ep);
|
||||||
ichdet+=detectors[idet]->getNChans()*detectors[idet]->getNChips()*detectors[idet]->getNMods();
|
ichdet+=detectors[idet]->getTotalNumberOfChannels();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -1590,10 +1608,16 @@ int multiSlsDetector::getFlatFieldCorrection(float *corr, float *ecorr) {
|
|||||||
int multiSlsDetector::flatFieldCorrect(float* datain, float *errin, float* dataout, float *errout){
|
int multiSlsDetector::flatFieldCorrect(float* datain, float *errin, float* dataout, float *errout){
|
||||||
|
|
||||||
int ichdet=0;
|
int ichdet=0;
|
||||||
|
float *pdata, *perr=errin;
|
||||||
for (int idet=0; idet<thisMultiDetector->numberOfDetectors; idet++) {
|
for (int idet=0; idet<thisMultiDetector->numberOfDetectors; idet++) {
|
||||||
if (detectors[idet]) {
|
if (detectors[idet]) {
|
||||||
detectors[idet]->flatFieldCorrect(datain+ichdet, errin+ichdet, dataout+ichdet, errout+ichdet);
|
#ifdef VERBOSE
|
||||||
ichdet+=detectors[idet]->getNChans()*detectors[idet]->getNChips()*detectors[idet]->getNMods();
|
cout << " detector " << idet << " offset " << ichdet << endl;
|
||||||
|
#endif
|
||||||
|
if (errin)
|
||||||
|
perr+=ichdet;
|
||||||
|
detectors[idet]->flatFieldCorrect(datain+ichdet, perr, dataout+ichdet, errout+ichdet);
|
||||||
|
ichdet+=detectors[idet]->getTotalNumberOfChannels();//detectors[idet]->getNChans()*detectors[idet]->getNChips()*detectors[idet]->getNMods();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -1677,10 +1701,13 @@ int multiSlsDetector::getRateCorrection(){
|
|||||||
int multiSlsDetector::rateCorrect(float* datain, float *errin, float* dataout, float *errout){
|
int multiSlsDetector::rateCorrect(float* datain, float *errin, float* dataout, float *errout){
|
||||||
|
|
||||||
int ichdet=0;
|
int ichdet=0;
|
||||||
|
float *perr=errin;
|
||||||
for (int idet=0; idet<thisMultiDetector->numberOfDetectors; idet++) {
|
for (int idet=0; idet<thisMultiDetector->numberOfDetectors; idet++) {
|
||||||
if (detectors[idet]) {
|
if (detectors[idet]) {
|
||||||
detectors[idet]->rateCorrect(datain+ichdet, errin+ichdet, dataout+ichdet, errout+ichdet);
|
if (errin)
|
||||||
ichdet+=detectors[idet]->getNChans()*detectors[idet]->getNChips()*detectors[idet]->getNMods();
|
perr+=ichdet;
|
||||||
|
detectors[idet]->rateCorrect(datain+ichdet, perr, dataout+ichdet, errout+ichdet);
|
||||||
|
ichdet+=detectors[idet]->getTotalNumberOfChannels();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -1696,9 +1723,16 @@ int multiSlsDetector::setBadChannelCorrection(string fname){
|
|||||||
fname=string(thisMultiDetector->badChanFile);
|
fname=string(thisMultiDetector->badChanFile);
|
||||||
|
|
||||||
int ret=setBadChannelCorrection(fname, nbad, badlist);
|
int ret=setBadChannelCorrection(fname, nbad, badlist);
|
||||||
|
#ifdef VERBOSE
|
||||||
if (ret==0)
|
cout << "file contained " << ret << " badcahns" << endl;
|
||||||
|
#endif
|
||||||
|
if (ret==0) {
|
||||||
|
thisMultiDetector->correctionMask&=~(1<<DISCARD_BAD_CHANNELS);
|
||||||
nbad=0;
|
nbad=0;
|
||||||
|
} else {
|
||||||
|
thisMultiDetector->correctionMask|=(1<<DISCARD_BAD_CHANNELS);
|
||||||
|
strcpy(thisMultiDetector->badChanFile,fname.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
return setBadChannelCorrection(nbad,badlist,0);
|
return setBadChannelCorrection(nbad,badlist,0);
|
||||||
|
|
||||||
@ -1717,9 +1751,12 @@ int multiSlsDetector::setBadChannelCorrection(int nbad, int *badlist, int ff) {
|
|||||||
|
|
||||||
for (int ich=0; ich<nbad; ich++) {
|
for (int ich=0; ich<nbad; ich++) {
|
||||||
if (detectors[idet]) {
|
if (detectors[idet]) {
|
||||||
while ((badlist[ich]-choff)>=detectors[idet]->getNChans()*detectors[idet]->getNChips()*detectors[idet]->getNMods()) {
|
if ((badlist[ich]-choff)>=detectors[idet]->getTotalNumberOfChannels()) {
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "setting " << nbaddet << " badchans to detector " << idet << endl;
|
||||||
|
#endif
|
||||||
detectors[idet]->setBadChannelCorrection(nbaddet,badlist,0);
|
detectors[idet]->setBadChannelCorrection(nbaddet,badlist,0);
|
||||||
choff+=detectors[idet]->getNChans()*detectors[idet]->getNChips()*detectors[idet]->getNMods();
|
choff+=detectors[idet]->getTotalNumberOfChannels();
|
||||||
nbaddet=0;
|
nbaddet=0;
|
||||||
idet++;
|
idet++;
|
||||||
if (detectors[idet]==NULL)
|
if (detectors[idet]==NULL)
|
||||||
@ -1727,10 +1764,26 @@ int multiSlsDetector::setBadChannelCorrection(int nbad, int *badlist, int ff) {
|
|||||||
}
|
}
|
||||||
badlistdet[nbaddet]=(badlist[ich]-choff);
|
badlistdet[nbaddet]=(badlist[ich]-choff);
|
||||||
nbaddet++;
|
nbaddet++;
|
||||||
|
cout << nbaddet << " " << badlist[ich] << " " << badlistdet[nbaddet-1] << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (nbaddet>0) {
|
||||||
|
|
||||||
|
if (detectors[idet]) {
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "setting " << nbaddet << " badchans to detector " << idet << endl;
|
||||||
|
#endif
|
||||||
|
detectors[idet]->setBadChannelCorrection(nbaddet,badlist,0);
|
||||||
|
choff+=detectors[idet]->getTotalNumberOfChannels();
|
||||||
|
nbaddet=0;
|
||||||
|
idet++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
nbaddet=0;
|
nbaddet=0;
|
||||||
for (int i=idet; i<thisMultiDetector->numberOfDetectors; i++) {
|
for (int i=idet; i<thisMultiDetector->numberOfDetectors; i++) {
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "setting " << 0 << " badchans to detector " << i << endl;
|
||||||
|
#endif
|
||||||
if (detectors[i]) {
|
if (detectors[i]) {
|
||||||
detectors[i]->setBadChannelCorrection(nbaddet,badlist,0);
|
detectors[i]->setBadChannelCorrection(nbaddet,badlist,0);
|
||||||
}
|
}
|
||||||
@ -1740,12 +1793,17 @@ int multiSlsDetector::setBadChannelCorrection(int nbad, int *badlist, int ff) {
|
|||||||
nbaddet=0;
|
nbaddet=0;
|
||||||
for (int i=0; i<thisMultiDetector->numberOfDetectors; i++) {
|
for (int i=0; i<thisMultiDetector->numberOfDetectors; i++) {
|
||||||
if (detectors[idet]) {
|
if (detectors[idet]) {
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "setting " << 0 << " badchans to detector " << idet << endl;
|
||||||
|
#endif
|
||||||
detectors[idet]->setBadChannelCorrection(nbaddet,badlist,0);
|
detectors[idet]->setBadChannelCorrection(nbaddet,badlist,0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
thisMultiDetector->correctionMask&=~(1<<DISCARD_BAD_CHANNELS);
|
thisMultiDetector->correctionMask&=~(1<<DISCARD_BAD_CHANNELS);
|
||||||
}
|
}
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << (thisMultiDetector->correctionMask&(1<<DISCARD_BAD_CHANNELS)) << endl;
|
||||||
|
#endif
|
||||||
return thisMultiDetector->correctionMask&(1<<DISCARD_BAD_CHANNELS);
|
return thisMultiDetector->correctionMask&(1<<DISCARD_BAD_CHANNELS);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -1784,6 +1842,9 @@ int multiSlsDetector::readAngularConversion(string fname) {
|
|||||||
|
|
||||||
for (int idet=0; idet<thisMultiDetector->numberOfDetectors; idet++) {
|
for (int idet=0; idet<thisMultiDetector->numberOfDetectors; idet++) {
|
||||||
if (detectors[idet]) {
|
if (detectors[idet]) {
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << " detector " << idet << endl;
|
||||||
|
#endif
|
||||||
detectors[idet]->readAngularConversion(infile);
|
detectors[idet]->readAngularConversion(infile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1918,6 +1979,24 @@ int multiSlsDetector::setChannel(long long reg, int ichan, int ichip, int imod)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
sets the value of s angular conversion parameter
|
||||||
|
\param c can be ANGULAR_DIRECTION, GLOBAL_OFFSET, FINE_OFFSET, BIN_SIZE
|
||||||
|
\param v the value to be set
|
||||||
|
\returns the actual value
|
||||||
|
*/
|
||||||
|
|
||||||
|
float multiSlsDetector::setAngularConversionParameter(angleConversionParameter c, float v) {
|
||||||
|
float ret=slsDetectorUtils::setAngularConversionParameter(c,v);
|
||||||
|
for (int idet=0; idet<thisMultiDetector->numberOfDetectors; idet++) {
|
||||||
|
|
||||||
|
if (detectors[idet]) {
|
||||||
|
|
||||||
|
detectors[idet]->setAngularConversionParameter(c,v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -1931,10 +2010,10 @@ float* multiSlsDetector::convertAngles(float pos) {
|
|||||||
|
|
||||||
if (detectors[idet]) {
|
if (detectors[idet]) {
|
||||||
p=detectors[idet]->convertAngles(pos);
|
p=detectors[idet]->convertAngles(pos);
|
||||||
for (int ich=0; ich<detectors[idet]->getNChans()*detectors[idet]->getNChips()*detectors[idet]->getNMods(); ich++) {
|
for (int ich=0; ich<detectors[idet]->getTotalNumberOfChannels(); ich++) {
|
||||||
ang[choff+ich]=p[ich];
|
ang[choff+ich]=p[ich];
|
||||||
}
|
}
|
||||||
choff+=detectors[idet]->getNChans()*detectors[idet]->getNChips()*detectors[idet]->getNMods();
|
choff+=detectors[idet]->getTotalNumberOfChannels();
|
||||||
delete [] p;
|
delete [] p;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1953,12 +2032,12 @@ int multiSlsDetector::getBadChannelCorrection(int *bad) {
|
|||||||
bd = new int[nd];
|
bd = new int[nd];
|
||||||
nd=detectors[idet]->getBadChannelCorrection(bd);
|
nd=detectors[idet]->getBadChannelCorrection(bd);
|
||||||
for (int id=0; id<nd; id++) {
|
for (int id=0; id<nd; id++) {
|
||||||
if (bd[id]<detectors[idet]->getNChans()*detectors[idet]->getNChips()*detectors[idet]->getNMods()) {
|
if (bd[id]<detectors[idet]->getTotalNumberOfChannels()) {
|
||||||
if (bad) bad[ntot]=choff+bd[id];
|
if (bad) bad[ntot]=choff+bd[id];
|
||||||
ntot++;
|
ntot++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
choff+=detectors[idet]->getNChans()*detectors[idet]->getNChips()*detectors[idet]->getNMods();
|
choff+=detectors[idet]->getTotalNumberOfChannels();
|
||||||
delete [] bd;
|
delete [] bd;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2408,7 +2487,7 @@ int multiSlsDetector::setDynamicRange(int p) {
|
|||||||
if (detectors[idet]) {
|
if (detectors[idet]) {
|
||||||
ret1=detectors[idet]->setDynamicRange(p);
|
ret1=detectors[idet]->setDynamicRange(p);
|
||||||
thisMultiDetector->dataBytes+=detectors[idet]->getDataBytes();
|
thisMultiDetector->dataBytes+=detectors[idet]->getDataBytes();
|
||||||
thisMultiDetector->numberOfChannels+=detectors[idet]->getNChans()*detectors[idet]->getNChips()*detectors[idet]->getNMods();
|
thisMultiDetector->numberOfChannels+=detectors[idet]->getTotalNumberOfChannels();
|
||||||
if (ret==-100)
|
if (ret==-100)
|
||||||
ret=ret1;
|
ret=ret1;
|
||||||
else if (ret!=ret1)
|
else if (ret!=ret1)
|
||||||
@ -2459,7 +2538,7 @@ int multiSlsDetector::setNumberOfModules(int p, dimension d) {
|
|||||||
}
|
}
|
||||||
ret+=detectors[idet]->setNumberOfModules(nm);
|
ret+=detectors[idet]->setNumberOfModules(nm);
|
||||||
thisMultiDetector->dataBytes+=detectors[idet]->getDataBytes();
|
thisMultiDetector->dataBytes+=detectors[idet]->getDataBytes();
|
||||||
thisMultiDetector->numberOfChannels+=detectors[idet]->getNChans()*detectors[idet]->getNChips()*detectors[idet]->getNMods();
|
thisMultiDetector->numberOfChannels+=detectors[idet]->getTotalNumberOfChannels();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
@ -2471,7 +2550,7 @@ int multiSlsDetector::decodeNMod(int i, int &id, int &im) {
|
|||||||
cout << " Module " << i << " belongs to detector ";
|
cout << " Module " << i << " belongs to detector ";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (i<0 || i>=setNumberOfModules()) {
|
if (i<0 || i>=getMaxNumberOfModules()) {
|
||||||
id=-1;
|
id=-1;
|
||||||
im=-1;
|
im=-1;
|
||||||
#ifdef VERBOSE
|
#ifdef VERBOSE
|
||||||
@ -3090,3 +3169,161 @@ int multiSlsDetector::loadImageToDetector(imageType t, string s) {
|
|||||||
int multiSlsDetector::testFunction(int times) {
|
int multiSlsDetector::testFunction(int times) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int multiSlsDetector::writeDataFile(string fname, float *data, float *err, float *ang, char dataformat, int nch) {
|
||||||
|
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "using overloaded multiSlsDetector function to write formatted data file " << endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
ofstream outfile;
|
||||||
|
int idata, choff=0, off=0;
|
||||||
|
float *pe=err, *pa=ang;
|
||||||
|
int nch_left=nch, n;
|
||||||
|
|
||||||
|
if (nch_left<=0)
|
||||||
|
nch_left=getTotalNumberOfChannels();
|
||||||
|
|
||||||
|
|
||||||
|
if (data==NULL)
|
||||||
|
return FAIL;
|
||||||
|
|
||||||
|
// args|=0x10; // one line per channel!
|
||||||
|
|
||||||
|
outfile.open (fname.c_str(),ios_base::out);
|
||||||
|
if (outfile.is_open())
|
||||||
|
{
|
||||||
|
|
||||||
|
for (int i=0; i<thisMultiDetector->numberOfDetectors; i++) {
|
||||||
|
if (detectors[i]) {
|
||||||
|
n=detectors[i]->getTotalNumberOfChannels();
|
||||||
|
if (nch_left<n)
|
||||||
|
n=nch_left;
|
||||||
|
detectors[i]->writeDataFile(outfile,n, data+off, pe, pa, dataformat, choff);
|
||||||
|
nch_left-=n;
|
||||||
|
choff+=detectors[i]->getMaxNumberOfChannels();
|
||||||
|
off+=n;
|
||||||
|
if (pe)
|
||||||
|
pe=pe+off;
|
||||||
|
if (pa)
|
||||||
|
pa=pa+off;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
outfile.close();
|
||||||
|
return OK;
|
||||||
|
} else {
|
||||||
|
std::cout<< "Could not open file " << fname << "for writing"<< std::endl;
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int multiSlsDetector::writeDataFile(string fname, int *data) {
|
||||||
|
ofstream outfile;
|
||||||
|
int choff=0, off=0;
|
||||||
|
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "using overloaded multiSlsDetector function to write raw data file " << endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (data==NULL)
|
||||||
|
return FAIL;
|
||||||
|
|
||||||
|
outfile.open (fname.c_str(),ios_base::out);
|
||||||
|
if (outfile.is_open())
|
||||||
|
{
|
||||||
|
for (int i=0; i<thisMultiDetector->numberOfDetectors; i++) {
|
||||||
|
if (detectors[i]) {
|
||||||
|
detectors[i]->writeDataFile(outfile, detectors[i]->getTotalNumberOfChannels(), data+off, choff);
|
||||||
|
choff+=detectors[i]->getMaxNumberOfChannels();
|
||||||
|
off+=detectors[i]->getTotalNumberOfChannels();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
outfile.close();
|
||||||
|
return OK;
|
||||||
|
} else {
|
||||||
|
std::cout<< "Could not open file " << fname << "for writing"<< std::endl;
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int multiSlsDetector::readDataFile(string fname, float *data, float *err, float *ang, char dataformat){
|
||||||
|
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "using overloaded multiSlsDetector function to read formatted data file " << endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ifstream infile;
|
||||||
|
int ichan, iline=0;
|
||||||
|
int interrupt=0;
|
||||||
|
string str;
|
||||||
|
int choff=0, off=0;
|
||||||
|
float *pe=err, *pa=ang;
|
||||||
|
|
||||||
|
#ifdef VERBOSE
|
||||||
|
std::cout<< "Opening file "<< fname << std::endl;
|
||||||
|
#endif
|
||||||
|
infile.open(fname.c_str(), ios_base::in);
|
||||||
|
if (infile.is_open()) {
|
||||||
|
|
||||||
|
for (int i=0; i<thisMultiDetector->numberOfDetectors; i++) {
|
||||||
|
if (detectors[i]) {
|
||||||
|
iline+=detectors[i]->readDataFile(detectors[i]->getTotalNumberOfChannels(), infile, data+off, pe, pa, dataformat, choff);
|
||||||
|
choff+=detectors[i]->getMaxNumberOfChannels();
|
||||||
|
off+=detectors[i]->getTotalNumberOfChannels();
|
||||||
|
if (pe)
|
||||||
|
pe=pe+off;
|
||||||
|
if (pa)
|
||||||
|
pa=pa+off;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
infile.close();
|
||||||
|
} else {
|
||||||
|
std::cout<< "Could not read file " << fname << std::endl;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return iline;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int multiSlsDetector::readDataFile(string fname, int *data) {
|
||||||
|
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "using overloaded multiSlsDetector function to read raw data file " << endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ifstream infile;
|
||||||
|
int ichan, iline=0;
|
||||||
|
int interrupt=0;
|
||||||
|
string str;
|
||||||
|
int choff=0, off=0;
|
||||||
|
|
||||||
|
#ifdef VERBOSE
|
||||||
|
std::cout<< "Opening file "<< fname << std::endl;
|
||||||
|
#endif
|
||||||
|
infile.open(fname.c_str(), ios_base::in);
|
||||||
|
if (infile.is_open()) {
|
||||||
|
|
||||||
|
for (int i=0; i<thisMultiDetector->numberOfDetectors; i++) {
|
||||||
|
if (detectors[i]) {
|
||||||
|
iline+=detectors[i]->readDataFile(infile, data+off,detectors[i]->getTotalNumberOfChannels(), choff);
|
||||||
|
choff+=detectors[i]->getMaxNumberOfChannels();
|
||||||
|
off+=detectors[i]->getTotalNumberOfChannels();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
infile.close();
|
||||||
|
} else {
|
||||||
|
std::cout<< "Could not read file " << fname << std::endl;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return iline;
|
||||||
|
}
|
||||||
|
@ -86,6 +86,9 @@ class multiSlsDetector : public slsDetectorUtils {
|
|||||||
/** total number of channels for all detectors */
|
/** total number of channels for all detectors */
|
||||||
int numberOfChannels;
|
int numberOfChannels;
|
||||||
|
|
||||||
|
/** total number of channels for all detectors */
|
||||||
|
int maxNumberOfChannels;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** timer values */
|
/** timer values */
|
||||||
@ -273,6 +276,8 @@ class multiSlsDetector : public slsDetectorUtils {
|
|||||||
|
|
||||||
int getTotalNumberOfChannels(){return thisMultiDetector->numberOfChannels;};
|
int getTotalNumberOfChannels(){return thisMultiDetector->numberOfChannels;};
|
||||||
|
|
||||||
|
int getMaxNumberOfChannels(){return thisMultiDetector->maxNumberOfChannels;};
|
||||||
|
|
||||||
float getScanStep(int index, int istep){return thisMultiDetector->scanSteps[index][istep];};
|
float getScanStep(int index, int istep){return thisMultiDetector->scanSteps[index][istep];};
|
||||||
/** returns the detector offset (in number of channels)
|
/** returns the detector offset (in number of channels)
|
||||||
\param pos position of the detector
|
\param pos position of the detector
|
||||||
@ -894,6 +899,68 @@ class multiSlsDetector : public slsDetectorUtils {
|
|||||||
*/
|
*/
|
||||||
int testFunction(int times=0);
|
int testFunction(int times=0);
|
||||||
|
|
||||||
|
/**
|
||||||
|
sets the value of s angular conversion parameter
|
||||||
|
\param c can be ANGULAR_DIRECTION, GLOBAL_OFFSET, FINE_OFFSET, BIN_SIZE
|
||||||
|
\param v the value to be set
|
||||||
|
\returns the actual value
|
||||||
|
*/
|
||||||
|
|
||||||
|
float setAngularConversionParameter(angleConversionParameter c, float v);
|
||||||
|
|
||||||
|
/**
|
||||||
|
|
||||||
|
writes a data file
|
||||||
|
\param name of the file to be written
|
||||||
|
\param data array of data values
|
||||||
|
\param err array of arrors on the data. If NULL no errors will be written
|
||||||
|
|
||||||
|
\param ang array of angular values. If NULL data will be in the form chan-val(-err) otherwise ang-val(-err)
|
||||||
|
\param dataformat format of the data: can be 'i' integer or 'f' float (default)
|
||||||
|
\param nch number of channels to be written to file. if -1 defaults to the number of installed channels of the detector
|
||||||
|
\returns OK or FAIL if it could not write the file or data=NULL
|
||||||
|
\sa mythenDetector::writeDataFile
|
||||||
|
|
||||||
|
*/
|
||||||
|
int writeDataFile(string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int nch=-1);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
|
||||||
|
writes a data file
|
||||||
|
\param name of the file to be written
|
||||||
|
\param data array of data values
|
||||||
|
\returns OK or FAIL if it could not write the file or data=NULL
|
||||||
|
\sa mythenDetector::writeDataFile
|
||||||
|
*/
|
||||||
|
int writeDataFile(string fname, int *data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
|
||||||
|
reads a data file
|
||||||
|
\param name of the file to be read
|
||||||
|
\param data array of data values to be filled
|
||||||
|
\param err array of arrors on the data. If NULL no errors are expected on the file
|
||||||
|
|
||||||
|
\param ang array of angular values. If NULL data are expected in the form chan-val(-err) otherwise ang-val(-err)
|
||||||
|
\param dataformat format of the data: can be 'i' integer or 'f' float (default)
|
||||||
|
\param nch number of channels to be written to file. if <=0 defaults to the number of installed channels of the detector
|
||||||
|
\returns OK or FAIL if it could not read the file or data=NULL
|
||||||
|
|
||||||
|
\sa mythenDetector::readDataFile
|
||||||
|
*/
|
||||||
|
int readDataFile(string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f');
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
|
||||||
|
reads a data file
|
||||||
|
\param name of the file to be read
|
||||||
|
\param data array of data values
|
||||||
|
\returns OK or FAIL if it could not read the file or data=NULL
|
||||||
|
\sa mythenDetector::readDataFile
|
||||||
|
*/
|
||||||
|
int readDataFile(string fname, int *data);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
@ -670,15 +670,15 @@ int slsDetector::initializeDetectorSize(detectorType type) {
|
|||||||
#ifdef VERBOSE
|
#ifdef VERBOSE
|
||||||
cout << "done" << endl;
|
cout << "done" << endl;
|
||||||
#endif
|
#endif
|
||||||
#ifdef VERBOSE
|
// #ifdef VERBOSE
|
||||||
cout << "filling bad channel mask" << endl;
|
// cout << "filling bad channel mask" << endl;
|
||||||
#endif
|
// #endif
|
||||||
/** fill the BadChannelMask \sa fillBadChannelMask */
|
// /** fill the BadChannelMask \sa fillBadChannelMask */
|
||||||
fillBadChannelMask();
|
// fillBadChannelMask();
|
||||||
|
|
||||||
#ifdef VERBOSE
|
// #ifdef VERBOSE
|
||||||
cout << "done" << endl;
|
// cout << "done" << endl;
|
||||||
#endif
|
// #endif
|
||||||
|
|
||||||
/** modifies the last PID accessing the detector */
|
/** modifies the last PID accessing the detector */
|
||||||
thisDetector->lastPID=getpid();
|
thisDetector->lastPID=getpid();
|
||||||
@ -1041,6 +1041,7 @@ int slsDetector::setTCPSocket(string const name, int const control_port, int con
|
|||||||
int slsDetector::connectControl() {
|
int slsDetector::connectControl() {
|
||||||
if (controlSocket)
|
if (controlSocket)
|
||||||
return controlSocket->Connect();
|
return controlSocket->Connect();
|
||||||
|
return FAIL;
|
||||||
}
|
}
|
||||||
/** disconnect from the control port */
|
/** disconnect from the control port */
|
||||||
int slsDetector::disconnectControl() {
|
int slsDetector::disconnectControl() {
|
||||||
@ -1055,6 +1056,7 @@ int slsDetector::disconnectControl() {
|
|||||||
int slsDetector::connectData() {
|
int slsDetector::connectData() {
|
||||||
if (dataSocket)
|
if (dataSocket)
|
||||||
return dataSocket->Connect();
|
return dataSocket->Connect();
|
||||||
|
return FAIL;
|
||||||
};
|
};
|
||||||
/** disconnect from the data port */
|
/** disconnect from the data port */
|
||||||
int slsDetector::disconnectData(){
|
int slsDetector::disconnectData(){
|
||||||
@ -1068,6 +1070,7 @@ int slsDetector::disconnectControl() {
|
|||||||
int slsDetector::connectStop() {
|
int slsDetector::connectStop() {
|
||||||
if (stopSocket)
|
if (stopSocket)
|
||||||
return stopSocket->Connect();
|
return stopSocket->Connect();
|
||||||
|
return FAIL;
|
||||||
};
|
};
|
||||||
/** disconnect from the stop port */
|
/** disconnect from the stop port */
|
||||||
int slsDetector::disconnectStop(){
|
int slsDetector::disconnectStop(){
|
||||||
@ -4021,7 +4024,10 @@ int slsDetector::setFlatFieldCorrection(string fname){
|
|||||||
|
|
||||||
int slsDetector::setFlatFieldCorrection(float *corr, float *ecorr) {
|
int slsDetector::setFlatFieldCorrection(float *corr, float *ecorr) {
|
||||||
if (corr!=NULL) {
|
if (corr!=NULL) {
|
||||||
for (int ichan=0; ichan<thisDetector->nMod[X]*thisDetector->nMod[Y]*thisDetector->nChans*thisDetector->nChips; ichan++) {
|
for (int ichan=0; ichan<thisDetector->nMod[X]*thisDetector->nChans*thisDetector->nChips; ichan++) {
|
||||||
|
// #ifdef VERBOSE
|
||||||
|
// std::cout<< ichan << " "<< corr[ichan] << std::endl;
|
||||||
|
// #endif
|
||||||
ffcoefficients[ichan]=corr[ichan];
|
ffcoefficients[ichan]=corr[ichan];
|
||||||
if (ecorr!=NULL)
|
if (ecorr!=NULL)
|
||||||
fferrors[ichan]=ecorr[ichan];
|
fferrors[ichan]=ecorr[ichan];
|
||||||
@ -4079,16 +4085,19 @@ int slsDetector::flatFieldCorrect(float* datain, float *errin, float* dataout, f
|
|||||||
std::cout<< "Flat field correcting data" << std::endl;
|
std::cout<< "Flat field correcting data" << std::endl;
|
||||||
#endif
|
#endif
|
||||||
float e, eo;
|
float e, eo;
|
||||||
if (thisDetector->correctionMask&(1<<FLAT_FIELD_CORRECTION)) {
|
if (thisDetector->correctionMask & (1<<FLAT_FIELD_CORRECTION)) {
|
||||||
for (int ichan=0; ichan<thisDetector->nMod[X]*thisDetector->nMod[Y]*thisDetector->nChans*thisDetector->nChips; ichan++) {
|
for (int ichan=0; ichan<thisDetector->nMod[X]*thisDetector->nChans*thisDetector->nChips; ichan++) {
|
||||||
if (errin==NULL)
|
if (errin==NULL) {
|
||||||
e=0;
|
e=0;
|
||||||
else
|
} else {
|
||||||
e=errin[ichan];
|
e=errin[ichan];
|
||||||
|
}
|
||||||
flatFieldCorrect(datain[ichan],e,dataout[ichan],eo,ffcoefficients[ichan],fferrors[ichan]);
|
flatFieldCorrect(datain[ichan],e,dataout[ichan],eo,ffcoefficients[ichan],fferrors[ichan]);
|
||||||
if (errout)
|
if (errout)
|
||||||
errout[ichan]=eo;
|
errout[ichan]=eo;
|
||||||
|
// #ifdef VERBOSE
|
||||||
|
// cout << ichan << " " <<datain[ichan]<< " " << ffcoefficients[ichan]<< " " << dataout[ichan] << endl;
|
||||||
|
// #endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -4209,22 +4218,29 @@ int slsDetector::setBadChannelCorrection(string fname){
|
|||||||
|
|
||||||
|
|
||||||
int slsDetector::setBadChannelCorrection(int nch, int *chs, int ff) {
|
int slsDetector::setBadChannelCorrection(int nch, int *chs, int ff) {
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "setting " << nch << " bad chans " << endl;
|
||||||
|
#endif
|
||||||
if (ff==0) {
|
if (ff==0) {
|
||||||
if (nch<MAX_BADCHANS) {
|
if (nch<MAX_BADCHANS && nch>0) {
|
||||||
|
thisDetector->correctionMask|=(1<<DISCARD_BAD_CHANNELS);
|
||||||
thisDetector->nBadChans=nch;
|
thisDetector->nBadChans=nch;
|
||||||
for (int ich=0 ;ich<nch; ich++) {
|
for (int ich=0 ;ich<nch; ich++) {
|
||||||
thisDetector->badChansList[ich]=chs[ich];
|
thisDetector->badChansList[ich]=chs[ich];
|
||||||
}
|
}
|
||||||
}
|
} else
|
||||||
|
thisDetector->correctionMask&=~(1<<DISCARD_BAD_CHANNELS);
|
||||||
} else {
|
} else {
|
||||||
if (nch<MAX_BADCHANS) {
|
if (nch<MAX_BADCHANS && nch>0) {
|
||||||
thisDetector->nBadFF=nch;
|
thisDetector->nBadFF=nch;
|
||||||
for (int ich=0 ;ich<nch; ich++) {
|
for (int ich=0 ;ich<nch; ich++) {
|
||||||
thisDetector->badFFList[ich]=chs[ich];
|
thisDetector->badFFList[ich]=chs[ich];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "badchans flag is "<< (thisDetector->correctionMask&(1<< DISCARD_BAD_CHANNELS)) << endl;
|
||||||
|
#endif
|
||||||
fillBadChannelMask();
|
fillBadChannelMask();
|
||||||
if (thisDetector->correctionMask&(1<< DISCARD_BAD_CHANNELS)) {
|
if (thisDetector->correctionMask&(1<< DISCARD_BAD_CHANNELS)) {
|
||||||
return thisDetector->nBadChans+thisDetector->nBadFF;
|
return thisDetector->nBadChans+thisDetector->nBadFF;
|
||||||
|
@ -601,9 +601,14 @@ typedef struct sharedSlsDetector {
|
|||||||
/** Returns the number of modules (without connecting to the detector) */
|
/** Returns the number of modules (without connecting to the detector) */
|
||||||
int getNMods(){return thisDetector->nMods;}; //
|
int getNMods(){return thisDetector->nMods;}; //
|
||||||
|
|
||||||
|
/** Returns the number of modules (without connecting to the detector) */
|
||||||
|
int getMaxMods(){return thisDetector->nModsMax;}; //
|
||||||
|
|
||||||
|
|
||||||
int getTotalNumberOfChannels(){return thisDetector->nChans*thisDetector->nChips*thisDetector->nMods;};
|
int getTotalNumberOfChannels(){return thisDetector->nChans*thisDetector->nChips*thisDetector->nMods;};
|
||||||
|
|
||||||
|
int getMaxNumberOfChannels(){return thisDetector->nChans*thisDetector->nChips*thisDetector->nModsMax;};
|
||||||
|
|
||||||
|
|
||||||
/* Communication to server */
|
/* Communication to server */
|
||||||
|
|
||||||
|
@ -87,6 +87,13 @@ int slsDetectorUtils::getPointers(int * const l_stoppedFlag, \
|
|||||||
fileName=l_fileName;
|
fileName=l_fileName;
|
||||||
fileIndex=l_fileIndex;
|
fileIndex=l_fileIndex;
|
||||||
|
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "pointer to badChannelMask is "<< badChannelMask << endl;
|
||||||
|
#endif
|
||||||
|
fillBadChannelMask();
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "pointer to badChannelMask is "<< badChannelMask << endl;
|
||||||
|
#endif
|
||||||
return OK;
|
return OK;
|
||||||
|
|
||||||
|
|
||||||
@ -337,7 +344,7 @@ int slsDetectorUtils::setBadChannelCorrection(string fname, int &nbad, int *badl
|
|||||||
std::cout << "Setting bad channel correction to " << fname << std::endl;
|
std::cout << "Setting bad channel correction to " << fname << std::endl;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (fname=="") {
|
if (fname=="" || fname=="none") {
|
||||||
nbad=0;
|
nbad=0;
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
@ -395,7 +402,7 @@ int slsDetectorUtils::setBadChannelCorrection(string fname, int &nbad, int *badl
|
|||||||
}
|
}
|
||||||
infile.close();
|
infile.close();
|
||||||
if (nbad>0 && nbad<MAX_BADCHANS) {
|
if (nbad>0 && nbad<MAX_BADCHANS) {
|
||||||
return 1;
|
return nbad;
|
||||||
} else
|
} else
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -512,6 +519,7 @@ int slsDetectorUtils::readAngularConversion( ifstream& infile, int nmod, angleCo
|
|||||||
while (infile.good() and interrupt==0) {
|
while (infile.good() and interrupt==0) {
|
||||||
getline(infile,str);
|
getline(infile,str);
|
||||||
#ifdef VERBOSE
|
#ifdef VERBOSE
|
||||||
|
cout << "** mod " << nm << " " ;
|
||||||
std::cout<< str << std::endl;
|
std::cout<< str << std::endl;
|
||||||
#endif
|
#endif
|
||||||
istringstream ssstr(str);
|
istringstream ssstr(str);
|
||||||
@ -522,15 +530,18 @@ int slsDetectorUtils::readAngularConversion( ifstream& infile, int nmod, angleCo
|
|||||||
ssstr >> ss >> er_conv;
|
ssstr >> ss >> er_conv;
|
||||||
ssstr >> ss >> off;
|
ssstr >> ss >> off;
|
||||||
ssstr >> ss >> eoff;
|
ssstr >> ss >> eoff;
|
||||||
if (mod<nmod && mod>=0) {
|
if (nm<nmod && nm>=0 ) {
|
||||||
angOff[mod].center=center;
|
angOff[nm].center=center;
|
||||||
angOff[mod].r_conversion=r_conv;
|
angOff[nm].r_conversion=r_conv;
|
||||||
angOff[mod].offset=off;
|
angOff[nm].offset=off;
|
||||||
angOff[mod].ecenter=ecenter;
|
angOff[nm].ecenter=ecenter;
|
||||||
angOff[mod].er_conversion=er_conv;
|
angOff[nm].er_conversion=er_conv;
|
||||||
angOff[mod].eoffset=eoff;
|
angOff[nm].eoffset=eoff;
|
||||||
nm++;
|
} else
|
||||||
}
|
break;
|
||||||
|
nm++;
|
||||||
|
if (nm>=nmod)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return nm;
|
return nm;
|
||||||
}
|
}
|
||||||
@ -616,12 +627,17 @@ int slsDetectorUtils::addToMerging(float *p1, float *v1, float *e1, float *mp,
|
|||||||
|
|
||||||
binmi=-180.;
|
binmi=-180.;
|
||||||
binma=binmi+binsize;
|
binma=binmi+binsize;
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "pointer to badchan mask is " << badChanMask << endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (angDir>0) {
|
if (angDir>0) {
|
||||||
for (int ip=0; ip<nchans; ip++) {
|
for (int ip=0; ip<nchans; ip++) {
|
||||||
if ((cm)&(1<< DISCARD_BAD_CHANNELS)) {
|
if ((cm)&(1<< DISCARD_BAD_CHANNELS)) {
|
||||||
if (badChanMask[ip]) {
|
if (badChanMask[ip]) {
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "channel " << ip << " is bad " << endl;
|
||||||
|
#endif
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -752,7 +768,8 @@ int slsDetectorUtils::writeDataFile(string fname, int nch, float *data, float *e
|
|||||||
outfile.open (fname.c_str(),ios_base::out);
|
outfile.open (fname.c_str(),ios_base::out);
|
||||||
if (outfile.is_open())
|
if (outfile.is_open())
|
||||||
{
|
{
|
||||||
writeDataFile(outfile, nch, data, err, ang, dataformat);
|
writeDataFile(outfile, nch, data, err, ang, dataformat, 0);
|
||||||
|
outfile.close();
|
||||||
return OK;
|
return OK;
|
||||||
} else {
|
} else {
|
||||||
std::cout<< "Could not open file " << fname << "for writing"<< std::endl;
|
std::cout<< "Could not open file " << fname << "for writing"<< std::endl;
|
||||||
@ -761,7 +778,7 @@ int slsDetectorUtils::writeDataFile(string fname, int nch, float *data, float *e
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
int slsDetectorUtils::writeDataFile(ofstream &outfile, int nch, float *data, float *err, float *ang, char dataformat){
|
int slsDetectorUtils::writeDataFile(ofstream &outfile, int nch, float *data, float *err, float *ang, char dataformat, int offset){
|
||||||
|
|
||||||
|
|
||||||
int idata;
|
int idata;
|
||||||
@ -773,7 +790,7 @@ int slsDetectorUtils::writeDataFile(ofstream &outfile, int nch, float *data, flo
|
|||||||
|
|
||||||
for (int ichan=0; ichan<nch; ichan++) {
|
for (int ichan=0; ichan<nch; ichan++) {
|
||||||
if (ang==NULL) {
|
if (ang==NULL) {
|
||||||
outfile << ichan << " ";
|
outfile << ichan+offset << " ";
|
||||||
} else {
|
} else {
|
||||||
outfile << ang[ichan] << " ";
|
outfile << ang[ichan] << " ";
|
||||||
}
|
}
|
||||||
@ -795,7 +812,7 @@ int slsDetectorUtils::writeDataFile(ofstream &outfile, int nch, float *data, flo
|
|||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
outfile.close();
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -819,7 +836,7 @@ int slsDetectorUtils::writeDataFile(string fname, int nch, int *data){
|
|||||||
outfile.open (fname.c_str(),ios_base::out);
|
outfile.open (fname.c_str(),ios_base::out);
|
||||||
if (outfile.is_open())
|
if (outfile.is_open())
|
||||||
{
|
{
|
||||||
writeDataFile(outfile, nch, data);
|
writeDataFile(outfile, nch, data, 0);
|
||||||
outfile.close();
|
outfile.close();
|
||||||
return OK;
|
return OK;
|
||||||
} else {
|
} else {
|
||||||
@ -831,13 +848,14 @@ int slsDetectorUtils::writeDataFile(string fname, int nch, int *data){
|
|||||||
|
|
||||||
|
|
||||||
/*writes raw data file */
|
/*writes raw data file */
|
||||||
int slsDetectorUtils::writeDataFile(ofstream &outfile, int nch, int *data){
|
int slsDetectorUtils::writeDataFile(ofstream &outfile, int nch, int *data, int offset){
|
||||||
if (data==NULL)
|
if (data==NULL)
|
||||||
return FAIL;
|
return FAIL;
|
||||||
|
|
||||||
for (int ichan=0; ichan<nch; ichan++)
|
for (int ichan=0; ichan<nch; ichan++)
|
||||||
outfile << ichan << " " << *(data+ichan) << std::endl;
|
outfile << ichan+offset << " " << *(data+ichan) << std::endl;
|
||||||
|
|
||||||
|
return OK;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -870,7 +888,7 @@ int slsDetectorUtils::readDataFile(int nch, string fname, float *data, float *er
|
|||||||
#endif
|
#endif
|
||||||
infile.open(fname.c_str(), ios_base::in);
|
infile.open(fname.c_str(), ios_base::in);
|
||||||
if (infile.is_open()) {
|
if (infile.is_open()) {
|
||||||
readDataFile(nch, infile, data, err, ang, dataformat);
|
iline=readDataFile(nch, infile, data, err, ang, dataformat, 0);
|
||||||
infile.close();
|
infile.close();
|
||||||
} else {
|
} else {
|
||||||
std::cout<< "Could not read file " << fname << std::endl;
|
std::cout<< "Could not read file " << fname << std::endl;
|
||||||
@ -880,7 +898,7 @@ int slsDetectorUtils::readDataFile(int nch, string fname, float *data, float *er
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
int slsDetectorUtils::readDataFile(int nch, ifstream &infile, float *data, float *err, float *ang, char dataformat){
|
int slsDetectorUtils::readDataFile(int nch, ifstream &infile, float *data, float *err, float *ang, char dataformat, int offset){
|
||||||
|
|
||||||
|
|
||||||
int ichan, iline=0;
|
int ichan, iline=0;
|
||||||
@ -902,13 +920,16 @@ int slsDetectorUtils::readDataFile(int nch, ifstream &infile, float *data, float
|
|||||||
istringstream ssstr(str);
|
istringstream ssstr(str);
|
||||||
if (ang==NULL) {
|
if (ang==NULL) {
|
||||||
ssstr >> ichan >> fdata;
|
ssstr >> ichan >> fdata;
|
||||||
ich=ichan;
|
//ich=ichan;
|
||||||
if (ssstr.fail() || ssstr.bad()) {
|
if (ssstr.fail() || ssstr.bad()) {
|
||||||
interrupt=1;
|
interrupt=1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (ich!=iline)
|
// if (ich!=iline)
|
||||||
std::cout<< "Channel number " << ichan << " does not match with line number " << iline << " " << dataformat << std::endl;
|
// std::cout<< "Channel number " << ichan << " does not match with line number " << iline << " " << dataformat << std::endl;
|
||||||
|
ich=iline;
|
||||||
|
if (ichan<offset)
|
||||||
|
continue;
|
||||||
} else {
|
} else {
|
||||||
ssstr >> fang >> fdata;
|
ssstr >> fang >> fdata;
|
||||||
ich=iline;
|
ich=iline;
|
||||||
@ -924,18 +945,22 @@ int slsDetectorUtils::readDataFile(int nch, ifstream &infile, float *data, float
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (ich<maxchans) {
|
if (ich<maxchans) {
|
||||||
if (ang) {
|
if (ang) {
|
||||||
ang[ich]=fang;
|
ang[ich]=fang;
|
||||||
}
|
}
|
||||||
data[ich]=fdata;
|
data[ich]=fdata;
|
||||||
if (err)
|
if (err)
|
||||||
err[ich]=ferr;
|
err[ich]=ferr;
|
||||||
iline++;
|
iline++;
|
||||||
} else {
|
} // else {
|
||||||
std::cout<< " too many lines in file: "<< iline << " instead of " << maxchans << std::endl;
|
// std::cout<< " too many lines in file: "<< iline << " instead of " << maxchans << std::endl;
|
||||||
interrupt=1;
|
// interrupt=1;
|
||||||
break;
|
// break;
|
||||||
}
|
// }
|
||||||
|
if (iline>=nch) {
|
||||||
|
interrupt=1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return iline;
|
return iline;
|
||||||
};
|
};
|
||||||
@ -954,7 +979,7 @@ int slsDetectorUtils::readDataFile(string fname, int *data, int nch){
|
|||||||
#endif
|
#endif
|
||||||
infile.open(fname.c_str(), ios_base::in);
|
infile.open(fname.c_str(), ios_base::in);
|
||||||
if (infile.is_open()) {
|
if (infile.is_open()) {
|
||||||
readDataFile(infile, data, nch);
|
iline=readDataFile(infile, data, nch, 0);
|
||||||
infile.close();
|
infile.close();
|
||||||
} else {
|
} else {
|
||||||
std::cout<< "Could not read file " << fname << std::endl;
|
std::cout<< "Could not read file " << fname << std::endl;
|
||||||
@ -963,7 +988,7 @@ int slsDetectorUtils::readDataFile(string fname, int *data, int nch){
|
|||||||
return iline;
|
return iline;
|
||||||
};
|
};
|
||||||
|
|
||||||
int slsDetectorUtils::readDataFile(ifstream &infile, int *data, int nch){
|
int slsDetectorUtils::readDataFile(ifstream &infile, int *data, int nch, int offset){
|
||||||
|
|
||||||
int ichan, idata, iline=0;
|
int ichan, idata, iline=0;
|
||||||
int interrupt=0;
|
int interrupt=0;
|
||||||
@ -981,19 +1006,21 @@ int slsDetectorUtils::readDataFile(ifstream &infile, int *data, int nch){
|
|||||||
interrupt=1;
|
interrupt=1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (ichan!=iline) {
|
// if (ichan!=iline) {
|
||||||
std::cout<< " Expected channel "<< iline <<" but read channel "<< ichan << std::endl;
|
// std::cout<< " Expected channel "<< iline <<" but read channel "<< ichan << std::endl;
|
||||||
interrupt=1;
|
// interrupt=1;
|
||||||
break;
|
// break;
|
||||||
} else {
|
// } else {
|
||||||
if (iline<nch) {
|
if (iline<nch) {
|
||||||
|
if (ichan>=offset) {
|
||||||
data[iline]=idata;
|
data[iline]=idata;
|
||||||
iline++;
|
iline++;
|
||||||
} else {
|
}
|
||||||
|
} else {
|
||||||
interrupt=1;
|
interrupt=1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
return iline;
|
return iline;
|
||||||
};
|
};
|
||||||
@ -1011,7 +1038,7 @@ int slsDetectorUtils::readDataFile(string fname, short int *data, int nch){
|
|||||||
#endif
|
#endif
|
||||||
infile.open(fname.c_str(), ios_base::in);
|
infile.open(fname.c_str(), ios_base::in);
|
||||||
if (infile.is_open()) {
|
if (infile.is_open()) {
|
||||||
readDataFile(infile, data, nch);
|
iline=readDataFile(infile, data, nch, 0);
|
||||||
infile.close();
|
infile.close();
|
||||||
} else {
|
} else {
|
||||||
std::cout<< "Could not read file " << fname << std::endl;
|
std::cout<< "Could not read file " << fname << std::endl;
|
||||||
@ -1020,14 +1047,12 @@ int slsDetectorUtils::readDataFile(string fname, short int *data, int nch){
|
|||||||
return iline;
|
return iline;
|
||||||
};
|
};
|
||||||
|
|
||||||
int slsDetectorUtils::readDataFile(ifstream &infile, short int *data, int nch){
|
int slsDetectorUtils::readDataFile(ifstream &infile, short int *data, int nch, int offset){
|
||||||
|
|
||||||
int ichan, iline=0;
|
int ichan, iline=0;
|
||||||
short int idata;
|
short int idata;
|
||||||
int interrupt=0;
|
int interrupt=0;
|
||||||
string str;
|
string str;
|
||||||
|
|
||||||
|
|
||||||
while (infile.good() and interrupt==0) {
|
while (infile.good() and interrupt==0) {
|
||||||
getline(infile,str);
|
getline(infile,str);
|
||||||
#ifdef VERBOSE
|
#ifdef VERBOSE
|
||||||
@ -1039,22 +1064,27 @@ int slsDetectorUtils::readDataFile(ifstream &infile, short int *data, int nch){
|
|||||||
interrupt=1;
|
interrupt=1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (ichan!=iline) {
|
// if (ichan!=iline) {
|
||||||
std::cout<< " Expected channel "<< iline <<" but read channel "<< ichan << std::endl;
|
// std::cout<< " Expected channel "<< iline <<" but read channel "<< ichan << std::endl;
|
||||||
interrupt=1;
|
// interrupt=1;
|
||||||
break;
|
// break;
|
||||||
} else {
|
// } else {
|
||||||
if (iline<nch) {
|
if (iline<nch) {
|
||||||
|
if (ichan>=offset) {
|
||||||
data[iline]=idata;
|
data[iline]=idata;
|
||||||
iline++;
|
iline++;
|
||||||
} else {
|
|
||||||
interrupt=1;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
interrupt=1;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
// }
|
||||||
|
#ifdef VERBOSE
|
||||||
|
std::cout<< "read " << iline <<" channels " << std::endl;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
return iline;
|
return iline;
|
||||||
};
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -1067,11 +1097,11 @@ int slsDetectorUtils::writeDataFile(string fname, float *data, float *err, float
|
|||||||
return writeDataFile(fname, nch, data, err, ang, dataformat);
|
return writeDataFile(fname, nch, data, err, ang, dataformat);
|
||||||
|
|
||||||
}
|
}
|
||||||
int slsDetectorUtils::writeDataFile(ofstream &outfile, float *data, float *err, float *ang, char dataformat, int nch){
|
int slsDetectorUtils::writeDataFile(ofstream &outfile, float *data, float *err, float *ang, char dataformat, int nch, int offset){
|
||||||
if (nch==-1)
|
if (nch==-1)
|
||||||
nch=getTotalNumberOfChannels();
|
nch=getTotalNumberOfChannels();
|
||||||
|
|
||||||
return writeDataFile(outfile, nch, data, err, ang, dataformat);
|
return writeDataFile(outfile, nch, data, err, ang, dataformat, offset);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1083,9 +1113,9 @@ int slsDetectorUtils::writeDataFile(string fname, int *data){
|
|||||||
return writeDataFile(fname, getTotalNumberOfChannels(), data);
|
return writeDataFile(fname, getTotalNumberOfChannels(), data);
|
||||||
}
|
}
|
||||||
|
|
||||||
int slsDetectorUtils::writeDataFile(ofstream &outfile, int *data){
|
int slsDetectorUtils::writeDataFile(ofstream &outfile, int *data, int offset){
|
||||||
|
|
||||||
return writeDataFile(outfile, getTotalNumberOfChannels(), data);
|
return writeDataFile(outfile, getTotalNumberOfChannels(), data, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1095,8 +1125,8 @@ int slsDetectorUtils::readDataFile(string fname, float *data, float *err, float
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int slsDetectorUtils::readDataFile(ifstream &infile, float *data, float *err, float *ang, char dataformat) {
|
int slsDetectorUtils::readDataFile(ifstream &infile, float *data, float *err, float *ang, char dataformat, int offset) {
|
||||||
return readDataFile(getTotalNumberOfChannels(), infile, data, err, ang, dataformat);
|
return readDataFile(getTotalNumberOfChannels(), infile, data, err, ang, dataformat, offset);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1108,9 +1138,9 @@ int slsDetectorUtils::readDataFile(string fname, int *data){
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
int slsDetectorUtils::readDataFile(ifstream &infile, int *data){
|
int slsDetectorUtils::readDataFile(ifstream &infile, int *data, int offset){
|
||||||
|
|
||||||
return readDataFile(infile, data, getTotalNumberOfChannels());
|
return readDataFile(infile, data, getTotalNumberOfChannels(), offset);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -1123,9 +1153,9 @@ int slsDetectorUtils::readDataFile(string fname, short int *data){
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
int slsDetectorUtils::readDataFile(ifstream &infile, short int *data){
|
int slsDetectorUtils::readDataFile(ifstream &infile, short int *data, int offset){
|
||||||
|
|
||||||
return readDataFile(infile, data, getTotalNumberOfChannels());
|
return readDataFile(infile, data, getTotalNumberOfChannels(),offset);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -1627,12 +1657,16 @@ void* slsDetectorUtils::processData(int delflag) {
|
|||||||
|
|
||||||
fname=createFileName();
|
fname=createFileName();
|
||||||
|
|
||||||
|
|
||||||
|
//uses static function?!?!?!?
|
||||||
|
// writeDataFile (fname+string(".raw"), getTotalNumberOfChannels(),fdata, NULL, NULL, 'i');
|
||||||
|
writeDataFile (fname+string(".raw"),fdata, NULL, NULL, 'i');
|
||||||
|
|
||||||
|
|
||||||
/** write raw data file */
|
/** write raw data file */
|
||||||
if (*correctionMask==0 && delflag==1) {
|
if (*correctionMask==0 && delflag==1) {
|
||||||
writeDataFile (fname+string(".raw"), getTotalNumberOfChannels(),fdata, NULL, NULL, 'i');
|
|
||||||
delete [] fdata;
|
delete [] fdata;
|
||||||
} else {
|
} else {
|
||||||
writeDataFile (fname+string(".raw"), getTotalNumberOfChannels(),fdata, NULL, NULL, 'i');
|
|
||||||
|
|
||||||
/** rate correction */
|
/** rate correction */
|
||||||
if (*correctionMask&(1<<RATE_CORRECTION)) {
|
if (*correctionMask&(1<<RATE_CORRECTION)) {
|
||||||
@ -1650,9 +1684,15 @@ void* slsDetectorUtils::processData(int delflag) {
|
|||||||
|
|
||||||
ffcdata=new float[getTotalNumberOfChannels()];
|
ffcdata=new float[getTotalNumberOfChannels()];
|
||||||
ffcerr=new float[getTotalNumberOfChannels()];
|
ffcerr=new float[getTotalNumberOfChannels()];
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "array size " << getTotalNumberOfChannels() << endl;
|
||||||
|
#endif
|
||||||
flatFieldCorrect(rcdata,rcerr,ffcdata,ffcerr);
|
flatFieldCorrect(rcdata,rcerr,ffcdata,ffcerr);
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "FF corr done " << endl;
|
||||||
|
#endif
|
||||||
delete [] rcdata;
|
delete [] rcdata;
|
||||||
delete [] rcerr;
|
if (rcerr) delete [] rcerr;
|
||||||
} else {
|
} else {
|
||||||
ffcdata=rcdata;
|
ffcdata=rcdata;
|
||||||
ffcerr=rcerr;
|
ffcerr=rcerr;
|
||||||
@ -1683,8 +1723,11 @@ void* slsDetectorUtils::processData(int delflag) {
|
|||||||
ang=convertAngles(currentPosition);
|
ang=convertAngles(currentPosition);
|
||||||
|
|
||||||
if (*correctionMask!=0) {
|
if (*correctionMask!=0) {
|
||||||
if (*numberOfPositions>1)
|
if (*numberOfPositions>1) {
|
||||||
writeDataFile (fname+string(".dat"), getTotalNumberOfChannels(), ffcdata, ffcerr,ang);
|
//uses static function?!?!?!?
|
||||||
|
//writeDataFile (fname+string(".dat"), getTotalNumberOfChannels(), ffcdata, ffcerr,ang);
|
||||||
|
writeDataFile (fname+string(".dat"), ffcdata, ffcerr,ang);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
addToMerging(ang, ffcdata, ffcerr, mergingBins, mergingCounts,mergingErrors, mergingMultiplicity, getTotalNumberOfChannels(), bs, *angDirection, *correctionMask, badChannelMask );
|
addToMerging(ang, ffcdata, ffcerr, mergingBins, mergingCounts,mergingErrors, mergingMultiplicity, getTotalNumberOfChannels(), bs, *angDirection, *correctionMask, badChannelMask );
|
||||||
|
|
||||||
@ -1694,6 +1737,7 @@ void* slsDetectorUtils::processData(int delflag) {
|
|||||||
currentPositionIndex++;
|
currentPositionIndex++;
|
||||||
fname=createFileName();
|
fname=createFileName();
|
||||||
if (*correctionMask!=0) {
|
if (*correctionMask!=0) {
|
||||||
|
//uses static function?!?!?!?
|
||||||
writeDataFile (fname+string(".dat"),np,mergingCounts, mergingErrors, mergingBins,'f');
|
writeDataFile (fname+string(".dat"),np,mergingCounts, mergingErrors, mergingBins,'f');
|
||||||
}
|
}
|
||||||
if (delflag) {
|
if (delflag) {
|
||||||
@ -1715,7 +1759,9 @@ void* slsDetectorUtils::processData(int delflag) {
|
|||||||
delete [] ang;
|
delete [] ang;
|
||||||
} else {
|
} else {
|
||||||
if (*correctionMask!=0) {
|
if (*correctionMask!=0) {
|
||||||
writeDataFile (fname+string(".dat"), getTotalNumberOfChannels(), ffcdata, ffcerr);
|
//uses static function?!?!?!?
|
||||||
|
//writeDataFile (fname+string(".dat"), getTotalNumberOfChannels(), ffcdata, ffcerr);
|
||||||
|
writeDataFile (fname+string(".dat"), ffcdata, ffcerr);
|
||||||
}
|
}
|
||||||
if (delflag) {
|
if (delflag) {
|
||||||
if (ffcdata)
|
if (ffcdata)
|
||||||
@ -1842,9 +1888,13 @@ int slsDetectorUtils::fillBadChannelMask() {
|
|||||||
|
|
||||||
int nbad=0;
|
int nbad=0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (*correctionMask&(1<< DISCARD_BAD_CHANNELS)) {
|
if (*correctionMask&(1<< DISCARD_BAD_CHANNELS)) {
|
||||||
nbad=getBadChannelCorrection();
|
nbad=getBadChannelCorrection();
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "number of bad channels is " << nbad << endl;
|
||||||
|
#endif
|
||||||
if (nbad>0) {
|
if (nbad>0) {
|
||||||
|
|
||||||
int *badChansList=new int[nbad];
|
int *badChansList=new int[nbad];
|
||||||
@ -1853,9 +1903,16 @@ int slsDetectorUtils::fillBadChannelMask() {
|
|||||||
if (badChannelMask)
|
if (badChannelMask)
|
||||||
delete [] badChannelMask;
|
delete [] badChannelMask;
|
||||||
badChannelMask=new int[getTotalNumberOfChannels()];
|
badChannelMask=new int[getTotalNumberOfChannels()];
|
||||||
|
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << " pointer to bad channel mask is " << badChannelMask << endl;
|
||||||
|
#endif
|
||||||
for (int ichan=0; ichan<getTotalNumberOfChannels(); ichan++)
|
for (int ichan=0; ichan<getTotalNumberOfChannels(); ichan++)
|
||||||
badChannelMask[ichan]=0;
|
badChannelMask[ichan]=0;
|
||||||
for (int ichan=0; ichan<*nBadChans; ichan++) {
|
#ifdef VERBOSE
|
||||||
|
cout << " badChanMask has be reset" << badChannelMask << endl;
|
||||||
|
#endif
|
||||||
|
for (int ichan=0; ichan<nbad; ichan++) {
|
||||||
if (badChansList[ichan]<getTotalNumberOfChannels() && badChansList[ichan]>=0 ) {
|
if (badChansList[ichan]<getTotalNumberOfChannels() && badChansList[ichan]>=0 ) {
|
||||||
if (badChannelMask[badChansList[ichan]]==0)
|
if (badChannelMask[badChansList[ichan]]==0)
|
||||||
nbad++;
|
nbad++;
|
||||||
@ -1867,18 +1924,31 @@ int slsDetectorUtils::fillBadChannelMask() {
|
|||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (badChannelMask) {
|
if (badChannelMask) {
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "deleting bad channel mask beacuse number of bad channels is 0" << endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
delete [] badChannelMask;
|
delete [] badChannelMask;
|
||||||
badChannelMask=NULL;
|
badChannelMask=NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "bad channel correction is disabled " << nbad << endl;
|
||||||
|
#endif
|
||||||
if (badChannelMask) {
|
if (badChannelMask) {
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "deleting bad channel mask beacuse no bad channel correction is selected" << endl;
|
||||||
|
#endif
|
||||||
delete [] badChannelMask;
|
delete [] badChannelMask;
|
||||||
badChannelMask=NULL;
|
badChannelMask=NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef VERBOSE
|
||||||
|
cout << "number of bad channels is " << nbad << endl;
|
||||||
|
#endif
|
||||||
return nbad;
|
return nbad;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -159,11 +159,10 @@ class slsDetectorUtils : public slsDetectorBase {
|
|||||||
\param dataformat format of the data: can be 'i' integer or 'f' float (default)
|
\param dataformat format of the data: can be 'i' integer or 'f' float (default)
|
||||||
\param nch number of channels to be written to file. if -1 defaults to the number of installed channels of the detector
|
\param nch number of channels to be written to file. if -1 defaults to the number of installed channels of the detector
|
||||||
\returns OK or FAIL if it could not write the file or data=NULL
|
\returns OK or FAIL if it could not write the file or data=NULL
|
||||||
\sa mythenDetector::writeDataFile
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
int writeDataFile(string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int nch=-1);
|
virtual int writeDataFile(string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int nch=-1);
|
||||||
int writeDataFile(ofstream &outfile, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int nch=-1);
|
int writeDataFile(ofstream &outfile, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int nch=-1, int offset=0);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -174,8 +173,8 @@ class slsDetectorUtils : public slsDetectorBase {
|
|||||||
\returns OK or FAIL if it could not write the file or data=NULL
|
\returns OK or FAIL if it could not write the file or data=NULL
|
||||||
\sa mythenDetector::writeDataFile
|
\sa mythenDetector::writeDataFile
|
||||||
*/
|
*/
|
||||||
int writeDataFile(string fname, int *data);
|
virtual int writeDataFile(string fname, int *data);
|
||||||
int writeDataFile(ofstream &outfile, int *data);
|
int writeDataFile(ofstream &outfile, int *data, int offset=0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
||||||
@ -189,10 +188,9 @@ class slsDetectorUtils : public slsDetectorBase {
|
|||||||
\param nch number of channels to be written to file. if <=0 defaults to the number of installed channels of the detector
|
\param nch number of channels to be written to file. if <=0 defaults to the number of installed channels of the detector
|
||||||
\returns OK or FAIL if it could not read the file or data=NULL
|
\returns OK or FAIL if it could not read the file or data=NULL
|
||||||
|
|
||||||
\sa mythenDetector::readDataFile
|
|
||||||
*/
|
*/
|
||||||
int readDataFile(string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f');
|
virtual int readDataFile(string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f');
|
||||||
int readDataFile(ifstream& infile, float *data, float *err=NULL, float *ang=NULL, char dataformat='f');
|
int readDataFile(ifstream& infile, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int offset=0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
||||||
@ -200,10 +198,9 @@ class slsDetectorUtils : public slsDetectorBase {
|
|||||||
\param name of the file to be read
|
\param name of the file to be read
|
||||||
\param data array of data values
|
\param data array of data values
|
||||||
\returns OK or FAIL if it could not read the file or data=NULL
|
\returns OK or FAIL if it could not read the file or data=NULL
|
||||||
\sa mythenDetector::readDataFile
|
|
||||||
*/
|
*/
|
||||||
int readDataFile(string fname, int *data);
|
virtual int readDataFile(string fname, int *data);
|
||||||
int readDataFile(ifstream &infile, int *data);
|
int readDataFile(ifstream &infile, int *data, int offset=0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
||||||
@ -211,10 +208,9 @@ class slsDetectorUtils : public slsDetectorBase {
|
|||||||
\param name of the file to be read
|
\param name of the file to be read
|
||||||
\param data array of data values
|
\param data array of data values
|
||||||
\returns OK or FAIL if it could not read the file or data=NULL
|
\returns OK or FAIL if it could not read the file or data=NULL
|
||||||
\sa mythenDetector::readDataFile
|
|
||||||
*/
|
*/
|
||||||
int readDataFile(string fname, short int *data);
|
virtual int readDataFile(string fname, short int *data);
|
||||||
int readDataFile(ifstream &infile, short int *data);
|
int readDataFile(ifstream &infile, short int *data, int offset=0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
||||||
@ -232,7 +228,7 @@ class slsDetectorUtils : public slsDetectorBase {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static int writeDataFile(string fname, int nch, float *data, float *err=NULL, float *ang=NULL, char dataformat='f');
|
static int writeDataFile(string fname, int nch, float *data, float *err=NULL, float *ang=NULL, char dataformat='f');
|
||||||
static int writeDataFile(ofstream &outfile, int nch, float *data, float *err=NULL, float *ang=NULL, char dataformat='f');
|
static int writeDataFile(ofstream &outfile, int nch, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int offset=0);
|
||||||
/**
|
/**
|
||||||
|
|
||||||
writes a data file
|
writes a data file
|
||||||
@ -242,7 +238,7 @@ class slsDetectorUtils : public slsDetectorBase {
|
|||||||
\sa mythenDetector::writeDataFile
|
\sa mythenDetector::writeDataFile
|
||||||
*/
|
*/
|
||||||
static int writeDataFile(string fname,int nch, int *data);
|
static int writeDataFile(string fname,int nch, int *data);
|
||||||
static int writeDataFile(ofstream &outfile,int nch, int *data);
|
static int writeDataFile(ofstream &outfile,int nch, int *data, int offset=0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
||||||
@ -259,7 +255,7 @@ class slsDetectorUtils : public slsDetectorBase {
|
|||||||
\sa mythenDetector::readDataFile
|
\sa mythenDetector::readDataFile
|
||||||
*/
|
*/
|
||||||
static int readDataFile(int nch, string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f');
|
static int readDataFile(int nch, string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f');
|
||||||
static int readDataFile(int nch, ifstream &infile, float *data, float *err=NULL, float *ang=NULL, char dataformat='f');
|
static int readDataFile(int nch, ifstream &infile, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int offset=0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
||||||
@ -270,7 +266,7 @@ class slsDetectorUtils : public slsDetectorBase {
|
|||||||
\sa mythenDetector::readDataFile
|
\sa mythenDetector::readDataFile
|
||||||
*/
|
*/
|
||||||
static int readDataFile(string fname, int *data, int nch);
|
static int readDataFile(string fname, int *data, int nch);
|
||||||
static int readDataFile(ifstream &infile, int *data, int nch);
|
static int readDataFile(ifstream &infile, int *data, int nch, int offset=0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
||||||
@ -281,7 +277,7 @@ class slsDetectorUtils : public slsDetectorBase {
|
|||||||
\sa mythenDetector::readDataFile
|
\sa mythenDetector::readDataFile
|
||||||
*/
|
*/
|
||||||
static int readDataFile(string fname, short int *data, int nch);
|
static int readDataFile(string fname, short int *data, int nch);
|
||||||
static int readDataFile(ifstream &infile, short int *data, int nch);
|
static int readDataFile(ifstream &infile, short int *data, int nch, int offset=0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
||||||
@ -735,6 +731,7 @@ s
|
|||||||
virtual int flatFieldCorrect(float*, float*, float*, float*)=0;
|
virtual int flatFieldCorrect(float*, float*, float*, float*)=0;
|
||||||
|
|
||||||
virtual int getTotalNumberOfChannels()=0;
|
virtual int getTotalNumberOfChannels()=0;
|
||||||
|
virtual int getMaxNumberOfChannels()=0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -3,6 +3,8 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
|
float pos;
|
||||||
|
float i0=0;
|
||||||
#ifdef EPICS
|
#ifdef EPICS
|
||||||
|
|
||||||
#include <cadef.h>
|
#include <cadef.h>
|
||||||
@ -10,6 +12,11 @@
|
|||||||
|
|
||||||
static double timeout = 3.0;
|
static double timeout = 3.0;
|
||||||
|
|
||||||
|
chid ch_pos,ch_i0, ch_getpos;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* connect to a PV */
|
/* connect to a PV */
|
||||||
int connect_channel(const char *name, chid *ch_id) {
|
int connect_channel(const char *name, chid *ch_id) {
|
||||||
int status = ECA_NORMAL;
|
int status = ECA_NORMAL;
|
||||||
@ -88,44 +95,12 @@ int caput(chid ch_id, double value) {
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* int main(int argc, char *argv[]) { */
|
//int main(int argc, char *argv[]) {
|
||||||
/* double value = 256; */
|
|
||||||
/* /\* channel name *\/ */
|
|
||||||
/* const char *name = "ARIDI-PCT:CURRENT"; */
|
|
||||||
/* /\* channel id *\/ */
|
|
||||||
/* chid ch_id; */
|
|
||||||
/* /\* status code *\/ */
|
|
||||||
/* int status; */
|
|
||||||
|
|
||||||
/* /\* init channel access context before any caget/put *\/ */
|
|
||||||
/* ca_context_create(ca_enable_preemptive_callback); */
|
|
||||||
|
|
||||||
/* /\* open the channel by name and return ch_id *\/ */
|
|
||||||
/* status = connect_channel(name, &ch_id); */
|
|
||||||
/* if (status == ECA_NORMAL) */
|
|
||||||
/* printf("channel connected %s\n", name); */
|
|
||||||
/* else { */
|
|
||||||
/* printf(ca_message(status)); */
|
|
||||||
/* return -1; */
|
|
||||||
/* } */
|
|
||||||
/* /\* caput and wait until done *\/ */
|
|
||||||
/* if ((status = caput(ch_id, value)) == ECA_NORMAL) */
|
|
||||||
/* printf("caput: success\n"); */
|
|
||||||
/* else */
|
|
||||||
/* printf(ca_message(status)); */
|
|
||||||
|
|
||||||
/* /\* caget *\/ */
|
|
||||||
/* if (caget(ch_id, &value) == ECA_NORMAL) */
|
|
||||||
/* printf("caget: %f\n", value); */
|
|
||||||
/* else */
|
|
||||||
/* printf(ca_message(status)); */
|
|
||||||
|
|
||||||
/* /\* close channel connect *\/ */
|
|
||||||
/* disconnect_channel(ch_id); */
|
|
||||||
|
|
||||||
/* /\* delete channel access context before program exits *\/ */
|
|
||||||
/* ca_context_destroy(); */
|
|
||||||
/* } */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -137,10 +112,6 @@ int caput(chid ch_id, double value) {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
float pos;
|
|
||||||
float i0=0;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
contains the conversion channel-angle for a module channel
|
contains the conversion channel-angle for a module channel
|
||||||
conv_r=pitch/radius
|
conv_r=pitch/radius
|
||||||
@ -149,11 +120,11 @@ float i0=0;
|
|||||||
|
|
||||||
float angle(int ichan, float encoder, float totalOffset, float conv_r, float center, float offset, float tilt, int direction) {
|
float angle(int ichan, float encoder, float totalOffset, float conv_r, float center, float offset, float tilt, int direction) {
|
||||||
|
|
||||||
(void) offset; /* to avoid warning: unused parameter */
|
|
||||||
(void) tilt; /* to avoid warning: unused parameter */
|
(void) tilt; /* to avoid warning: unused parameter */
|
||||||
float ang;
|
float ang;
|
||||||
|
|
||||||
ang=180./PI*(center*conv_r+atan((float)(ichan-center)*conv_r))+encoder+totalOffset;
|
ang=180./PI*(center*conv_r+atan((float)(ichan-center)*conv_r))+encoder+totalOffset+offset;
|
||||||
|
|
||||||
return direction*ang;
|
return direction*ang;
|
||||||
|
|
||||||
@ -165,17 +136,55 @@ float get_position() {
|
|||||||
#ifdef VERBOSE
|
#ifdef VERBOSE
|
||||||
printf("Getting motor position \n");
|
printf("Getting motor position \n");
|
||||||
#endif
|
#endif
|
||||||
|
// caget X04SA-ES2-TH2:RO.RBV
|
||||||
|
|
||||||
|
#ifdef EPICS
|
||||||
|
int status;
|
||||||
|
|
||||||
|
double value = 256;
|
||||||
|
if (ch_getpos<0) return -1;
|
||||||
|
|
||||||
|
/* /\* caget *\/ */
|
||||||
|
if (caget(ch_getpos, &value) == ECA_NORMAL) {
|
||||||
|
#ifdef VERBOSE
|
||||||
|
printf("caget: %f\n", value);
|
||||||
|
#endif
|
||||||
|
pos=value;
|
||||||
|
} else
|
||||||
|
printf(ca_message(status));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* moves the encoder to position p */
|
/* moves the encoder to position p */
|
||||||
|
|
||||||
|
|
||||||
int go_to_position(float p) {
|
int go_to_position(float p) {
|
||||||
#ifdef VERBOSE
|
#ifdef VERBOSE
|
||||||
printf("Setting motor position \n");
|
printf("Setting motor position \n");
|
||||||
#endif
|
#endif
|
||||||
pos=p;
|
|
||||||
return pos;
|
#ifdef EPICS
|
||||||
|
int status;
|
||||||
|
if (ch_pos<0) return -1;
|
||||||
|
/* /\* caput and wait until done *\/ */
|
||||||
|
if ((status = caput(ch_pos, p)) == ECA_NORMAL) {
|
||||||
|
;
|
||||||
|
#ifdef VERBOSE
|
||||||
|
printf("caput: success\n");
|
||||||
|
#endif
|
||||||
|
} else
|
||||||
|
printf(ca_message(status));
|
||||||
|
#else
|
||||||
|
pos=p;
|
||||||
|
#endif
|
||||||
|
//"caputq X04SA-ES2-TH2:RO p"
|
||||||
|
//cawait -nounit -timeout 3600 X04SA-ES2-TH2:RO.DMOV '==1'
|
||||||
|
|
||||||
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* moves the encoder to position p without waiting */
|
/* moves the encoder to position p without waiting */
|
||||||
@ -184,6 +193,29 @@ int go_to_position_no_wait(float p) {
|
|||||||
#ifdef VERBOSE
|
#ifdef VERBOSE
|
||||||
printf("Setting motor position no wait \n");
|
printf("Setting motor position no wait \n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef EPICS
|
||||||
|
int status;
|
||||||
|
if (ch_pos<0) return -1;
|
||||||
|
/* /\* caput and wait until done *\/ */
|
||||||
|
if ((status = caputq(ch_pos, p)) == ECA_NORMAL) {
|
||||||
|
;
|
||||||
|
#ifdef VERBOSE
|
||||||
|
printf("caputq: success\n");
|
||||||
|
#endif
|
||||||
|
} else
|
||||||
|
printf(ca_message(status));
|
||||||
|
#else
|
||||||
|
pos=p;
|
||||||
|
#endif
|
||||||
|
//"caputq X04SA-ES2-TH2:RO p"
|
||||||
|
|
||||||
|
return p;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
pos=p;
|
pos=p;
|
||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
@ -195,8 +227,92 @@ float get_i0() {
|
|||||||
#ifdef VERBOSE
|
#ifdef VERBOSE
|
||||||
printf("Getting I0 readout \n");
|
printf("Getting I0 readout \n");
|
||||||
#endif
|
#endif
|
||||||
return i0++;
|
|
||||||
|
#ifdef EPICS
|
||||||
|
int status;
|
||||||
|
|
||||||
|
double value = 256;
|
||||||
|
/* /\* caget *\/ */
|
||||||
|
if (ch_i0<0) return -1;
|
||||||
|
if (caget(ch_i0, &value) == ECA_NORMAL) {
|
||||||
|
#ifdef VERBOSE
|
||||||
|
printf("caget: %f\n", value);
|
||||||
|
#endif
|
||||||
|
i0=value;
|
||||||
|
} else
|
||||||
|
printf(ca_message(status));
|
||||||
|
#else
|
||||||
|
i0++;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//"ca_get X04SA-ES2-SC:CH6"
|
||||||
|
return i0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int disconnect_channels() { }
|
|
||||||
int connect_channels() {}
|
int connect_channels() {
|
||||||
|
#ifdef EPICS
|
||||||
|
//double value = 256;
|
||||||
|
/* channel name */
|
||||||
|
//const char *name = "ARIDI-PCT:CURRENT";
|
||||||
|
/* channel id */
|
||||||
|
/* status code */
|
||||||
|
int status;
|
||||||
|
|
||||||
|
printf("starting...\n");
|
||||||
|
|
||||||
|
/* init channel access context before any caget/put */
|
||||||
|
ca_context_create(ca_enable_preemptive_callback);
|
||||||
|
|
||||||
|
printf("context created\n");
|
||||||
|
|
||||||
|
//"caputq X04SA-ES2-TH2:RO p"
|
||||||
|
|
||||||
|
//"ca_get X04SA-ES2-SC:CH6"
|
||||||
|
|
||||||
|
/* open the channel by name and return ch_id */
|
||||||
|
status = connect_channel("X04SA-ES2-SC:CH6", &ch_i0);
|
||||||
|
if (status == ECA_NORMAL)
|
||||||
|
printf("I0 channel connected \n");
|
||||||
|
else {
|
||||||
|
printf(ca_message(status));
|
||||||
|
//ch_i0=-1;;
|
||||||
|
}
|
||||||
|
status = connect_channel("X04SA-ES2-TH2:RO", &ch_pos);
|
||||||
|
if (status == ECA_NORMAL)
|
||||||
|
printf("Detector position channel connected \n");
|
||||||
|
else {
|
||||||
|
printf(ca_message(status));
|
||||||
|
//ch_i0=-1;;
|
||||||
|
}
|
||||||
|
status = connect_channel("X04SA-ES2-TH2:RO.RBV", &ch_getpos);
|
||||||
|
if (status == ECA_NORMAL)
|
||||||
|
printf("Detector get position channel connected \n");
|
||||||
|
else {
|
||||||
|
printf(ca_message(status));
|
||||||
|
//ch_getpos=-1;;
|
||||||
|
}
|
||||||
|
|
||||||
|
// caget X04SA-ES2-TH2:RO.RBV
|
||||||
|
|
||||||
|
//cawait -nounit -timeout 3600 X04SA-ES2-TH2:RO.DMOV '==1'
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
int disconnect_channels() {
|
||||||
|
#ifdef EPICS
|
||||||
|
/* close channel connect */
|
||||||
|
disconnect_channel(ch_i0);
|
||||||
|
disconnect_channel(ch_pos);
|
||||||
|
disconnect_channel(ch_getpos);
|
||||||
|
|
||||||
|
/* delete channel access context before program exits */
|
||||||
|
ca_context_destroy();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -26,7 +26,6 @@ extern "C" {
|
|||||||
int caputq(chid ch_id, double value);
|
int caputq(chid ch_id, double value);
|
||||||
void put_callback(struct event_handler_args args);
|
void put_callback(struct event_handler_args args);
|
||||||
int caput(chid ch_id, double value);
|
int caput(chid ch_id, double value);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@ -34,11 +33,9 @@ extern "C" {
|
|||||||
float get_position();
|
float get_position();
|
||||||
int go_to_position(float p);
|
int go_to_position(float p);
|
||||||
int go_to_position_no_wait(float p);
|
int go_to_position_no_wait(float p);
|
||||||
|
|
||||||
int connect_channels();
|
int connect_channels();
|
||||||
int disconnect_channels();
|
int disconnect_channels();
|
||||||
|
|
||||||
|
|
||||||
float get_i0();
|
float get_i0();
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user