From ca15ff971d5166d1b1b66d54b6591732cfd6e925 Mon Sep 17 00:00:00 2001 From: l_maliakal_d Date: Tue, 16 Apr 2013 13:39:58 +0000 Subject: [PATCH] added nchans for each dimension and edited update offsets to work better for 2d dets git-svn-id: file:///afs/psi.ch/project/sls_det_software/svn/slsDetectorSoftware@514 951219d9-93cf-4727-9268-0efd64621fa3 --- .../multiSlsDetector/multiSlsDetector.cpp | 91 ++++++++++++------- .../multiSlsDetector/multiSlsDetector.h | 3 + .../slsDetector/slsDetector.cpp | 12 ++- slsDetectorSoftware/slsDetector/slsDetector.h | 11 ++- .../slsReceiver/slsReceiverFunctionList.cpp | 17 +++- 5 files changed, 91 insertions(+), 43 deletions(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 7dad08ef4..a6c80ade4 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -341,47 +341,66 @@ int multiSlsDetector::addSlsDetector(int id, int pos) { #endif //set offsets - int offsetX=0,offsetY=0,numX,numY; - int maxChanX = thisMultiDetector->maxNumberOfChannelsPerDetector[X]; - int maxChanY = thisMultiDetector->maxNumberOfChannelsPerDetector[Y]; - - for (int i=0; inumberOfDetectors; i++) { - if (detectors[i]) { - thisMultiDetector->offsetX[i] = offsetX; - thisMultiDetector->offsetY[i] = offsetY; - - cout << "Detector pos: " << i << " offset X:" << offsetX << " offset Y:" << offsetY << endl; - - numX = detectors[i]->getMaxNumberOfChannels(X); - numY = detectors[i]->getMaxNumberOfChannels(Y); - - offsetX += numX; - if ((maxChanX == -1) || ((maxChanX > 0) && (offsetX < maxChanX))){ - thisMultiDetector->numberOfChannel[X] += detectors[i]->getTotalNumberOfChannels(X); - thisMultiDetector->maxNumberOfChannel[X] += numX; - }else{ - offsetX = 0; - thisMultiDetector->numberOfChannel[X] = 0; - thisMultiDetector->maxNumberOfChannel[X] = 0; - offsetY += numY; - if ((maxChanY == -1) || ((maxChanY > 0) && (offsetY < maxChanY))){ - thisMultiDetector->numberOfChannel[Y] += detectors[i]->getTotalNumberOfChannels(Y); - thisMultiDetector->maxNumberOfChannel[Y] += numY; - }else{ - cout<<"Detector " << id << "exceeds maximum channels allowed for complete detector set in y dimension also!" << endl; - thisMultiDetector->numberOfChannel[Y] += detectors[i]->getTotalNumberOfChannels(Y); - thisMultiDetector->maxNumberOfChannel[Y] += numY; - } - } - } - } - + updateOffsets(); return thisMultiDetector->numberOfDetectors; } +void multiSlsDetector::updateOffsets(){ + int offsetX=0,offsetY=0,numX,numY; + int maxChanX = thisMultiDetector->maxNumberOfChannelsPerDetector[X]; + int maxChanY = thisMultiDetector->maxNumberOfChannelsPerDetector[Y]; + + thisMultiDetector->numberOfChannel[X] = 0; + thisMultiDetector->maxNumberOfChannel[X] = 0; + thisMultiDetector->numberOfChannel[Y] = 0; + thisMultiDetector->maxNumberOfChannel[Y] = 0; + + for (int i=0; inumberOfDetectors; i++) { + if (detectors[i]) { + thisMultiDetector->offsetX[i] = offsetX; + thisMultiDetector->offsetY[i] = offsetY; + + cout << "Detector pos: " << i << " offset X:" << offsetX << " offset Y:" << offsetY << endl; + + numX = detectors[i]->getMaxNumberOfChannels(X); + numY = detectors[i]->getMaxNumberOfChannels(Y); + + offsetX += numX; + if ((maxChanX == -1) || ((maxChanX > 0) && (offsetX < maxChanX))){ + thisMultiDetector->numberOfChannel[X] += detectors[i]->getTotalNumberOfChannels(X); + thisMultiDetector->maxNumberOfChannel[X] += numX; + //the first time y should be added but offset not increased + if (thisMultiDetector->numberOfChannel[Y] == 0){ + if ((maxChanY == -1) || ((maxChanY > 0) && (numY < maxChanY))){ + thisMultiDetector->numberOfChannel[Y] += detectors[i]->getTotalNumberOfChannels(Y); + thisMultiDetector->maxNumberOfChannel[Y] += numY; + }else{ + cout<<"Detector at position " << i << "exceeds maximum channels allowed for complete detector set in y dimension also!" << endl; + thisMultiDetector->numberOfChannel[Y] += detectors[i]->getTotalNumberOfChannels(Y); + thisMultiDetector->maxNumberOfChannel[Y] += numY; + } + } + }else{ + offsetX = 0; + thisMultiDetector->numberOfChannel[X] = 0; + thisMultiDetector->maxNumberOfChannel[X] = 0; + offsetY += numY; + if ((maxChanY == -1) || ((maxChanY > 0) && (offsetY < maxChanY))){ + thisMultiDetector->numberOfChannel[Y] += detectors[i]->getTotalNumberOfChannels(Y); + thisMultiDetector->maxNumberOfChannel[Y] += numY; + }else{ + cout<<"Detector at position " << i << "exceeds maximum channels allowed for complete detector set in y dimension also!" << endl; + thisMultiDetector->numberOfChannel[Y] += detectors[i]->getTotalNumberOfChannels(Y); + thisMultiDetector->maxNumberOfChannel[Y] += numY; + } + } + } + } +} + string multiSlsDetector::setHostname(const char* name, int pos){ // int id=0; @@ -762,6 +781,8 @@ int multiSlsDetector::removeSlsDetector(int pos) { } } + updateOffsets(); + return thisMultiDetector->numberOfDetectors; } diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h index c9d200729..147b3e0b0 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h @@ -1194,6 +1194,9 @@ class multiSlsDetector : public slsDetectorUtils { */ int setReadReceiverFrequency(int i=-1); + /** updates the multidetector offsets */ + void updateOffsets(); + protected: diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index f1a266996..bcfebfde9 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -490,6 +490,8 @@ int slsDetector::initializeDetectorSize(detectorType type) { switch(thisDetector->myDetectorType) { case MYTHEN: thisDetector->nChans=128; + thisDetector->nChan[X]=128; + thisDetector->nChan[Y]=1; thisDetector->nChips=10; thisDetector->nDacs=6; thisDetector->nAdcs=0; @@ -503,6 +505,8 @@ int slsDetector::initializeDetectorSize(detectorType type) { break; case PICASSO: thisDetector->nChans=128; + thisDetector->nChan[X]=128; + thisDetector->nChan[Y]=1; thisDetector->nChips=12; thisDetector->nDacs=6; thisDetector->nAdcs=0; @@ -512,6 +516,8 @@ int slsDetector::initializeDetectorSize(detectorType type) { break; case GOTTHARD: thisDetector->nChans=128; + thisDetector->nChan[X]=128; + thisDetector->nChan[Y]=1; thisDetector->nChips=10; thisDetector->nDacs=8; thisDetector->nAdcs=5; @@ -521,6 +527,8 @@ int slsDetector::initializeDetectorSize(detectorType type) { break; case MOENCH: thisDetector->nChans=160*160; + thisDetector->nChan[X]=160; + thisDetector->nChan[Y]=160; thisDetector->nChips=1; thisDetector->nDacs=8; thisDetector->nAdcs=1; @@ -530,7 +538,9 @@ int slsDetector::initializeDetectorSize(detectorType type) { break; default: thisDetector->nChans=0; - thisDetector->nChips=0; + thisDetector->nChan[X]=0; + thisDetector->nChan[Y]=0; + thisDetector->nChips=0; thisDetector->nDacs=0; thisDetector->nAdcs=0; thisDetector->nModMax[X]=0; diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index c8bf9d852..0001ccc40 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -116,6 +116,8 @@ class slsDetector : public slsDetectorUtils, public energyConversion { int nModsMax; /** number of channels per chip */ int nChans; + /** number of channels per chip in one direction */ + int nChan[2]; /** number of chips per module*/ int nChips; /** number of dacs per module*/ @@ -564,6 +566,9 @@ class slsDetector : public slsDetectorUtils, public energyConversion { /** Returns the number of channels per chip (without connecting to the detector) */ int getNChans(){return thisDetector->nChans;}; // + /** Returns the number of channels per chip (without connecting to the detector) in one direction */ + int getNChans(dimension d){return thisDetector->nChan[d];}; // + /** Returns the number of chips per module (without connecting to the detector) */ int getNChips(){return thisDetector->nChips;}; // @@ -575,6 +580,8 @@ class slsDetector : public slsDetectorUtils, public energyConversion { int getChansPerMod(int imod=0){return thisDetector->nChans*thisDetector->nChips;}; + int getChansPerMod( dimension d,int imod=0){return thisDetector->nChan[d]*thisDetector->nChips;}; + /** Returns the max number of modules in direction d (without connecting to the detector) */ int getNMaxMod(dimension d){return thisDetector->nModMax[d];}; // @@ -584,11 +591,11 @@ class slsDetector : public slsDetectorUtils, public energyConversion { int getTotalNumberOfChannels(){return thisDetector->nChans*thisDetector->nChips*thisDetector->nMods;}; - int getTotalNumberOfChannels(dimension d){return thisDetector->nChans*thisDetector->nChips*thisDetector->nMod[X];}; + int getTotalNumberOfChannels(dimension d){return thisDetector->nChan[d]*thisDetector->nChips*thisDetector->nMod[X];}; int getMaxNumberOfChannels(){return thisDetector->nChans*thisDetector->nChips*thisDetector->nModsMax;}; - int getMaxNumberOfChannels(dimension d){return thisDetector->nChans*thisDetector->nChips*thisDetector->nModMax[d];}; + int getMaxNumberOfChannels(dimension d){return thisDetector->nChan[d]*thisDetector->nChips*thisDetector->nModMax[d];}; /** Returns number of rois */ int getNRoi(){return thisDetector->nROI;}; diff --git a/slsDetectorSoftware/slsReceiver/slsReceiverFunctionList.cpp b/slsDetectorSoftware/slsReceiver/slsReceiverFunctionList.cpp index ceac27a22..867f8d6cc 100644 --- a/slsDetectorSoftware/slsReceiver/slsReceiverFunctionList.cpp +++ b/slsDetectorSoftware/slsReceiver/slsReceiverFunctionList.cpp @@ -24,7 +24,8 @@ #include //set precision -#include +//#include //sched_idle +//#include //posix_fadvice #include #include @@ -91,6 +92,7 @@ slsReceiverFunctionList::slsReceiverFunctionList(detectorType det): if (det == MOENCH) aligned_frame_size = MOENCH_ALIGNED_FRAME_SIZE; + mem0=(char*)malloc(aligned_frame_size*FIFO_SIZE); if (mem0==NULL) { cout<<"++++++++++++++++++++++ COULD NOT ALLOCATE MEMORY!!!!!!!+++++++++++++++++++++" << endl; @@ -246,12 +248,12 @@ int slsReceiverFunctionList::startReceiver(){ cout << "ERROR: Could not prioritize threads. You need to be super user for that." << endl; if (pthread_setschedparam(writing_thread, policy, &write_param) == EPERM) cout << "ERROR: Could not prioritize threads. You need to be super user for that." << endl; - if (pthread_setschedparam(pthread_self(), 5, &tcp_param) == EPERM) + if (pthread_setschedparam(pthread_self(),policy , &tcp_param) == EPERM) cout << "ERROR: Could not prioritize threads. You need to be super user for that." << endl; - pthread_getschedparam(pthread_self(),&policy,&tcp_param); - cout << "current priority of main tcp thread is " << tcp_param.sched_priority << endl; + //pthread_getschedparam(pthread_self(),&policy,&tcp_param); + //cout << "current priority of main tcp thread is " << tcp_param.sched_priority << endl; } @@ -453,6 +455,7 @@ int slsReceiverFunctionList::startWriting(){ if(enableFileWrite || cbAction>0){ sfilefd = fopen((const char *) (savefilename), "w"); cout << savefilename << endl; + //posix_fadvise(fileno(sfilefd),0,0,POSIX_FADV_DONTNEED|POSIX_FADV_SEQUENTIAL); } @@ -468,8 +471,10 @@ int slsReceiverFunctionList::startWriting(){ //start writing in new file if(enableFileWrite || cbAction>0){ + //fsync(fileno(sfilefd)); fclose(sfilefd); sfilefd = fopen((const char *) (savefilename), "w"); + //posix_fadvise(fileno(sfilefd),0,0,POSIX_FADV_DONTNEED|POSIX_FADV_SEQUENTIAL); } //currframenum=(int)(*((int*)latestData)); @@ -535,7 +540,9 @@ int slsReceiverFunctionList::startWriting(){ cout << "Total Frames Caught:"<< totalFramesCaught << endl; //close file - if(sfilefd) fclose(sfilefd); + if(sfilefd) + fclose(sfilefd); + //{ fsync(fileno(sfilefd));fclose(sfilefd);} #ifdef VERBOSE cout << "sfield:" << (int)sfilefd << endl; #endif