From bf976342b9f61a020a8eb324ffb0bb7ec13c7b0f Mon Sep 17 00:00:00 2001 From: bergamaschi Date: Tue, 1 Dec 2009 09:58:10 +0000 Subject: [PATCH] After meeting on 30.11.09 - Some functions became pure virtual in slsDetector and have been moved to mythenDetector - setSpeed function added git-svn-id: file:///afs/psi.ch/project/sls_det_software/svn/slsDetectorSoftware@3 951219d9-93cf-4727-9268-0efd64621fa3 --- .../bin/libSlsDetector.so.1.0.1 | Bin 339790 -> 273580 bytes .../commonFiles/sls_detector_defs.h | 15 +- .../docs/html/MySocketTCP_8cxx.html | 2 +- .../docs/html/MySocketTCP_8h-source.html | 2 +- .../docs/html/MySocketTCP_8h.html | 2 +- slsDetectorSoftware/docs/html/annotated.html | 4 +- slsDetectorSoftware/docs/html/bug.html | 4 +- .../docs/html/classMySocketTCP-members.html | 2 +- .../docs/html/classMySocketTCP.html | 2 +- .../docs/html/classeigerDetector-members.html | 116 +- .../docs/html/classeigerDetector.html | 38 +- .../html/classmythenDetector-members.html | 120 +- .../docs/html/classmythenDetector.html | 301 ++-- .../docs/html/classslsDetector-members.html | 153 +- .../docs/html/classslsDetector.html | 701 ++++---- .../docs/html/eigerDetector_8h-source.html | 2 +- .../docs/html/eigerDetector_8h.html | 2 +- slsDetectorSoftware/docs/html/files.html | 2 +- slsDetectorSoftware/docs/html/functions.html | 9 +- .../docs/html/functions_0x62.html | 5 +- .../docs/html/functions_0x63.html | 4 +- .../docs/html/functions_0x64.html | 6 +- .../docs/html/functions_0x65.html | 2 +- .../docs/html/functions_0x66.html | 2 +- .../docs/html/functions_0x67.html | 27 +- .../docs/html/functions_0x68.html | 2 +- .../docs/html/functions_0x69.html | 2 +- .../docs/html/functions_0x6c.html | 2 +- .../docs/html/functions_0x6d.html | 5 +- .../docs/html/functions_0x6e.html | 2 +- .../docs/html/functions_0x6f.html | 2 +- .../docs/html/functions_0x70.html | 4 +- .../docs/html/functions_0x72.html | 16 +- .../docs/html/functions_0x73.html | 21 +- .../docs/html/functions_0x74.html | 2 +- .../docs/html/functions_0x77.html | 12 +- .../docs/html/functions_0x78.html | 2 +- .../docs/html/functions_0x79.html | 2 +- .../docs/html/functions_0x7e.html | 5 +- .../docs/html/functions_eval.html | 2 +- .../docs/html/functions_func.html | 88 +- .../docs/html/functions_type.html | 2 +- .../docs/html/functions_vars.html | 8 +- slsDetectorSoftware/docs/html/globals.html | 268 +--- .../docs/html/globals_defs.html | 4 +- .../docs/html/globals_enum.html | 5 +- .../docs/html/globals_eval.html | 18 +- .../docs/html/globals_func.html | 2 +- .../docs/html/globals_vars.html | 2 +- slsDetectorSoftware/docs/html/hierarchy.html | 2 +- slsDetectorSoftware/docs/html/index.html | 11 +- .../docs/html/mythenDetector_8h-source.html | 176 ++- .../docs/html/mythenDetector_8h.html | 22 +- slsDetectorSoftware/docs/html/namespaces.html | 2 +- .../docs/html/namespacestd.html | 2 +- slsDetectorSoftware/docs/html/pages.html | 2 +- .../docs/html/slsDetector_8cpp.html | 2 +- .../docs/html/slsDetector_8h-source.html | 914 +++++------ .../docs/html/slsDetector_8h.html | 4 +- .../html/sls__detector__defs_8h-source.html | 400 ++--- .../docs/html/sls__detector__defs_8h.html | 43 +- .../docs/html/structROI-members.html | 2 +- slsDetectorSoftware/docs/html/structROI.html | 2 +- ...structangleConversionConstant-members.html | 2 +- .../html/structangleConversionConstant.html | 2 +- .../docs/html/structiarray-members.html | 2 +- .../docs/html/structiarray.html | 2 +- ...Detector_1_1sharedSlsDetector-members.html | 4 +- ...tructslsDetector_1_1sharedSlsDetector.html | 36 +- .../structsls__detector__channel-members.html | 2 +- .../html/structsls__detector__channel.html | 2 +- .../structsls__detector__chip-members.html | 2 +- .../docs/html/structsls__detector__chip.html | 2 +- .../structsls__detector__module-members.html | 2 +- .../html/structsls__detector__module.html | 2 +- .../docs/html/usersFunctions_8c.html | 2 +- .../docs/html/usersFunctions_8h-source.html | 2 +- .../docs/html/usersFunctions_8h.html | 2 +- slsDetectorSoftware/docs/latex/annotated.tex | 2 +- slsDetectorSoftware/docs/latex/bug.tex | 2 +- .../docs/latex/classeigerDetector.tex | 36 +- .../docs/latex/classmythenDetector.tex | 215 +-- .../docs/latex/classslsDetector.tex | 493 +++--- slsDetectorSoftware/docs/latex/doxygen.sty | 4 +- slsDetectorSoftware/docs/latex/index.tex | 9 +- .../docs/latex/mythenDetector_8h.tex | 15 +- slsDetectorSoftware/docs/latex/refman.tex | 2 +- .../docs/latex/slsDetector_8h.tex | 2 +- .../docs/latex/sls__detector__defs_8h.tex | 33 +- ...structslsDetector_1_1sharedSlsDetector.tex | 18 +- .../mythenDetector/mythenDetector.cpp | 1127 ++++++++++++- .../mythenDetector/mythenDetector.h | 132 +- .../mythenDetectorServer/Makefile | 6 +- .../mythenDetectorServer/firmware_funcs.c | 65 +- .../mythenDetectorServer/firmware_funcs.h | 1 + .../mythenDetectorServer/mcb_funcs.c | 159 +- .../mythenDetectorServer/registers.h | 4 +- .../mythenDetectorServer/server.c | 1 + .../mythenDetectorServer/server_funcs.c | 132 +- .../mythenDetectorServer/trimming_funcs.c | 64 +- .../slsDetector/slsDetector.cpp | 1406 ++++------------- slsDetectorSoftware/slsDetector/slsDetector.h | 273 ++-- 102 files changed, 4259 insertions(+), 3593 deletions(-) diff --git a/slsDetectorSoftware/bin/libSlsDetector.so.1.0.1 b/slsDetectorSoftware/bin/libSlsDetector.so.1.0.1 index f1492224c5f8549cec256e5d43cf3725a45b23d4..c67f4d11af5a554501208372357dd0dec4a5dd35 100755 GIT binary patch literal 273580 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

v<#EpS>Fd4cp7n*V00# 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%0A}~CjDj%sf9_);R84m$5Q`}MnkqfyaBHT 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�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 literal 339790 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%0Dqyb^CwN!~O&ZDnC;0ShCvQ?K_GR-Wxm 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᤼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 z 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 P)c5bB%DBHLldb;`8pI-e diff --git a/slsDetectorSoftware/commonFiles/sls_detector_defs.h b/slsDetectorSoftware/commonFiles/sls_detector_defs.h index db20a7f76..ce40f56b5 100755 --- a/slsDetectorSoftware/commonFiles/sls_detector_defs.h +++ b/slsDetectorSoftware/commonFiles/sls_detector_defs.h @@ -152,7 +152,8 @@ enum dimension { */ enum { OK, /**< function succeeded */ - FAIL /**< function failed */ + FAIL, /**< function failed */ + FINISHED /**< function failed */ }; /** @@ -294,6 +295,15 @@ enum timerIndex { CYCLES_NUMBER /**< number of cycles: total number of acquisitions is number or frames*number of cycles */ }; +/** + important speed parameters +*/ +enum speedVariable { + CLOCK_DIVIDER, /**< readout clock divider */ + WAIT_STATES, /**< wait states for bus read */ + SET_SIGNAL_LENGTH /**< set/clear signal length */ +}; + /** readout flags */ @@ -350,7 +360,6 @@ enum { F_SET_EXTERNAL_COMMUNICATION_MODE, /**< set/get external communication mode (obsolete) */ - // Tests and identification F_GET_ID, /**< get detector id of version */ @@ -405,6 +414,8 @@ enum { F_SET_READOUT_FLAGS, /**< set/get readout flags */ F_SET_ROI, /**< set/get region of interest */ + F_SET_SPEED, /**< set/get readout speed parameters */ + //Trimming F_EXECUTE_TRIMMING, /**< execute trimming */ diff --git a/slsDetectorSoftware/docs/html/MySocketTCP_8cxx.html b/slsDetectorSoftware/docs/html/MySocketTCP_8cxx.html index eefa5dba5..995e4c29b 100644 --- a/slsDetectorSoftware/docs/html/MySocketTCP_8cxx.html +++ b/slsDetectorSoftware/docs/html/MySocketTCP_8cxx.html @@ -25,7 +25,7 @@
-


Generated on Fri Oct 9 16:01:04 2009 by  +
Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
diff --git a/slsDetectorSoftware/docs/html/MySocketTCP_8h-source.html b/slsDetectorSoftware/docs/html/MySocketTCP_8h-source.html index 3a99da11f..7bcdc24fa 100644 --- a/slsDetectorSoftware/docs/html/MySocketTCP_8h-source.html +++ b/slsDetectorSoftware/docs/html/MySocketTCP_8h-source.html @@ -108,7 +108,7 @@ 00088 00089 }; 00090 #endif -
Generated on Fri Oct 9 16:01:04 2009 by  +
Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
diff --git a/slsDetectorSoftware/docs/html/MySocketTCP_8h.html b/slsDetectorSoftware/docs/html/MySocketTCP_8h.html index 86e560077..24e9ec6c8 100644 --- a/slsDetectorSoftware/docs/html/MySocketTCP_8h.html +++ b/slsDetectorSoftware/docs/html/MySocketTCP_8h.html @@ -67,7 +67,7 @@

-


Generated on Fri Oct 9 16:01:04 2009 by  +
Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
diff --git a/slsDetectorSoftware/docs/html/annotated.html b/slsDetectorSoftware/docs/html/annotated.html index 70855c713..eb80d7c73 100644 --- a/slsDetectorSoftware/docs/html/annotated.html +++ b/slsDetectorSoftware/docs/html/annotated.html @@ -24,7 +24,7 @@ eigerDetectorThis is class contains all eiger specific functionalities iarray MySocketTCP - mythenDetectorThis calss contains all mythen specific functions + mythenDetector ROI sls_detector_channel sls_detector_chip @@ -32,7 +32,7 @@ slsDetectorThis is the base class for all SLS detector functionalities slsDetector::sharedSlsDetectorStructure allocated in shared memory to store detector settings and be accessed in parallel by several applications (take care of possible conflicts!) -
Generated on Fri Oct 9 16:01:04 2009 by  +
Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
diff --git a/slsDetectorSoftware/docs/html/bug.html b/slsDetectorSoftware/docs/html/bug.html index 4e4a6acee..9ca8892d3 100644 --- a/slsDetectorSoftware/docs/html/bug.html +++ b/slsDetectorSoftware/docs/html/bug.html @@ -14,10 +14,10 @@
  • Related Pages
  • Bug List

    -
    Member slsDetector::getChip (int ichip, int imod)
    +
    Member slsDetector::getChip (int ichip, int imod)
    probably does not return corretly!
    -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/classMySocketTCP-members.html b/slsDetectorSoftware/docs/html/classMySocketTCP-members.html index 0e2acde0e..706a079a0 100644 --- a/slsDetectorSoftware/docs/html/classMySocketTCP-members.html +++ b/slsDetectorSoftware/docs/html/classMySocketTCP-members.html @@ -43,7 +43,7 @@ serverAddressMySocketTCP [private] socketDescriptorMySocketTCP [private] ~MySocketTCP()MySocketTCP -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/classMySocketTCP.html b/slsDetectorSoftware/docs/html/classMySocketTCP.html index 95cdeae8b..c327f12a6 100644 --- a/slsDetectorSoftware/docs/html/classMySocketTCP.html +++ b/slsDetectorSoftware/docs/html/classMySocketTCP.html @@ -550,7 +550,7 @@


    The documentation for this class was generated from the following files: -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/classeigerDetector-members.html b/slsDetectorSoftware/docs/html/classeigerDetector-members.html index b2daf2be8..cb240e402 100644 --- a/slsDetectorSoftware/docs/html/classeigerDetector-members.html +++ b/slsDetectorSoftware/docs/html/classeigerDetector-members.html @@ -20,15 +20,29 @@
  • Class Members
  • eigerDetector Member List

    This is the complete list of members for eigerDetector, including all inherited members.

    - - + + + + + + + - + + + + + + + + + + - + @@ -36,70 +50,88 @@ + + + + - + + + - + - - - + + + - + - + - - + + - - + - + + + + + + + + + - + - - - - - + + + + + - - - - + + + + + + + + + + - + - @@ -109,41 +141,45 @@ - + - + - + - + + + - - - - - + + + + + + + - - + + -
    acquire()slsDetector
    addToMerging(float *p1, float *v1, float *e1, float *mp, float *mv, float *me, int *mm)slsDetector
    acquire()=0slsDetector [pure virtual]
    adcsslsDetector [protected]
    addToMerging(float *p1, float *v1, float *e1, float *mp, float *mv, float *me, int *mm)=0slsDetector [pure virtual]
    analogTest(analogTestMode mode)slsDetector
    badChannelMaskslsDetector [protected]
    chanregsslsDetector [protected]
    chipregsslsDetector [protected]
    controlSocketslsDetector [protected]
    createFileName()slsDetector
    createModule()slsDetector
    createModule()slsDetector
    currentI0slsDetector [protected]
    currentPositionslsDetector [protected]
    currentPositionIndexslsDetector [protected]
    dacsslsDetector [protected]
    dataProcessingThreadslsDetector [protected]
    dataQueueslsDetector [protected]
    dataSocketslsDetector [protected]
    decodeData(int *datain)eigerDetector
    deleteModule(sls_detector_module *myMod)slsDetector
    detectorModulesslsDetector [protected]
    detIdslsDetector [protected]
    digitalTest(digitalTestMode mode, int imod=0)slsDetector
    dumpDetectorSetup(string const fname)slsDetector
    dumpDetectorSetup(string const fname)=0slsDetector [pure virtual]
    eigerDetector(int id=0)eigerDetector
    enableAnalogOutput(int ichan)slsDetector
    enableAnalogOutput(int imod, int ichip, int ichan)slsDetector
    executeTrimming(trimMode mode, int par1, int par2, int imod=-1)slsDetector
    exists()slsDetector [inline]
    exitServer()slsDetector
    ffcoefficientsslsDetector [protected]
    fferrorsslsDetector [protected]
    fillBadChannelMask()slsDetector [protected]
    finalizeMerging(float *mp, float *mv, float *me, int *mm)slsDetector
    flatFieldCorrect(float datain, float errin, float &dataout, float &errout, float ffcoefficient, float fferr)slsDetector
    flatFieldCorrect(float *datain, float *errin, float *dataout, float *errout)slsDetector
    freeSharedMemory()slsDetector [protected]
    GET_ONLINE_FLAG enum valueslsDetector
    getADC(dacIndex index, int imod=0)slsDetector
    getAngularConversion(int &direction, angleConversionConstant *angconv=NULL)slsDetector
    getAngularConversion(int &direction, angleConversionConstant *angconv=NULL)=0slsDetector [pure virtual]
    getAngularConversion()=0slsDetector [pure virtual]
    getBadChannelCorrectionFile()slsDetector [inline]
    getBadChannelCorrections(int *bad=NULL)slsDetector
    getBinSize()slsDetector [inline]
    getBinSize()=0slsDetector [pure virtual]
    getCalDir()slsDetector [inline]
    getChannel(int ichan, int ichip, int imod)slsDetector
    getChip(int ichip, int imod)slsDetector
    getClockDivider()slsDetector [inline]
    getChannel(int ichan, int ichip, int imod)slsDetector
    getChip(int ichip, int imod)slsDetector
    getControlPort()slsDetector [inline]
    getDataFromDetector()slsDetector [protected]
    getDataFromDetectorNoWait()slsDetector
    getDataPort()slsDetector [inline]
    getDetectorType(char *type)slsDetector
    getFileIndex()slsDetector [inline]
    getFileName()slsDetector [inline]
    getFilePath()slsDetector [inline]
    getFineOffset()slsDetector [inline]
    getFineOffset()=0slsDetector [pure virtual]
    getFlatFieldCorrections(float *corr=NULL, float *ecorr=NULL)slsDetector
    getGlobalOffset()slsDetector [inline]
    getGlobalOffset()=0slsDetector [pure virtual]
    getHostname()slsDetector [inline]
    getId(idMode mode, int imod=0)slsDetector
    getMaxNumberOfModules(dimension d=X)slsDetector
    getModule(int imod)slsDetector
    getPositions(float *pos=NULL)slsDetector [inline]
    getModule(int imod)slsDetector
    getPositions(float *pos=NULL)=0slsDetector [pure virtual]
    getRateCorrections(float &t)slsDetector
    getRateCorrections()slsDetector
    getRunStatus()slsDetector
    getSetLength()slsDetector [inline]
    getSettings(int imod=-1)slsDetector
    getSettings(int imod=-1)slsDetector
    getStopPort()slsDetector [inline]
    getThresholdEnergy(int imod=-1)slsDetector
    getTimeLeft(timerIndex index)slsDetector
    getTrimDir()slsDetector [inline]
    getTrimEn(int *en)slsDetector [inline]
    getTrimEn(int *en=NULL)slsDetector [inline]
    giveCalibrationPulse(float vcal, int npulses)slsDetector
    initializeDetectorSize(detectorType type)slsDetector [protected]
    initializeDetectorStructure()slsDetector [protected]
    initSharedMemory(detectorType type=GENERIC, int id=0)slsDetector [protected]
    mergingBinsslsDetector [protected]
    mergingCountsslsDetector [protected]
    mergingErrorsslsDetector [protected]
    mergingMultiplicityslsDetector [protected]
    OFFLINE_FLAG enum valueslsDetector
    ONLINE_FLAG enum valueslsDetector
    onlineFlagslsDetector [protected]
    popDataQueue()slsDetector
    processData()slsDetector
    processData()=0slsDetector [pure virtual]
    rateCorrect(float datain, float errin, float &dataout, float &errout, float tau, float t)slsDetector
    rateCorrect(float *datain, float *errin, float *dataout, float *errout)slsDetector
    readAll()slsDetector
    readAngularConversion(string fname="")slsDetector
    readCalibrationFile(string fname, float &gain, float &offset)eigerDetector
    readConfigurationFile(string const fname)slsDetector
    readDataFile(string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int nch=0)eigerDetector
    readDataFile(string fname, int *data)eigerDetector
    readAngularConversion(string fname="")=0slsDetector [pure virtual]
    readCalibrationFile(string fname, float &gain, float &offset)eigerDetector [virtual]
    readConfigurationFile(string const fname)=0slsDetector [pure virtual]
    readDataFile(string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int nch=0)eigerDetector [virtual]
    readDataFile(string fname, int *data)eigerDetector [virtual]
    readFrame()slsDetector
    readRegister(int addr)slsDetector
    readTrimFile(string fname, sls_detector_module *myMod=NULL)eigerDetector
    resetMerging(float *mp, float *mv, float *me, int *mm)slsDetector
    retrieveDetectorSetup(string const fname)slsDetector
    setAngularConversion(string fname="")slsDetector
    readTrimFile(string fname, sls_detector_module *myMod=NULL)eigerDetector [virtual]
    receiveChannel(sls_detector_channel *)slsDetector [protected]
    receiveChip(sls_detector_chip *)slsDetector [protected]
    receiveModule(sls_detector_module *)slsDetector [protected]
    resetMerging(float *mp, float *mv, float *me, int *mm)=0slsDetector [pure virtual]
    retrieveDetectorSetup(string const fname)=0slsDetector [pure virtual]
    sendChannel(sls_detector_channel *)slsDetector [protected]
    sendChip(sls_detector_chip *)slsDetector [protected]
    sendModule(sls_detector_module *)slsDetector [protected]
    setAngularConversion(string fname="")=0slsDetector [pure virtual]
    setBadChannelCorrection(string fname="")slsDetector
    setBinSize(float bs)slsDetector [inline]
    setBinSize(float bs)=0slsDetector [pure virtual]
    setCalDir(string s)slsDetector [inline]
    setChannel(int64_t reg, int ichan=-1, int ichip=-1, int imod=-1)slsDetector
    setChannel(sls_detector_channel chan)slsDetector
    setChip(int reg, int ichip=-1, int imod=-1)slsDetector
    setChip(sls_detector_chip chip)slsDetector
    setClockDivider(int i)slsDetector [inline]
    setDAC(float val, dacIndex index, int imod=-1)slsDetector
    setDetectorType(detectorType type=GET_DETECTOR_TYPE)slsDetector
    setDetectorType(string type)slsDetector
    setFileIndex(int i)slsDetector [inline]
    setFileName(string s)slsDetector [inline]
    setFilePath(string s)slsDetector [inline]
    setFineOffset(float f)slsDetector [inline]
    setFineOffset(float f)=0slsDetector [pure virtual]
    setFlatFieldCorrection(string fname="")slsDetector
    setGlobalOffset(float f)slsDetector [inline]
    setGlobalOffset(float f)=0slsDetector [pure virtual]
    setModule(int reg, int imod=-1)slsDetector
    setModule(sls_detector_module module)slsDetector
    setNumberOfModules(int n, dimension d=X)slsDetector
    setOnline(int const online)slsDetector
    setPositions(int nPos, float *pos)slsDetector [inline]
    setPositions(int nPos, float *pos)=0slsDetector [pure virtual]
    setRateCorrection(float t=0)slsDetector
    setReadOutFlags(readOutFlags flag)slsDetector
    setROI(int nroi=-1, int *xmin=NULL, int *xmax=NULL, int *ymin=NULL, int *ymax=NULL)slsDetector
    setSetLength(int i)slsDetector [inline]
    setSettings(detectorSettings isettings, int imod=-1)slsDetector
    setSpeed(speedVariable sp, int value=-1)slsDetector
    setTCPSocket(string const name="", int const control_port=-1, int const stop_port=-1, int const data_port=-1)slsDetector
    setThresholdEnergy(int e_eV, int imod=-1, detectorSettings isettings=GET_SETTINGS)slsDetector
    setTimer(timerIndex index, int64_t t=-1)slsDetector
    setTrimDir(string s)slsDetector [inline]
    sharedSlsDetector typedefslsDetector
    shmIdslsDetector [protected]
    slsDetector(detectorType type=GENERIC, int id=0)slsDetector
    startAcquisition()slsDetector
    startAndReadAll()slsDetector
    startAndReadAllNoWait()slsDetector
    startReadOut()slsDetector
    startThread()slsDetector [protected]
    stopAcquisition()slsDetector
    writeAngularConversion(string fname="")slsDetector
    writeCalibrationFile(string fname, float gain, float offset)eigerDetector
    writeConfigurationFile(string const fname)slsDetector
    writeDataFile(string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int nch=-1)eigerDetector
    writeDataFile(string fname, int *data)eigerDetector
    stopSocketslsDetector [protected]
    thisDetectorslsDetector [protected]
    writeAngularConversion(string fname="")=0slsDetector [pure virtual]
    writeCalibrationFile(string fname, float gain, float offset)eigerDetector [virtual]
    writeConfigurationFile(string const fname)=0slsDetector [pure virtual]
    writeDataFile(string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int nch=-1)eigerDetector [virtual]
    writeDataFile(string fname, int *data)eigerDetector [virtual]
    writeRegister(int addr, int val)slsDetector
    writeTrimFile(string fname, sls_detector_module mod)eigerDetector
    writeTrimFile(string fname, int imod)eigerDetector
    writeTrimFile(string fname, sls_detector_module mod)eigerDetector [virtual]
    writeTrimFile(string fname, int imod)eigerDetector [virtual]
    ~eigerDetector()eigerDetector [inline]
    ~slsDetector()slsDetector [inline]


    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/classeigerDetector.html b/slsDetectorSoftware/docs/html/classeigerDetector.html index 20f56c637..8102e1548 100644 --- a/slsDetectorSoftware/docs/html/classeigerDetector.html +++ b/slsDetectorSoftware/docs/html/classeigerDetector.html @@ -165,7 +165,7 @@ Reimplemented from + [virtual] @@ -182,7 +182,7 @@ int sharedSlsDetector

    -Reimplemented from slsDetector. +Implements slsDetector.

    @@ -204,7 +204,7 @@ Reimplemented from + [virtual] @@ -220,7 +220,7 @@ reads a data file

    Parameters:
    Returns:
    OK or FAIL if it could not read the file or data=NULL

    -Reimplemented from slsDetector. +Implements slsDetector.

    @@ -266,7 +266,7 @@ Reimplemented from + [virtual] @@ -286,7 +286,7 @@ reads a data file

    Parameters:
    Returns:
    OK or FAIL if it could not read the file or data=NULL

    -Reimplemented from slsDetector. +Implements slsDetector.

    @@ -308,7 +308,7 @@ Reimplemented from + [virtual] @@ -325,7 +325,7 @@ reads a trim file

    Parameters:
    Returns:
    the pointer to myMod or NULL if reading the file failed

    -Reimplemented from slsDetector. +Implements slsDetector.

    @@ -353,7 +353,7 @@ Reimplemented from + [virtual] @@ -370,7 +370,7 @@ writes a clibration file

    Parameters:
    See also:
    sharedSlsDetector

    -Reimplemented from slsDetector. +Implements slsDetector.

    @@ -392,7 +392,7 @@ Reimplemented from + [virtual] @@ -408,7 +408,7 @@ writes a data file

    Parameters:
    Returns:
    OK or FAIL if it could not write the file or data=NULL

    -Reimplemented from slsDetector. +Implements slsDetector.

    @@ -454,7 +454,7 @@ Reimplemented from + [virtual] @@ -474,7 +474,7 @@ writes a data file

    Parameters:
    Returns:
    OK or FAIL if it could not write the file or data=NULL

    -Reimplemented from slsDetector. +Implements slsDetector.

    @@ -496,7 +496,7 @@ Reimplemented from + [virtual] @@ -513,7 +513,7 @@ writes a trim file for module number imod - the values will be read from the cur

    See also:
    sls_detector_module sharedSlsDetector

    -Reimplemented from slsDetector. +Implements slsDetector.

    @@ -535,7 +535,7 @@ Reimplemented from + [virtual] @@ -552,12 +552,12 @@ writes a trim file

    Parameters:
    See also:
    sls_detector_module

    -Reimplemented from slsDetector. +Implements slsDetector.


    The documentation for this class was generated from the following file: -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/classmythenDetector-members.html b/slsDetectorSoftware/docs/html/classmythenDetector-members.html index 283b52963..a79c4d5ec 100644 --- a/slsDetectorSoftware/docs/html/classmythenDetector-members.html +++ b/slsDetectorSoftware/docs/html/classmythenDetector-members.html @@ -20,86 +20,117 @@
  • Class Members
  • mythenDetector Member List

    This is the complete list of members for mythenDetector, including all inherited members.

    - - + + + + + + + - - + + + + + + + + + + + - + + + + + - + + + - + - - - + + + - + - + - - + + - - + - + - + + + + + + + + - + - - - - - + + + + + - - - - + + + + + + + + + + - + - @@ -109,41 +140,44 @@ - + - + - + - + + + - - - - - + + + + + + + - - - + + -
    acquire()slsDetector
    addToMerging(float *p1, float *v1, float *e1, float *mp, float *mv, float *me, int *mm)mythenDetector
    acquire()mythenDetector [virtual]
    adcsslsDetector [protected]
    addToMerging(float *p1, float *v1, float *e1, float *mp, float *mv, float *me, int *mm)mythenDetector [virtual]
    analogTest(analogTestMode mode)slsDetector
    badChannelMaskslsDetector [protected]
    chanregsslsDetector [protected]
    chipregsslsDetector [protected]
    controlSocketslsDetector [protected]
    createFileName()slsDetector
    createModule()slsDetector
    decodeData(int *datain)mythenDetector
    createModule()slsDetector
    currentI0slsDetector [protected]
    currentPositionslsDetector [protected]
    currentPositionIndexslsDetector [protected]
    dacsslsDetector [protected]
    dataProcessingThreadslsDetector [protected]
    dataQueueslsDetector [protected]
    dataSocketslsDetector [protected]
    decodeData(int *datain)slsDetector
    deleteModule(sls_detector_module *myMod)slsDetector
    detectorModulesslsDetector [protected]
    detIdslsDetector [protected]
    digitalTest(digitalTestMode mode, int imod=0)slsDetector
    dumpDetectorSetup(string const fname)slsDetector
    dumpDetectorSetup(string const fname)mythenDetector [virtual]
    enableAnalogOutput(int ichan)slsDetector
    enableAnalogOutput(int imod, int ichip, int ichan)slsDetector
    execCommand(string cmd, string answer)slsDetector
    executeTrimming(trimMode mode, int par1, int par2, int imod=-1)slsDetector
    exists()slsDetector [inline]
    exitServer()slsDetector
    ffcoefficientsslsDetector [protected]
    fferrorsslsDetector [protected]
    fillBadChannelMask()slsDetector [protected]
    finalizeMerging(float *mp, float *mv, float *me, int *mm)mythenDetector
    flatFieldCorrect(float datain, float errin, float &dataout, float &errout, float ffcoefficient, float fferr)slsDetector
    flatFieldCorrect(float *datain, float *errin, float *dataout, float *errout)slsDetector
    freeSharedMemory()slsDetector [protected]
    GET_ONLINE_FLAG enum valueslsDetector
    getADC(dacIndex index, int imod=0)slsDetector
    getAngularConversion(int &direction, angleConversionConstant *angconv=NULL)mythenDetector
    getAngularConversion(int &direction, angleConversionConstant *angconv=NULL)mythenDetector [virtual]
    getAngularConversion()mythenDetector [inline, virtual]
    getBadChannelCorrectionFile()slsDetector [inline]
    getBadChannelCorrections(int *bad=NULL)slsDetector
    getBinSize()mythenDetector [inline]
    getBinSize()mythenDetector [inline, virtual]
    getCalDir()slsDetector [inline]
    getChannel(int ichan, int ichip, int imod)slsDetector
    getChip(int ichip, int imod)slsDetector
    getClockDivider()slsDetector [inline]
    getChannel(int ichan, int ichip, int imod)slsDetector
    getChip(int ichip, int imod)slsDetector
    getControlPort()slsDetector [inline]
    getDataFromDetector()slsDetector [protected]
    getDataFromDetectorNoWait()slsDetector
    getDataPort()slsDetector [inline]
    getDetectorType(char *type)slsDetector
    getFileIndex()slsDetector [inline]
    getFileName()slsDetector [inline]
    getFilePath()slsDetector [inline]
    getFineOffset()mythenDetector [inline]
    getFineOffset()mythenDetector [inline, virtual]
    getFlatFieldCorrections(float *corr=NULL, float *ecorr=NULL)slsDetector
    getGlobalOffset()mythenDetector [inline]
    getGlobalOffset()mythenDetector [inline, virtual]
    getHostname()slsDetector [inline]
    getId(idMode mode, int imod=0)slsDetector
    getMaxNumberOfModules(dimension d=X)slsDetector
    getModule(int imod)slsDetector
    getPositions(float *pos=NULL)mythenDetector [inline]
    getModule(int imod)slsDetector
    getPositions(float *pos=NULL)mythenDetector [inline, virtual]
    getRateCorrections(float &t)slsDetector
    getRateCorrections()slsDetector
    getRunStatus()slsDetector
    getSetLength()slsDetector [inline]
    getSettings(int imod=-1)slsDetector
    getSettings(int imod=-1)slsDetector
    getStopPort()slsDetector [inline]
    getThresholdEnergy(int imod=-1)slsDetector
    getTimeLeft(timerIndex index)slsDetector
    getTrimDir()slsDetector [inline]
    getTrimEn(int *en)slsDetector [inline]
    getTrimEn(int *en=NULL)slsDetector [inline]
    giveCalibrationPulse(float vcal, int npulses)slsDetector
    mythenDetector(int id=0)mythenDetector
    initializeDetectorSize(detectorType type)slsDetector [protected]
    initializeDetectorStructure()slsDetector [protected]
    initSharedMemory(detectorType type=GENERIC, int id=0)slsDetector [protected]
    mergingBinsslsDetector [protected]
    mergingCountsslsDetector [protected]
    mergingErrorsslsDetector [protected]
    mergingMultiplicityslsDetector [protected]
    OFFLINE_FLAG enum valueslsDetector
    ONLINE_FLAG enum valueslsDetector
    onlineFlagslsDetector [protected]
    popDataQueue()slsDetector
    processData()slsDetector
    processData()mythenDetector [virtual]
    rateCorrect(float datain, float errin, float &dataout, float &errout, float tau, float t)slsDetector
    rateCorrect(float *datain, float *errin, float *dataout, float *errout)slsDetector
    readAll()slsDetector
    readAngularConversion(string fname="")mythenDetector
    readCalibrationFile(string fname, float &gain, float &offset)mythenDetector
    readConfigurationFile(string const fname)slsDetector
    readDataFile(string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int nch=0)mythenDetector
    readDataFile(string fname, int *data)mythenDetector
    readAngularConversion(string fname="")mythenDetector [virtual]
    readCalibrationFile(string fname, float &gain, float &offset)mythenDetector [virtual]
    readConfigurationFile(string const fname)mythenDetector [virtual]
    readDataFile(string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int nch=0)mythenDetector [virtual]
    readDataFile(string fname, int *data)mythenDetector [virtual]
    readFrame()slsDetector
    readRegister(int addr)slsDetector
    readTrimFile(string fname, sls_detector_module *myMod=NULL)mythenDetector
    resetMerging(float *mp, float *mv, float *me, int *mm)mythenDetector
    retrieveDetectorSetup(string const fname)slsDetector
    setAngularConversion(string fname="")mythenDetector
    readTrimFile(string fname, sls_detector_module *myMod=NULL)mythenDetector [virtual]
    receiveChannel(sls_detector_channel *)slsDetector [protected]
    receiveChip(sls_detector_chip *)slsDetector [protected]
    receiveModule(sls_detector_module *)slsDetector [protected]
    resetMerging(float *mp, float *mv, float *me, int *mm)mythenDetector [virtual]
    retrieveDetectorSetup(string const fname)mythenDetector [virtual]
    sendChannel(sls_detector_channel *)slsDetector [protected]
    sendChip(sls_detector_chip *)slsDetector [protected]
    sendModule(sls_detector_module *)slsDetector [protected]
    setAngularConversion(string fname="")mythenDetector [virtual]
    setBadChannelCorrection(string fname="")slsDetector
    setBinSize(float bs)mythenDetector [inline]
    setBinSize(float bs)mythenDetector [inline, virtual]
    setCalDir(string s)slsDetector [inline]
    setChannel(int64_t reg, int ichan=-1, int ichip=-1, int imod=-1)slsDetector
    setChannel(sls_detector_channel chan)slsDetector
    setChip(int reg, int ichip=-1, int imod=-1)slsDetector
    setChip(sls_detector_chip chip)slsDetector
    setClockDivider(int i)slsDetector [inline]
    setDAC(float val, dacIndex index, int imod=-1)slsDetector
    setDetectorType(detectorType type=GET_DETECTOR_TYPE)slsDetector
    setDetectorType(string type)slsDetector
    setFileIndex(int i)slsDetector [inline]
    setFileName(string s)slsDetector [inline]
    setFilePath(string s)slsDetector [inline]
    setFineOffset(float f)mythenDetector [inline]
    setFineOffset(float f)mythenDetector [inline, virtual]
    setFlatFieldCorrection(string fname="")slsDetector
    setGlobalOffset(float f)mythenDetector [inline]
    setGlobalOffset(float f)mythenDetector [inline, virtual]
    setModule(int reg, int imod=-1)slsDetector
    setModule(sls_detector_module module)slsDetector
    setNumberOfModules(int n, dimension d=X)slsDetector
    setOnline(int const online)slsDetector
    setPositions(int nPos, float *pos)mythenDetector [inline]
    setPositions(int nPos, float *pos)mythenDetector [inline, virtual]
    setRateCorrection(float t=0)slsDetector
    setReadOutFlags(readOutFlags flag)slsDetector
    setROI(int nroi=-1, int *xmin=NULL, int *xmax=NULL, int *ymin=NULL, int *ymax=NULL)slsDetector
    setSetLength(int i)slsDetector [inline]
    setSettings(detectorSettings isettings, int imod=-1)slsDetector
    setSpeed(speedVariable sp, int value=-1)slsDetector
    setTCPSocket(string const name="", int const control_port=-1, int const stop_port=-1, int const data_port=-1)slsDetector
    setThresholdEnergy(int e_eV, int imod=-1, detectorSettings isettings=GET_SETTINGS)slsDetector
    setTimer(timerIndex index, int64_t t=-1)slsDetector
    setTrimDir(string s)slsDetector [inline]
    sharedSlsDetector typedefslsDetector
    shmIdslsDetector [protected]
    slsDetector(detectorType type=GENERIC, int id=0)slsDetector
    startAcquisition()slsDetector
    startAndReadAll()slsDetector
    startAndReadAllNoWait()slsDetector
    startReadOut()slsDetector
    startThread()slsDetector [protected]
    stopAcquisition()slsDetector
    writeAngularConversion(string fname="")mythenDetector
    writeCalibrationFile(string fname, float gain, float offset)mythenDetector
    writeConfigurationFile(string const fname)slsDetector
    writeDataFile(string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int nch=-1)mythenDetector
    writeDataFile(string fname, int *data)mythenDetector
    stopSocketslsDetector [protected]
    thisDetectorslsDetector [protected]
    writeAngularConversion(string fname="")mythenDetector [virtual]
    writeCalibrationFile(string fname, float gain, float offset)mythenDetector [virtual]
    writeConfigurationFile(string const fname)mythenDetector [virtual]
    writeDataFile(string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int nch=-1)mythenDetector [virtual]
    writeDataFile(string fname, int *data)mythenDetector [virtual]
    writeRegister(int addr, int val)slsDetector
    writeTrimFile(string fname, sls_detector_module mod)mythenDetector
    writeTrimFile(string fname, int imod)mythenDetector
    ~mythenDetector()mythenDetector [inline]
    writeTrimFile(string fname, sls_detector_module mod)mythenDetector [virtual]
    writeTrimFile(string fname, int imod)mythenDetector [virtual]
    ~slsDetector()slsDetector [inline]


    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/classmythenDetector.html b/slsDetectorSoftware/docs/html/classmythenDetector.html index 605918732..d1de0e6bf 100644 --- a/slsDetectorSoftware/docs/html/classmythenDetector.html +++ b/slsDetectorSoftware/docs/html/classmythenDetector.html @@ -19,10 +19,7 @@
  • Class Hierarchy
  • Class Members
  • -

    mythenDetector Class Reference

    This calss contains all mythen specific functions. -More... -

    -#include <mythenDetector.h> +

    mythenDetector Class Reference

    #include <mythenDetector.h>

    Inheritance diagram for mythenDetector:

    @@ -32,9 +29,13 @@ List of all members. - + - + + + + + @@ -62,6 +63,8 @@ + + @@ -78,70 +81,43 @@ - - + + + +

    Public Member Functions

     mythenDetector (int id=0)
    int readConfigurationFile (string const fname)
     ~mythenDetector ()
    int writeConfigurationFile (string const fname)
    int dumpDetectorSetup (string const fname)
    int retrieveDetectorSetup (string const fname)
    sls_detector_modulereadTrimFile (string fname, sls_detector_module *myMod=NULL)
    int getAngularConversion (int &direction, angleConversionConstant *angconv=NULL)
    char * getAngularConversion ()
    float setGlobalOffset (float f)
    float setFineOffset (float f)
    float getBinSize ()
    float * decodeData (int *datain)
    int resetMerging (float *mp, float *mv, float *me, int *mm)
    int addToMerging (float *p1, float *v1, float *e1, float *mp, float *mv, float *me, int *mm)
    int finalizeMerging (float *mp, float *mv, float *me, int *mm)
    void * processData ()
    void acquire ()
    -

    Detailed Description

    -This calss contains all mythen specific functions. -

    -The mythenDetector class contains the functions specific to the mythen detector

    -

    Author:
    Anna Bergamaschi
    -
    Version:
    0.1alpha (any string)
    - -

    -


    Constructor & Destructor Documentation

    - +

    Member Function Documentation

    +
    - - - - - - - -
    mythenDetector::mythenDetector (int  id = 0  ) 
    -
    -
    - -

    -(default) constructor

    -

    Parameters:
    - - -
    id is the detector index which is needed to define the shared memory id. Different physical detectors should have different IDs in order to work independently
    -
    - -
    -

    - -

    -
    - - - + - +
    mythenDetector::~mythenDetector void mythenDetector::acquire (  )  [inline] [virtual]

    -destructor +performs the complete acquisition and data processing moves the detector to next position
    + starts and reads the detector
    + reads the IC (if required)
    + reads the encoder (iof required for angualr conversion)
    + processes the data (flat field, rate, angular conversion and merging processData()) +

    +Implements slsDetector.

    -


    Member Function Documentation

    @@ -191,14 +167,14 @@ destructor ) - + [virtual]

    -not yet implemented merge dataset

    Parameters:
    +merge dataset
    Parameters:
    @@ -211,35 +187,30 @@ not yet implemented merge dataset
    Parameters:

    -Reimplemented from slsDetector. +Implements slsDetector.

    - +

    p1 angular positions of dataset
    v1 data
    - + - - + + - +
    float* mythenDetector::decodeData int mythenDetector::dumpDetectorSetup (int *  datain string const   fname  )  [virtual]

    -decode data from the detector converting them to an array of floats, one for each channle

    Parameters:
    - - -
    datain data from the detector
    -
    -
    Returns:
    pointer to a float array with a data per channel
    - +not yet implemented

    +should dump to a file all the current detector parameters

    -Reimplemented from slsDetector. +Implements slsDetector.

    @@ -294,6 +265,27 @@ calculates the "final" positions, data value and errors for the emrged data

    slsDetector.

    + +

    +
    + + + + + + + + +
    char* mythenDetector::getAngularConversion (  )  [inline, virtual]
    +
    +
    + +

    +returns the angular conversion file +

    +Implements slsDetector. +

    +

    @@ -341,7 +333,7 @@ Reimplemented from  )  - [inline] + [inline, virtual] @@ -350,7 +342,7 @@ Reimplemented from slsDetector. +Implements slsDetector.

    @@ -362,7 +354,7 @@ Reimplemented from  )  - [inline] + [inline, virtual] @@ -371,7 +363,7 @@ Reimplemented from slsDetector. +Implements slsDetector.

    @@ -383,7 +375,7 @@ Reimplemented from  )  - [inline] + [inline, virtual] @@ -392,7 +384,7 @@ Reimplemented from slsDetector. +Implements slsDetector.

    @@ -405,7 +397,7 @@ Reimplemented from float *  pos = NULL  )  - [inline] + [inline, virtual] @@ -420,7 +412,28 @@ get positions for the acquisition

    Parameters:
    Returns:
    number of positions

    -Reimplemented from slsDetector. +Implements slsDetector. + +

    + +

    +
    + + + + + + + + +
    void* mythenDetector::processData (  )  [virtual]
    +
    +
    + +

    +function for processing data +

    +Implements slsDetector.

    @@ -433,7 +446,7 @@ Reimplemented from string  fname = ""  )  - + [virtual] @@ -448,7 +461,7 @@ reads an angular conversion file

    Parameters:
    See also:
    angleConversionConstant

    -Reimplemented from slsDetector. +Implements slsDetector.

    @@ -476,14 +489,14 @@ Reimplemented from + [virtual]

    -int readCalibrationFile(string fname, float &gain, float &offset);

    Parameters:
    +reads a calibration file
    Parameters:
    @@ -492,7 +505,29 @@ int sharedSlsDetector

    -Reimplemented from slsDetector. +Implements slsDetector. + +

    + +

    +
    +
    fname file to be read
    gain reference to the gain variable reference to the offset variable
    + + + + + + + + +
    int mythenDetector::readConfigurationFile (string const   fname  )  [virtual]
    +
    +
    + +

    +Purely virtual function Should be implemented in the specific detector class /sa mythenDetector::readConfigurationFile +

    +Implements slsDetector.

    @@ -514,7 +549,7 @@ Reimplemented from + [virtual] @@ -530,7 +565,7 @@ reads a data file

    Parameters:
    Returns:
    OK or FAIL if it could not read the file or data=NULL

    -Reimplemented from slsDetector. +Implements slsDetector.

    @@ -576,7 +611,7 @@ Reimplemented from + [virtual] @@ -596,7 +631,7 @@ reads a data file

    Parameters:
    Returns:
    OK or FAIL if it could not read the file or data=NULL

    -Reimplemented from slsDetector. +Implements slsDetector.

    @@ -618,7 +653,7 @@ Reimplemented from + [virtual] @@ -635,7 +670,7 @@ reads a trim file

    Parameters:
    Returns:
    the pointer to myMod or NULL if reading the file failed

    -Reimplemented from slsDetector. +Implements slsDetector.

    @@ -669,7 +704,7 @@ Reimplemented from + [virtual] @@ -687,7 +722,30 @@ sets the arrays of the merged data to 0. NB The array should be created with siz

    Returns:
    OK or FAIL

    -Reimplemented from slsDetector. +Implements slsDetector. + +

    + +

    +
    + + + + + + + + + +
    int mythenDetector::retrieveDetectorSetup (string const   fname  )  [virtual]
    +
    +
    + +

    +not yet implemented

    +should retrieve from a file all the current detector parameters +

    +Implements slsDetector.

    @@ -700,7 +758,7 @@ Reimplemented from string  fname = ""  )  - + [virtual] @@ -715,7 +773,7 @@ set angular conversion

    Parameters:
    Returns:
    0 if angular conversion disabled, >0 otherwise

    -Reimplemented from slsDetector. +Implements slsDetector.

    @@ -728,7 +786,7 @@ Reimplemented from float  bs  )  - [inline] + [inline, virtual] @@ -737,7 +795,7 @@ Reimplemented from slsDetector. +Implements slsDetector.

    @@ -750,7 +808,7 @@ Reimplemented from float  f  )  - [inline] + [inline, virtual] @@ -759,7 +817,7 @@ Reimplemented from slsDetector. +Implements slsDetector.

    @@ -772,7 +830,7 @@ Reimplemented from float  f  )  - [inline] + [inline, virtual] @@ -781,7 +839,7 @@ Reimplemented from slsDetector. +Implements slsDetector.

    @@ -803,7 +861,7 @@ Reimplemented from [inline] + [inline, virtual] @@ -819,7 +877,7 @@ set positions for the acquisition

    Parameters:
    Returns:
    number of positions

    -Reimplemented from slsDetector. +Implements slsDetector.

    @@ -832,7 +890,7 @@ Reimplemented from string  fname = ""  )  - + [virtual] @@ -847,7 +905,7 @@ writes an angular conversion file

    Parameters:
    See also:
    angleConversionConstant

    -Reimplemented from slsDetector. +Implements slsDetector.

    @@ -875,7 +933,7 @@ Reimplemented from + [virtual] @@ -892,7 +950,30 @@ writes a clibration file

    Parameters:
    See also:
    sharedSlsDetector

    -Reimplemented from slsDetector. +Implements slsDetector. + +

    + +

    +
    + + + + + + + + + +
    int mythenDetector::writeConfigurationFile (string const   fname  )  [virtual]
    +
    +
    + +

    +Every detector should have a basic configuration file containing: type (mythen, pilatus etc.) hostname portnumber communication type (default TCP/IP) eventually secondary portnumber (e.g. mythen stop function) number of modules installed if different from the detector size (x,y)

    +to be changed +

    +Implements slsDetector.

    @@ -914,7 +995,7 @@ Reimplemented from + [virtual] @@ -930,7 +1011,7 @@ writes a data file

    Parameters:
    Returns:
    OK or FAIL if it could not write the file or data=NULL

    -Reimplemented from slsDetector. +Implements slsDetector.

    @@ -976,7 +1057,7 @@ Reimplemented from + [virtual] @@ -996,7 +1077,7 @@ writes a data file

    Parameters:
    Returns:
    OK or FAIL if it could not write the file or data=NULL

    -Reimplemented from slsDetector. +Implements slsDetector.

    @@ -1018,7 +1099,7 @@ Reimplemented from + [virtual] @@ -1035,7 +1116,7 @@ writes a trim file for module number imod - the values will be read from the cur

    See also:
    sls_detector_module sharedSlsDetector

    -Reimplemented from slsDetector. +Implements slsDetector.

    @@ -1057,7 +1138,7 @@ Reimplemented from + [virtual] @@ -1074,12 +1155,12 @@ writes a trim file

    Parameters:
    See also:
    sls_detector_module

    -Reimplemented from slsDetector. +Implements slsDetector.


    The documentation for this class was generated from the following file: -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/classslsDetector-members.html b/slsDetectorSoftware/docs/html/classslsDetector-members.html index b8a41a503..35f0c930b 100644 --- a/slsDetectorSoftware/docs/html/classslsDetector-members.html +++ b/slsDetectorSoftware/docs/html/classslsDetector-members.html @@ -20,118 +20,117 @@
  • Class Members
  • slsDetector Member List

    This is the complete list of members for slsDetector, including all inherited members.

    - - - + + + - - - - + + + + - - - - - - - - + + + + + + + + - - + + - + - - - + + + - + - + + + - + - - - + + - + - + - + - - + + - - + - + - - - - - - - + + + + + + + - + - + - - - - - + + + + + - - - - - - - - - - + + + + + + + + + + - + - @@ -141,44 +140,44 @@ - + - + - + - + - + - + - - - - - - - + + + + + + + - - + + -
    acquire()slsDetector
    adcsslsDetector [private]
    addToMerging(float *p1, float *v1, float *e1, float *mp, float *mv, float *me, int *mm)slsDetector
    acquire()=0slsDetector [pure virtual]
    adcsslsDetector [protected]
    addToMerging(float *p1, float *v1, float *e1, float *mp, float *mv, float *me, int *mm)=0slsDetector [pure virtual]
    analogTest(analogTestMode mode)slsDetector
    badChannelMaskslsDetector [private]
    chanregsslsDetector [private]
    chipregsslsDetector [private]
    controlSocketslsDetector [private]
    badChannelMaskslsDetector [protected]
    chanregsslsDetector [protected]
    chipregsslsDetector [protected]
    controlSocketslsDetector [protected]
    createFileName()slsDetector
    createModule()slsDetector
    currentI0slsDetector [private]
    currentPositionslsDetector [private]
    currentPositionIndexslsDetector [private]
    dacsslsDetector [private]
    dataProcessingThreadslsDetector [private]
    dataQueueslsDetector [private]
    dataSocketslsDetector [private]
    createModule()slsDetector
    currentI0slsDetector [protected]
    currentPositionslsDetector [protected]
    currentPositionIndexslsDetector [protected]
    dacsslsDetector [protected]
    dataProcessingThreadslsDetector [protected]
    dataQueueslsDetector [protected]
    dataSocketslsDetector [protected]
    decodeData(int *datain)slsDetector
    deleteModule(sls_detector_module *myMod)slsDetector
    detectorModulesslsDetector [private]
    detIdslsDetector [private]
    detectorModulesslsDetector [protected]
    detIdslsDetector [protected]
    digitalTest(digitalTestMode mode, int imod=0)slsDetector
    dumpDetectorSetup(string const fname)slsDetector
    dumpDetectorSetup(string const fname)=0slsDetector [pure virtual]
    enableAnalogOutput(int ichan)slsDetector
    enableAnalogOutput(int imod, int ichip, int ichan)slsDetector
    execCommand(string cmd, string answer)slsDetector
    executeTrimming(trimMode mode, int par1, int par2, int imod=-1)slsDetector
    exists()slsDetector [inline]
    exitServer()slsDetector
    ffcoefficientsslsDetector [private]
    fferrorsslsDetector [private]
    fillBadChannelMask()slsDetector [private]
    ffcoefficientsslsDetector [protected]
    fferrorsslsDetector [protected]
    fillBadChannelMask()slsDetector [protected]
    finalizeMerging(float *mp, float *mv, float *me, int *mm)slsDetector
    flatFieldCorrect(float datain, float errin, float &dataout, float &errout, float ffcoefficient, float fferr)slsDetector
    flatFieldCorrect(float *datain, float *errin, float *dataout, float *errout)slsDetector
    freeSharedMemory()slsDetector [private]
    freeSharedMemory()slsDetector [protected]
    GET_ONLINE_FLAG enum valueslsDetector
    getADC(dacIndex index, int imod=0)slsDetector
    getAngularConversion(int &direction, angleConversionConstant *angconv=NULL)slsDetector
    getAngularConversion(int &direction, angleConversionConstant *angconv=NULL)=0slsDetector [pure virtual]
    getAngularConversion()=0slsDetector [pure virtual]
    getBadChannelCorrectionFile()slsDetector [inline]
    getBadChannelCorrections(int *bad=NULL)slsDetector
    getBinSize()slsDetector [inline]
    getBinSize()=0slsDetector [pure virtual]
    getCalDir()slsDetector [inline]
    getChannel(int ichan, int ichip, int imod)slsDetector
    getChip(int ichip, int imod)slsDetector
    getClockDivider()slsDetector [inline]
    getChannel(int ichan, int ichip, int imod)slsDetector
    getChip(int ichip, int imod)slsDetector
    getControlPort()slsDetector [inline]
    getDataFromDetector()slsDetector [private]
    getDataFromDetector()slsDetector [protected]
    getDataFromDetectorNoWait()slsDetector
    getDataPort()slsDetector [inline]
    getDetectorType(char *type)slsDetector
    getFileIndex()slsDetector [inline]
    getFileName()slsDetector [inline]
    getFilePath()slsDetector [inline]
    getFineOffset()slsDetector [inline]
    getFineOffset()=0slsDetector [pure virtual]
    getFlatFieldCorrections(float *corr=NULL, float *ecorr=NULL)slsDetector
    getGlobalOffset()slsDetector [inline]
    getGlobalOffset()=0slsDetector [pure virtual]
    getHostname()slsDetector [inline]
    getId(idMode mode, int imod=0)slsDetector
    getMaxNumberOfModules(dimension d=X)slsDetector
    getModule(int imod)slsDetector
    getPositions(float *pos=NULL)slsDetector [inline]
    getModule(int imod)slsDetector
    getPositions(float *pos=NULL)=0slsDetector [pure virtual]
    getRateCorrections(float &t)slsDetector
    getRateCorrections()slsDetector
    getRunStatus()slsDetector
    getSetLength()slsDetector [inline]
    getSettings(int imod=-1)slsDetector
    getSettings(int imod=-1)slsDetector
    getStopPort()slsDetector [inline]
    getThresholdEnergy(int imod=-1)slsDetector
    getTimeLeft(timerIndex index)slsDetector
    getTrimDir()slsDetector [inline]
    getTrimEn(int *en)slsDetector [inline]
    getTrimEn(int *en=NULL)slsDetector [inline]
    giveCalibrationPulse(float vcal, int npulses)slsDetector
    initializeDetectorSize(detectorType type)slsDetector [private]
    initializeDetectorStructure()slsDetector [private]
    initSharedMemory(detectorType type=GENERIC, int id=0)slsDetector [private]
    mergingBinsslsDetector [private]
    mergingCountsslsDetector [private]
    mergingErrorsslsDetector [private]
    mergingMultiplicityslsDetector [private]
    initializeDetectorSize(detectorType type)slsDetector [protected]
    initializeDetectorStructure()slsDetector [protected]
    initSharedMemory(detectorType type=GENERIC, int id=0)slsDetector [protected]
    mergingBinsslsDetector [protected]
    mergingCountsslsDetector [protected]
    mergingErrorsslsDetector [protected]
    mergingMultiplicityslsDetector [protected]
    OFFLINE_FLAG enum valueslsDetector
    ONLINE_FLAG enum valueslsDetector
    onlineFlagslsDetector [private]
    onlineFlagslsDetector [protected]
    popDataQueue()slsDetector
    processData()slsDetector
    processData()=0slsDetector [pure virtual]
    rateCorrect(float datain, float errin, float &dataout, float &errout, float tau, float t)slsDetector
    rateCorrect(float *datain, float *errin, float *dataout, float *errout)slsDetector
    readAll()slsDetector
    readAngularConversion(string fname="")slsDetector
    readCalibrationFile(string fname, float &gain, float &offset)slsDetector
    readConfigurationFile(string const fname)slsDetector
    readDataFile(string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int nch=0)slsDetector
    readDataFile(string fname, int *data)slsDetector
    readAngularConversion(string fname="")=0slsDetector [pure virtual]
    readCalibrationFile(string fname, float &gain, float &offset)=0slsDetector [pure virtual]
    readConfigurationFile(string const fname)=0slsDetector [pure virtual]
    readDataFile(string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int nch=0)=0slsDetector [pure virtual]
    readDataFile(string fname, int *data)=0slsDetector [pure virtual]
    readFrame()slsDetector
    readRegister(int addr)slsDetector
    readTrimFile(string fname, sls_detector_module *myMod=NULL)slsDetector
    receiveChannel(sls_detector_channel *)slsDetector [private]
    receiveChip(sls_detector_chip *)slsDetector [private]
    receiveModule(sls_detector_module *)slsDetector [private]
    resetMerging(float *mp, float *mv, float *me, int *mm)slsDetector
    retrieveDetectorSetup(string const fname)slsDetector
    sendChannel(sls_detector_channel *)slsDetector [private]
    sendChip(sls_detector_chip *)slsDetector [private]
    sendModule(sls_detector_module *)slsDetector [private]
    setAngularConversion(string fname="")slsDetector
    readTrimFile(string fname, sls_detector_module *myMod=NULL)=0slsDetector [pure virtual]
    receiveChannel(sls_detector_channel *)slsDetector [protected]
    receiveChip(sls_detector_chip *)slsDetector [protected]
    receiveModule(sls_detector_module *)slsDetector [protected]
    resetMerging(float *mp, float *mv, float *me, int *mm)=0slsDetector [pure virtual]
    retrieveDetectorSetup(string const fname)=0slsDetector [pure virtual]
    sendChannel(sls_detector_channel *)slsDetector [protected]
    sendChip(sls_detector_chip *)slsDetector [protected]
    sendModule(sls_detector_module *)slsDetector [protected]
    setAngularConversion(string fname="")=0slsDetector [pure virtual]
    setBadChannelCorrection(string fname="")slsDetector
    setBinSize(float bs)slsDetector [inline]
    setBinSize(float bs)=0slsDetector [pure virtual]
    setCalDir(string s)slsDetector [inline]
    setChannel(int64_t reg, int ichan=-1, int ichip=-1, int imod=-1)slsDetector
    setChannel(sls_detector_channel chan)slsDetector
    setChip(int reg, int ichip=-1, int imod=-1)slsDetector
    setChip(sls_detector_chip chip)slsDetector
    setClockDivider(int i)slsDetector [inline]
    setDAC(float val, dacIndex index, int imod=-1)slsDetector
    setDetectorType(detectorType type=GET_DETECTOR_TYPE)slsDetector
    setDetectorType(string type)slsDetector
    setFileIndex(int i)slsDetector [inline]
    setFileName(string s)slsDetector [inline]
    setFilePath(string s)slsDetector [inline]
    setFineOffset(float f)slsDetector [inline]
    setFineOffset(float f)=0slsDetector [pure virtual]
    setFlatFieldCorrection(string fname="")slsDetector
    setGlobalOffset(float f)slsDetector [inline]
    setGlobalOffset(float f)=0slsDetector [pure virtual]
    setModule(int reg, int imod=-1)slsDetector
    setModule(sls_detector_module module)slsDetector
    setNumberOfModules(int n, dimension d=X)slsDetector
    setOnline(int const online)slsDetector
    setPositions(int nPos, float *pos)slsDetector [inline]
    setPositions(int nPos, float *pos)=0slsDetector [pure virtual]
    setRateCorrection(float t=0)slsDetector
    setReadOutFlags(readOutFlags flag)slsDetector
    setROI(int nroi=-1, int *xmin=NULL, int *xmax=NULL, int *ymin=NULL, int *ymax=NULL)slsDetector
    setSetLength(int i)slsDetector [inline]
    setSettings(detectorSettings isettings, int imod=-1)slsDetector
    setSpeed(speedVariable sp, int value=-1)slsDetector
    setTCPSocket(string const name="", int const control_port=-1, int const stop_port=-1, int const data_port=-1)slsDetector
    setThresholdEnergy(int e_eV, int imod=-1, detectorSettings isettings=GET_SETTINGS)slsDetector
    setTimer(timerIndex index, int64_t t=-1)slsDetector
    setTrimDir(string s)slsDetector [inline]
    sharedSlsDetector typedefslsDetector
    shmIdslsDetector [private]
    shmIdslsDetector [protected]
    slsDetector(detectorType type=GENERIC, int id=0)slsDetector
    startAcquisition()slsDetector
    startAndReadAll()slsDetector
    startAndReadAllNoWait()slsDetector
    startReadOut()slsDetector
    startThread()slsDetector [private]
    startThread()slsDetector [protected]
    stopAcquisition()slsDetector
    stopSocketslsDetector [private]
    thisDetectorslsDetector [private]
    writeAngularConversion(string fname="")slsDetector
    writeCalibrationFile(string fname, float gain, float offset)slsDetector
    writeConfigurationFile(string const fname)slsDetector
    writeDataFile(string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int nch=-1)slsDetector
    writeDataFile(string fname, int *data)slsDetector
    stopSocketslsDetector [protected]
    thisDetectorslsDetector [protected]
    writeAngularConversion(string fname="")=0slsDetector [pure virtual]
    writeCalibrationFile(string fname, float gain, float offset)=0slsDetector [pure virtual]
    writeConfigurationFile(string const fname)=0slsDetector [pure virtual]
    writeDataFile(string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int nch=-1)=0slsDetector [pure virtual]
    writeDataFile(string fname, int *data)=0slsDetector [pure virtual]
    writeRegister(int addr, int val)slsDetector
    writeTrimFile(string fname, sls_detector_module mod)slsDetector
    writeTrimFile(string fname, int imod)slsDetector
    writeTrimFile(string fname, sls_detector_module mod)=0slsDetector [pure virtual]
    writeTrimFile(string fname, int imod)=0slsDetector [pure virtual]
    ~slsDetector()slsDetector [inline]


    Generated on Fri Oct 9 16:01:05 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/classslsDetector.html b/slsDetectorSoftware/docs/html/classslsDetector.html index 3779fdbb8..6a0bb8d4e 100644 --- a/slsDetectorSoftware/docs/html/classslsDetector.html +++ b/slsDetectorSoftware/docs/html/classslsDetector.html @@ -56,13 +56,13 @@ int exists () -int readConfigurationFile (string const fname) +virtual int readConfigurationFile (string const fname)=0 -int writeConfigurationFile (string const fname) +virtual int writeConfigurationFile (string const fname)=0 -int dumpDetectorSetup (string const fname) +virtual int dumpDetectorSetup (string const fname)=0 -int retrieveDetectorSetup (string const fname) +virtual int retrieveDetectorSetup (string const fname)=0 int setTCPSocket (string const name="", int const control_port=-1, int const stop_port=-1, int const data_port=-1) @@ -78,13 +78,13 @@ char * setTrimDir (string s) -int getTrimEn (int *en) +int getTrimEn (int *en=NULL) -sls_detector_modulereadTrimFile (string fname, sls_detector_module *myMod=NULL) +virtual sls_detector_modulereadTrimFile (string fname, sls_detector_module *myMod=NULL)=0 -int writeTrimFile (string fname, sls_detector_module mod) +virtual int writeTrimFile (string fname, sls_detector_module mod)=0 -int writeTrimFile (string fname, int imod) +virtual int writeTrimFile (string fname, int imod)=0 char * setFilePath (string s) @@ -100,25 +100,25 @@ string createFileName () -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)=0 -int writeDataFile (string fname, int *data) +virtual int writeDataFile (string fname, int *data)=0 -int readDataFile (string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int nch=0) +virtual int readDataFile (string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int nch=0)=0 -int readDataFile (string fname, int *data) +virtual int readDataFile (string fname, int *data)=0 char * getCalDir () char * setCalDir (string s) -int readCalibrationFile (string fname, float &gain, float &offset) +virtual int readCalibrationFile (string fname, float &gain, float &offset)=0 -int writeCalibrationFile (string fname, float gain, float offset) +virtual int writeCalibrationFile (string fname, float gain, float offset)=0 -int readAngularConversion (string fname="") +virtual int readAngularConversion (string fname="")=0 -int writeAngularConversion (string fname="") +virtual int writeAngularConversion (string fname="")=0 int execCommand (string cmd, string answer) @@ -160,25 +160,25 @@ int setChannel (sls_detector_channel chan) -sls_detector_channel getChannel (int ichan, int ichip, int imod) +sls_detector_channel getChannel (int ichan, int ichip, int imod) int setChip (int reg, int ichip=-1, int imod=-1) int setChip (sls_detector_chip chip) -sls_detector_chip getChip (int ichip, int imod) +sls_detector_chip getChip (int ichip, int imod) int setModule (int reg, int imod=-1) int setModule (sls_detector_module module) -sls_detector_modulegetModule (int imod) +sls_detector_modulegetModule (int imod) int getThresholdEnergy (int imod=-1) int setThresholdEnergy (int e_eV, int imod=-1, detectorSettings isettings=GET_SETTINGS) -detectorSettings getSettings (int imod=-1) +detectorSettings getSettings (int imod=-1) detectorSettings setSettings (detectorSettings isettings, int imod=-1) @@ -206,13 +206,7 @@ int64_t getTimeLeft (timerIndex index) -int setClockDivider (int i) - -int getClockDivider () - -int setSetLength (int i) - -int getSetLength () +int setSpeed (speedVariable sp, int value=-1) int setDynamicRange (int n=-1) @@ -236,25 +230,29 @@ int getBadChannelCorrections (int *bad=NULL) -int setAngularConversion (string fname="") +char * getBadChannelCorrectionFile () -int getAngularConversion (int &direction, angleConversionConstant *angconv=NULL) +virtual int setAngularConversion (string fname="")=0 -float setGlobalOffset (float f) +virtual int getAngularConversion (int &direction, angleConversionConstant *angconv=NULL)=0 -float setFineOffset (float f) +virtual char * getAngularConversion ()=0 -float getFineOffset () +virtual float setGlobalOffset (float f)=0 -float getGlobalOffset () +virtual float setFineOffset (float f)=0 -int setPositions (int nPos, float *pos) +virtual float getFineOffset ()=0 -int getPositions (float *pos=NULL) +virtual float getGlobalOffset ()=0 -float setBinSize (float bs) +virtual int setPositions (int nPos, float *pos)=0 -float getBinSize () +virtual int getPositions (float *pos=NULL)=0 + +virtual float setBinSize (float bs)=0 + +virtual float getBinSize ()=0 float * decodeData (int *datain) @@ -266,23 +264,23 @@ int rateCorrect (float *datain, float *errin, float *dataout, float *errout) -int resetMerging (float *mp, float *mv, float *me, int *mm) +virtual int resetMerging (float *mp, float *mv, float *me, int *mm)=0 -int addToMerging (float *p1, float *v1, float *e1, float *mp, float *mv, float *me, int *mm) +virtual int addToMerging (float *p1, float *v1, float *e1, float *mp, float *mv, float *me, int *mm)=0 int finalizeMerging (float *mp, float *mv, float *me, int *mm) int exitServer () -void * processData () +virtual void * processData ()=0 -sls_detector_modulecreateModule () +sls_detector_modulecreateModule () void deleteModule (sls_detector_module *myMod) -void acquire () +virtual void acquire ()=0 -

    Private Member Functions

    +

    Protected Member Functions

    int * getDataFromDetector () int initSharedMemory (detectorType type=GENERIC, int id=0) @@ -309,7 +307,7 @@ int fillBadChannelMask () -

    Private Attributes

    +

    Protected Attributes

    sharedSlsDetectorthisDetector int onlineFlag @@ -368,7 +366,7 @@ This is the base class for all SLS detector functionalities.

    The slsDetector class is expected to become the interface class for all SLS Detectors acquisition (and analysis) software.

    Author:
    Anna Bergamaschi
    -
    Version:
    0.1alpha (any string)
    +
    Version:
    0.1alpha


    Member Typedef Documentation

    @@ -478,31 +476,38 @@ destructor


    Member Function Documentation

    - +
    - + - +
    void slsDetector::acquire virtual void slsDetector::acquire (  )  [pure virtual]

    +pure virtual function performs the complete acquisition and data processing moves the detector to next position
    + starts and reads the detector
    + reads the IC (if required)
    + reads the encoder (iof required for angualr conversion)
    + processes the data (flat field, rate, angular conversion and merging processData())

    See also:
    mythenDetector::acquire()
    +

    +Implemented in mythenDetector.

    - +

    - + @@ -546,14 +551,14 @@ destructor - +
    int slsDetector::addToMerging virtual int slsDetector::addToMerging ( float *  p1,
    ) [pure virtual]

    -not yet implemented merge dataset

    Parameters:
    +pure virtual function merge dataset
    Parameters:
    @@ -564,9 +569,10 @@ not yet implemented merge dataset
    Parameters:
    p1 angular positions of dataset
    v1 data
    mm multiplicity of merged arrays
    +
    See also:
    mythenDetector::addToMerging

    -Reimplemented in mythenDetector. +Implemented in mythenDetector.

    @@ -617,12 +623,12 @@ in case also appends the position index

    Filenames will be of the form: filepath/filename(_px)_i where x is the position index and i is the run index

    - +

    - + @@ -662,7 +668,7 @@ decode data from the detector converting them to an array of floats, one for eac
    Returns:
    pointer to a float array with a data per channel

    -Reimplemented in mythenDetector, and eigerDetector. +Reimplemented in eigerDetector.

    @@ -726,25 +732,26 @@ Digital test of the modules

    Parameters:

    - +

    slsDetector::sls_detector_module * slsDetector::createModule sls_detector_module * slsDetector::createModule (  ) 
    - + - +
    int slsDetector::dumpDetectorSetup virtual int slsDetector::dumpDetectorSetup ( string const   fname  )  [pure virtual]

    -not yet implemented

    -should dump to a file all the current detector parameters +Purely virtual function Should be implemented in the specific detector class /sa mythenDetector::dumpDetectorSetup +

    +Implemented in mythenDetector.

    @@ -926,7 +933,7 @@ sets the onlineFlag

    Returns:
    1 if the detector st

    -turns of server +turns off server

    @@ -938,7 +945,7 @@ turns of server (  )  - [private] + [protected] @@ -986,7 +993,7 @@ fill bad channel mask (0 if channel is good, 1 if bad)

    -calculates the "final" positions, data value and errors for the emrged data

    Parameters:
    +pure virtual function calculates the "final" positions, data value and errors for the emrged data
    Parameters:
    @@ -994,7 +1001,8 @@ calculates the "final" positions, data value and errors for the emrged data
    mp already merged postions
    mv already merged data
    mm multiplicity of merged arrays
    -
    Returns:
    FAIL or the
    +
    Returns:
    FAIL or the number of non empty bins (i.e. points belonging to the pattern)
    +
    See also:
    mythenDetector::finalizeMerging

    Reimplemented in mythenDetector. @@ -1123,7 +1131,7 @@ flat field correct data

    Parameters:
    (  )  - [private] + [protected]
    @@ -1169,12 +1177,34 @@ set dacs value
    Parameters:

    - +

    - + + + + + + +
    int slsDetector::getAngularConversion virtual char* slsDetector::getAngularConversion (  )  [pure virtual]
    +
    +
    + +

    +pure virtual function returns the angular conversion file

    See also:
    mythenDetector::getAngularConversion
    + +

    +Implemented in mythenDetector. +

    +

    + +

    +
    + + + @@ -1188,23 +1218,43 @@ set dacs value
    Parameters:
    - +
    virtual int slsDetector::getAngularConversion ( int &  direction,
    ) [pure virtual]

    -get angular conversion

    Parameters:
    +pure virtual function get angular conversion
    Parameters:
    reference to diffractometer direction
    angconv array that will be filled with the angular conversion constants
    Returns:
    0 if angular conversion disabled, >0 otherwise
    +
    See also:
    mythenDetector::getAngularConversion

    -Reimplemented in mythenDetector. +Implemented in mythenDetector. +

    +

    + +

    +
    + + + + + + + + +
    char* slsDetector::getBadChannelCorrectionFile (  )  [inline]
    +
    +
    + +

    +returns the bad channel list file

    @@ -1233,25 +1283,26 @@ get bad channels correction

    Parameters:

    - +

    - + - +
    float slsDetector::getBinSize virtual float slsDetector::getBinSize (  )  [inline] [pure virtual]

    -return detector bin size used for merging (approx angular resolution) +pure virtual function return detector bin size used for merging (approx angular resolution)

    See also:
    mythenDetector::getBinSize
    +

    -Reimplemented in mythenDetector. +Implemented in mythenDetector.

    @@ -1274,12 +1325,12 @@ returns the location of the calibration files

    See also:

    - +

    - + @@ -1317,12 +1368,12 @@ get channel
    Parameters:

    - +

    slsDetector::sls_detector_channel slsDetector::getChannel sls_detector_channel slsDetector::getChannel ( int  ichan,
    - + @@ -1352,26 +1403,6 @@ get chip
    Parameters:
    Returns:
    current chip structure for channel
    Bug:
    probably does not return corretly!
    - -

    - -

    -
    -
    slsDetector::sls_detector_chip slsDetector::getChip sls_detector_chip slsDetector::getChip ( int  ichip,
    - - - - - - - -
    int slsDetector::getClockDivider (  )  [inline]
    -
    -
    - -

    -get clock divider

    -not implemented (should be something more general like "set speed including also waitstates, set cycles etc.)

    @@ -1403,7 +1434,7 @@ returns the detector control port

    See also:
    (  )  - [private] + [protected] @@ -1540,25 +1571,26 @@ returns the default output files path
    See also:
    <

    - +

    - + - +
    float slsDetector::getFineOffset virtual float slsDetector::getFineOffset (  )  [inline] [pure virtual]

    -get detector fine offset +pure virtual function get detector fine offset

    See also:
    mythenDetector::getFineOffset
    +

    -Reimplemented in mythenDetector. +Implemented in mythenDetector.

    @@ -1597,25 +1629,26 @@ get flat field corrections

    Parameters:

    - +

    - + - +
    float slsDetector::getGlobalOffset virtual float slsDetector::getGlobalOffset (  )  [inline] [pure virtual]

    -get detector global offset +pure virtual function get detector global offset

    See also:
    mythenDetector::getGlobalOffset
    +

    -Reimplemented in mythenDetector. +Implemented in mythenDetector.

    @@ -1700,12 +1733,12 @@ get the maximum size of the detector

    Parameters:

    - +

    - + @@ -1726,32 +1759,33 @@ get module
    Parameters:

    - +

    slsDetector::sls_detector_module * slsDetector::getModule sls_detector_module * slsDetector::getModule ( int  imod
    - + - +
    int slsDetector::getPositions virtual int slsDetector::getPositions ( float *  pos = NULL  )  [inline] [pure virtual]

    -get positions for the acquisition

    Parameters:
    +pure virtual function get positions for the acquisition
    Parameters:
    pos array which will contain the encoder positions
    Returns:
    number of positions
    +
    See also:
    mythenDetector::getPositions

    -Reimplemented in mythenDetector. +Implemented in mythenDetector.

    @@ -1820,32 +1854,12 @@ get run status

    Returns:
    status mask

    - +

    - - - - - - -
    int slsDetector::getSetLength (  )  [inline]
    -
    -
    - -

    -get length cycles

    -not implemented (should be something more general like "set speed including also waitstates, set cycles etc.) -

    -

    - -

    -
    - - - + @@ -1958,7 +1972,7 @@ returns the detector trimbit directory
    See also:
    <

    - +

    slsDetector::detectorSettings slsDetector::getSettings detectorSettings slsDetector::getSettings ( int  imod = -1
    @@ -1966,7 +1980,7 @@ returns the detector trimbit directory
    See also:
    <
    - + @@ -2031,7 +2045,7 @@ not yet implemented - +
    int slsDetector::getTrimEn ( int *  en en = NULL  )  [inline]
    detectorType  type  )  [private] [protected]
    @@ -2058,6 +2072,7 @@ set fileIndex to default to 0

    set number of trim energies to 0

    set correction mask to 0

    set deat time

    +sets bad channel list file to none

    set number of bad chans to 0

    set number of bad flat field chans to 0

    set angular direction to 1

    @@ -2069,6 +2084,7 @@ set current settings to uninitialized

    set threshold to -1

    set clockdivider to 1

    set number of positions to 0

    +sets angular conversion file to none

    set binsize

    calculates the memory offsets for flat field coefficients and errors, module structures, dacs, adcs, chips and channels

    also in case thisDetector alread existed initialize the pointer for flat field coefficients and errors, module structures, dacs, adcs, chips and channels

    @@ -2087,7 +2103,7 @@ fill the BadChannelMask

    See also:
    (  )  - [private] + [protected]
    @@ -2125,7 +2141,7 @@ initialize gain and offset to -1 ) - [private] + [protected] @@ -2168,32 +2184,26 @@ pops the data from the data queue
    Returns:
    pointe

    - +

    - + - +
    void * slsDetector::processData virtual void* slsDetector::processData (  )  [pure virtual]

    -function for processing data +pure virtual function function for processing data

    See also:
    mythenDetector::processData
    +

    -Pop data queue

    -decode data

    -write raw data file

    -rate correction

    -flat field correction

    -angular conversion

    -data merging

    -file writing +Implemented in mythenDetector.

    @@ -2331,40 +2341,40 @@ asks and receives all data from the detector and puts them in a data queue

    - +

    - + - +
    int slsDetector::readAngularConversion virtual int slsDetector::readAngularConversion ( string  fname = ""  )  [pure virtual]

    -reads an angular conversion file

    Parameters:
    +Pure virtual function reads an angular conversion file
    Parameters:
    fname file to be read
    -
    See also:
    angleConversionConstant
    +
    See also:
    angleConversionConstant mythenDetector::readAngularConversion

    -Reimplemented in mythenDetector. +Implemented in mythenDetector.

    - +

    - + @@ -2384,52 +2394,53 @@ Reimplemented in +
    int slsDetector::readCalibrationFile virtual int slsDetector::readCalibrationFile ( string  fname, [pure virtual]

    - +

    - + - +
    int slsDetector::readConfigurationFile virtual int slsDetector::readConfigurationFile ( string const   fname  )  [pure virtual]

    -Every detector should have a basic configuration file containing: type (mythen, pilatus etc.) hostname portnumber communication type (default TCP/IP) eventually secondary portnumber (e.g. mythen stop function) number of modules installed if different from the detector size (x,y)

    -to be changed +Purely virtual function Should be implemented in the specific detector class /sa mythenDetector::readConfigurationFile +

    +Implemented in mythenDetector.

    - +

    - + @@ -2443,31 +2454,32 @@ to be changed - +
    int slsDetector::readDataFile virtual int slsDetector::readDataFile ( string  fname,
    ) [pure virtual]

    -reads a data file

    Parameters:
    +Pure virtual function reads a data file
    Parameters:
    name of the file to be read
    data array of data values
    Returns:
    OK or FAIL if it could not read the file or data=NULL
    +
    See also:
    mythenDetector::readDataFile

    -Reimplemented in mythenDetector, and eigerDetector. +Implemented in mythenDetector, and eigerDetector.

    - +

    @@ -2575,12 +2588,12 @@ read register

    Parameters:

    - +

    - + @@ -2594,14 +2607,14 @@ read register
    Parameters:
    - +
    sls_detector_module* slsDetector::readTrimFile virtual sls_detector_module* slsDetector::readTrimFile ( string  fname,
    ) [pure virtual]

    -reads a trim file

    Parameters:
    +Pure virtual function reads a trim file
    Parameters:
    fname name of the file to be read
    myMod pointer to the module structure which has to be set.
    @@ -2609,9 +2622,10 @@ reads a trim file
    Parameters:
    Returns:
    the pointer to myMod or NULL if reading the file failed
    +
    See also:
    mythenDetector::readTrimFile

    -Reimplemented in mythenDetector, and eigerDetector. +Implemented in mythenDetector, and eigerDetector.

    @@ -2624,7 +2638,7 @@ Reimplemented in sls_detector_channel *   )  - [private] + [protected] @@ -2644,7 +2658,7 @@ receive a sls_detector_ch sls_detector_chip *   )  - [private] + [protected] @@ -2664,7 +2678,7 @@ receive a sls_detector_chip< sls_detector_module *   )  - [private] + [protected] @@ -2674,12 +2688,12 @@ receive a sls_detector_chip< receive a sls_detector_module structure over socket

    - +

    - +

    - + - +
    int slsDetector::retrieveDetectorSetup virtual int slsDetector::retrieveDetectorSetup ( string const   fname  )  [pure virtual]

    -not yet implemented

    -should retrieve from a file all the current detector parameters +Purely virtual function Should be implemented in the specific detector class /sa mythenDetector::retrieveDetectorSetup +

    +Implemented in mythenDetector.

    @@ -2757,7 +2773,7 @@ should retrieve from a file all the current detector parameters sls_detector_channel *   )  - [private] + [protected] @@ -2777,7 +2793,7 @@ send a sls_detector_chann sls_detector_chip *   )  - [private] + [protected] @@ -2797,7 +2813,7 @@ send a sls_detector_chip sls_detector_module *   )  - [private] + [protected] @@ -2807,32 +2823,33 @@ send a sls_detector_chip send a sls_detector_module structure over socket

    - +

    - + - +
    int slsDetector::setAngularConversion virtual int slsDetector::setAngularConversion ( string  fname = ""  )  [pure virtual]

    -set angular conversion

    Parameters:
    +pure virtual function set angular conversion
    Parameters:
    fname file with angular conversion constants ("" disable)
    Returns:
    0 if angular conversion disabled, >0 otherwise
    +
    See also:
    mythenDetector::setAngularConversion

    -Reimplemented in mythenDetector. +Implemented in mythenDetector.

    @@ -2861,26 +2878,33 @@ set bad channels correction

    Parameters:

    - +

    - + - +
    float slsDetector::setBinSize virtual float slsDetector::setBinSize ( float  bs  )  [inline] [pure virtual]

    -set detector bin size used for merging (approx angular resolution) +pure virtual function set detector bin size used for merging (approx angular resolution)

    Parameters:
    + + +
    bs bin size in degrees
    +
    +
    Returns:
    current bin size
    +
    See also:
    mythenDetector::setBinSize
    +

    -Reimplemented in mythenDetector. +Implemented in mythenDetector.

    @@ -3050,27 +3074,6 @@ configure chip

    Parameters:
    Returns:
    current register value
    See also:
    sls_detector_chip
    - -

    - -

    -
    - - - - - - - - - -
    int slsDetector::setClockDivider (int  i  )  [inline]
    -
    -
    - -

    -set clock divider

    -not implemented (should be something more general like "set speed including also waitstates, set cycles etc.)

    @@ -3328,26 +3331,27 @@ sets the default output files path

    See also:

    - +

    - + - +
    float slsDetector::setFineOffset virtual float slsDetector::setFineOffset ( float  f  )  [inline] [pure virtual]

    -set detector fine offset +pure virtual function set detector fine offset

    See also:
    mythenDetector::setFineOffset
    +

    -Reimplemented in mythenDetector. +Implemented in mythenDetector.

    @@ -3376,26 +3380,27 @@ set flat field corrections

    Parameters:

    - +

    - + - +
    float slsDetector::setGlobalOffset virtual float slsDetector::setGlobalOffset ( float  f  )  [inline] [pure virtual]

    -set detector global offset +pure virtual function set detector global offset

    See also:
    mythenDetector::setGlobalOffset
    +

    -Reimplemented in mythenDetector. +Implemented in mythenDetector.

    @@ -3525,12 +3530,12 @@ sets the onlineFlag

    Parameters:

    - +

    - + @@ -3544,23 +3549,24 @@ sets the onlineFlag
    Parameters:
    - +
    int slsDetector::setPositions virtual int slsDetector::setPositions ( int  nPos,
    ) [inline] [pure virtual]

    -set positions for the acquisition

    Parameters:
    +pure virtual function set positions for the acquisition
    Parameters:
    nPos number of positions
    pos array with the encoder positions
    Returns:
    number of positions
    +
    See also:
    mythenDetector::setPositions

    -Reimplemented in mythenDetector. +Implemented in mythenDetector.

    @@ -3663,27 +3669,6 @@ set roi

    not yet implemented

    - -

    -
    - - - - - - - - - -
    int slsDetector::setSetLength (int  i  )  [inline]
    -
    -
    - -

    -set length cycles

    -not implemented (should be something more general like "set speed including also waitstates, set cycles etc.) -

    -

    @@ -3718,6 +3703,43 @@ set detector settings
    Parameters:
    Returns:
    current settings
    in this function trimbits and calibration files are searched in the trimDir and calDir directories and the detector is initialized +
    +

    + +

    +
    + + + + + + + + + + + + + + + + + + +
    int slsDetector::setSpeed (speedVariable  sp,
    int  value = -1 
    )
    +
    +
    + +

    +sets/gets the value of important readout speed parameters

    Parameters:
    + + + +
    sp is the parameter to be set/get
    value is the value to be set, if -1 get value
    +
    +
    Returns:
    current value for the specified parameter
    +
    See also:
    speedVariable
    +

    @@ -3961,7 +3983,7 @@ start readout (without exposure or interrupting exposure)

    Ret (  )  - [private] + [protected] @@ -3991,40 +4013,40 @@ stop detector acquisition
    Returns:
    OK/FAIL
    <

    - +

    - + - +
    int slsDetector::writeAngularConversion virtual int slsDetector::writeAngularConversion ( string  fname = ""  )  [pure virtual]

    -writes an angular conversion file

    Parameters:
    +Pure virtual function writes an angular conversion file
    Parameters:
    fname file to be written
    -
    See also:
    angleConversionConstant
    +
    See also:
    angleConversionConstant mythenDetector::writeAngularConversion

    -Reimplemented in mythenDetector. +Implemented in mythenDetector.

    - +

    - + @@ -4044,53 +4066,54 @@ Reimplemented in +
    int slsDetector::writeCalibrationFile virtual int slsDetector::writeCalibrationFile ( string  fname, [pure virtual]

    - +

    - + - +
    int slsDetector::writeConfigurationFile virtual int slsDetector::writeConfigurationFile ( string const   fname  )  [pure virtual]

    -Every detector should have a basic configuration file containing: type (mythen, pilatus etc.) hostname portnumber communication type (default TCP/IP) eventually secondary portnumber (e.g. mythen stop function) number of modules installed if different from the detector size (x,y)

    -to be changed +Purely virtual function Should be implemented in the specific detector class /sa mythenDetector::writeConfigurationFile +

    +Implemented in mythenDetector.

    - +

    - + @@ -4104,31 +4127,32 @@ to be changed - +
    int slsDetector::writeDataFile virtual int slsDetector::writeDataFile ( string  fname,
    ) [pure virtual]

    -writes a data file

    Parameters:
    +Pure virtual function writes a data file
    Parameters:
    name of the file to be written
    data array of data values
    Returns:
    OK or FAIL if it could not write the file or data=NULL
    +
    See also:
    mythenDetector::writeDataFile

    -Reimplemented in mythenDetector, and eigerDetector. +Implemented in mythenDetector, and eigerDetector.

    - +

    @@ -4224,12 +4249,12 @@ write register

    Parameters:

    - +

    - + @@ -4243,32 +4268,32 @@ write register
    Parameters:
    - +
    int slsDetector::writeTrimFile virtual int slsDetector::writeTrimFile ( string  fname,
    ) [pure virtual]

    -writes a trim file for module number imod - the values will be read from the current detector structure

    Parameters:
    +Pure virtual function writes a trim file for module number imod - the values will be read from the current detector structure
    Parameters:
    fname name of the file to be written
    imod module number
    Returns:
    OK or FAIL if the file could not be written
    -
    See also:
    sls_detector_module sharedSlsDetector
    +
    See also:
    sls_detector_module sharedSlsDetector mythenDetector::writeTrimFile(string, int)

    -Reimplemented in mythenDetector, and eigerDetector. +Implemented in mythenDetector, and eigerDetector.

    - +


    Member Data Documentation

    @@ -4308,7 +4333,7 @@ Reimplemented in - +
    float* slsDetector::adcs [private] float* slsDetector::adcs [protected]
    @@ -4323,7 +4348,7 @@ pointer to adc valuse
    - +
    int* slsDetector::badChannelMask [private] int* slsDetector::badChannelMask [protected]
    @@ -4339,7 +4364,7 @@ pointer to bad channel mask 0 is channel is good 1 if it is bad
    <
    - +
    int* slsDetector::chanregs [private] int* slsDetector::chanregs [protected]
    @@ -4354,7 +4379,7 @@ pointer to channal registers
    - +
    int* slsDetector::chipregs [private] int* slsDetector::chipregs [protected]
    @@ -4369,7 +4394,7 @@ pointer to chip registers @@ -4384,7 +4409,7 @@ socket for control commands
    - +
    float slsDetector::currentI0 [private] float slsDetector::currentI0 [protected]
    @@ -4399,7 +4424,7 @@ I0 measured
    - +
    float slsDetector::currentPosition [private] float slsDetector::currentPosition [protected]
    @@ -4414,7 +4439,7 @@ current position of the detector @@ -4429,7 +4454,7 @@ current position index of the detector
    - +
    float* slsDetector::dacs [private] float* slsDetector::dacs [protected]
    @@ -4444,7 +4469,7 @@ pointer to dac valuse
    - +
    pthread_t slsDetector::dataProcessingThread [private] pthread_t slsDetector::dataProcessingThread [protected]
    @@ -4459,7 +4484,7 @@ data processing thread???
    - +
    queue<int*> slsDetector::dataQueue [private] queue<int*> slsDetector::dataQueue [protected]
    @@ -4474,7 +4499,7 @@ data queue @@ -4489,7 +4514,7 @@ socket for data acquisition @@ -4504,7 +4529,7 @@ pointer to detector module structures
    - +
    int slsDetector::detId [private] int slsDetector::detId [protected]
    @@ -4519,7 +4544,7 @@ detector ID
    - +
    float* slsDetector::ffcoefficients [private] float* slsDetector::ffcoefficients [protected]
    @@ -4534,7 +4559,7 @@ pointer to flat field coefficients
    - +
    float* slsDetector::fferrors [private] float* slsDetector::fferrors [protected]
    @@ -4549,7 +4574,7 @@ pointer to flat field coefficient errors
    - +
    float* slsDetector::mergingBins [private] float* slsDetector::mergingBins [protected]
    @@ -4564,7 +4589,7 @@ merging bins
    - +
    float* slsDetector::mergingCounts [private] float* slsDetector::mergingCounts [protected]
    @@ -4579,7 +4604,7 @@ merging counts
    - +
    float* slsDetector::mergingErrors [private] float* slsDetector::mergingErrors [protected]
    @@ -4594,7 +4619,7 @@ merging errors @@ -4609,7 +4634,7 @@ merging multiplicity
    - +
    int slsDetector::onlineFlag [private] int slsDetector::onlineFlag [protected]
    @@ -4625,7 +4650,7 @@ merging multiplicity
    - +
    int slsDetector::shmId [private] int slsDetector::shmId [protected]
    @@ -4640,7 +4665,7 @@ shared memeory ID @@ -4655,7 +4680,7 @@ socket for emergency stop @@ -4667,7 +4692,7 @@ address of the detector structure in shared memory


    The documentation for this class was generated from the following files:
    -
    Generated on Fri Oct 9 16:01:05 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/eigerDetector_8h-source.html b/slsDetectorSoftware/docs/html/eigerDetector_8h-source.html index d4bf9ab5b..463c34636 100644 --- a/slsDetectorSoftware/docs/html/eigerDetector_8h-source.html +++ b/slsDetectorSoftware/docs/html/eigerDetector_8h-source.html @@ -84,7 +84,7 @@ 00168 00169 00170 #endif -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/eigerDetector_8h.html b/slsDetectorSoftware/docs/html/eigerDetector_8h.html index 41f37d903..4c6c094c9 100644 --- a/slsDetectorSoftware/docs/html/eigerDetector_8h.html +++ b/slsDetectorSoftware/docs/html/eigerDetector_8h.html @@ -28,7 +28,7 @@  This is class contains all eiger specific functionalities. More...
    -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/files.html b/slsDetectorSoftware/docs/html/files.html index efe84a44c..f853ba5eb 100644 --- a/slsDetectorSoftware/docs/html/files.html +++ b/slsDetectorSoftware/docs/html/files.html @@ -29,7 +29,7 @@ usersFunctions/usersFunctions.c usersFunctions/usersFunctions.h [code] -
    Generated on Fri Oct 9 16:01:05 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/functions.html b/slsDetectorSoftware/docs/html/functions.html index 557dea4d2..d34624662 100644 --- a/slsDetectorSoftware/docs/html/functions.html +++ b/slsDetectorSoftware/docs/html/functions.html @@ -59,15 +59,16 @@ Here is a list of all class members with links to the classes they belong to:

    - a -

    -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/functions_0x62.html b/slsDetectorSoftware/docs/html/functions_0x62.html index d3986ffaf..bae46ae86 100644 --- a/slsDetectorSoftware/docs/html/functions_0x62.html +++ b/slsDetectorSoftware/docs/html/functions_0x62.html @@ -58,12 +58,13 @@ Here is a list of all class members with links to the classes they belong to:

    - b -

    -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/functions_0x63.html b/slsDetectorSoftware/docs/html/functions_0x63.html index ee6280404..a5c4d1007 100644 --- a/slsDetectorSoftware/docs/html/functions_0x63.html +++ b/slsDetectorSoftware/docs/html/functions_0x63.html @@ -74,13 +74,13 @@ Here is a list of all class members with links to the classes they belong to: : slsDetector
  • correctionMask : slsDetector::sharedSlsDetector
  • createFileName() : slsDetector
  • createModule() -: slsDetector
  • currentI0 +: slsDetector
  • currentI0 : slsDetector
  • currentPosition : slsDetector
  • currentPositionIndex : slsDetector
  • currentSettings : slsDetector::sharedSlsDetector
  • currentThresholdEV : slsDetector::sharedSlsDetector -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/functions_0x64.html b/slsDetectorSoftware/docs/html/functions_0x64.html index a1e1a4989..40a07b072 100644 --- a/slsDetectorSoftware/docs/html/functions_0x64.html +++ b/slsDetectorSoftware/docs/html/functions_0x64.html @@ -66,16 +66,16 @@ Here is a list of all class members with links to the classes they belong to: : slsDetector
  • dataQueue : slsDetector
  • dataSocket : slsDetector
  • decodeData() -: eigerDetector, mythenDetector, slsDetector
  • deleteModule() +: eigerDetector, slsDetector
  • deleteModule() : slsDetector
  • detectorModules : slsDetector
  • detId : slsDetector
  • detPositions : slsDetector::sharedSlsDetector
  • digitalTest() : slsDetector
  • Disconnect() : MySocketTCP
  • dumpDetectorSetup() -: slsDetector
  • dynamicRange +: mythenDetector, slsDetector
  • dynamicRange : slsDetector::sharedSlsDetector -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/functions_0x65.html b/slsDetectorSoftware/docs/html/functions_0x65.html index 9fef7e438..592fb8b3a 100644 --- a/slsDetectorSoftware/docs/html/functions_0x65.html +++ b/slsDetectorSoftware/docs/html/functions_0x65.html @@ -69,7 +69,7 @@ Here is a list of all class members with links to the classes they belong to: : slsDetector
  • exists() : slsDetector
  • exitServer() : slsDetector -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/functions_0x66.html b/slsDetectorSoftware/docs/html/functions_0x66.html index b09c2159a..060323a44 100644 --- a/slsDetectorSoftware/docs/html/functions_0x66.html +++ b/slsDetectorSoftware/docs/html/functions_0x66.html @@ -72,7 +72,7 @@ Here is a list of all class members with links to the classes they belong to: : slsDetector::sharedSlsDetector
  • flatFieldCorrect() : slsDetector
  • freeSharedMemory() : slsDetector -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/functions_0x67.html b/slsDetectorSoftware/docs/html/functions_0x67.html index 2988c617d..3cf690e83 100644 --- a/slsDetectorSoftware/docs/html/functions_0x67.html +++ b/slsDetectorSoftware/docs/html/functions_0x67.html @@ -62,13 +62,13 @@ Here is a list of all class members with links to the classes they belong to: : sls_detector_module
  • GET_ONLINE_FLAG : slsDetector
  • getADC() : slsDetector
  • getAngularConversion() -: mythenDetector, slsDetector
  • getBadChannelCorrections() +: mythenDetector, slsDetector
  • getBadChannelCorrectionFile() +: slsDetector
  • getBadChannelCorrections() : slsDetector
  • getBinSize() -: mythenDetector, slsDetector
  • getCalDir() +: mythenDetector, slsDetector
  • getCalDir() : slsDetector
  • getChannel() -: slsDetector
  • getChip() -: slsDetector
  • getClockDivider() -: slsDetector
  • getControlPort() +: slsDetector
  • getChip() +: slsDetector
  • getControlPort() : slsDetector
  • getDataFromDetector() : slsDetector
  • getDataFromDetectorNoWait() : slsDetector
  • getDataPort() @@ -78,27 +78,26 @@ Here is a list of all class members with links to the classes they belong to: : slsDetector
  • getFileName() : slsDetector
  • getFilePath() : slsDetector
  • getFineOffset() -: mythenDetector, slsDetector
  • getFlatFieldCorrections() +: mythenDetector, slsDetector
  • getFlatFieldCorrections() : slsDetector
  • getGlobalOffset() -: mythenDetector, slsDetector
  • getHostname() +: mythenDetector, slsDetector
  • getHostname() : MySocketTCP, slsDetector
  • getId() : slsDetector
  • getMaxNumberOfModules() : slsDetector
  • getModule() -: slsDetector
  • getPortNumber() +: slsDetector
  • getPortNumber() : MySocketTCP
  • getPositions() -: mythenDetector, slsDetector
  • getRateCorrections() +: mythenDetector, slsDetector
  • getRateCorrections() : slsDetector
  • getRunStatus() -: slsDetector
  • getSetLength() -: slsDetector
  • getSettings() -: slsDetector
  • getStopPort() +: slsDetector
  • getSettings() +: slsDetector
  • getStopPort() : slsDetector
  • getThresholdEnergy() : slsDetector
  • getTimeLeft() : slsDetector
  • getTrimDir() : slsDetector
  • getTrimEn() -: slsDetector
  • giveCalibrationPulse() +: slsDetector
  • giveCalibrationPulse() : slsDetector
  • globalOffset : slsDetector::sharedSlsDetector -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/functions_0x68.html b/slsDetectorSoftware/docs/html/functions_0x68.html index f0d9fe5e1..736d45219 100644 --- a/slsDetectorSoftware/docs/html/functions_0x68.html +++ b/slsDetectorSoftware/docs/html/functions_0x68.html @@ -60,7 +60,7 @@ Here is a list of all class members with links to the classes they belong to:

    - h -

    -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/functions_0x69.html b/slsDetectorSoftware/docs/html/functions_0x69.html index 1a521e886..df8c7c71a 100644 --- a/slsDetectorSoftware/docs/html/functions_0x69.html +++ b/slsDetectorSoftware/docs/html/functions_0x69.html @@ -64,7 +64,7 @@ Here is a list of all class members with links to the classes they belong to: : slsDetector
  • iptr : iarray
  • is_a_server : MySocketTCP -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/functions_0x6c.html b/slsDetectorSoftware/docs/html/functions_0x6c.html index 2a8b8a393..425adc84d 100644 --- a/slsDetectorSoftware/docs/html/functions_0x6c.html +++ b/slsDetectorSoftware/docs/html/functions_0x6c.html @@ -61,7 +61,7 @@ Here is a list of all class members with links to the classes they belong to:
  • last_keep_connection_open_action_was_a_send : MySocketTCP
  • len : iarray -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/functions_0x6d.html b/slsDetectorSoftware/docs/html/functions_0x6d.html index 0c4578ff5..4935547a0 100644 --- a/slsDetectorSoftware/docs/html/functions_0x6d.html +++ b/slsDetectorSoftware/docs/html/functions_0x6d.html @@ -66,9 +66,8 @@ Here is a list of all class members with links to the classes they belong to: : slsDetector::sharedSlsDetector
  • module : sls_detector_module, sls_detector_chip, sls_detector_channel
  • myDetectorType : slsDetector::sharedSlsDetector
  • MySocketTCP() -: MySocketTCP
  • mythenDetector() -: mythenDetector -
    Generated on Fri Oct 9 16:01:04 2009 by  +: MySocketTCP +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/functions_0x6e.html b/slsDetectorSoftware/docs/html/functions_0x6e.html index 705d164af..643f5a310 100644 --- a/slsDetectorSoftware/docs/html/functions_0x6e.html +++ b/slsDetectorSoftware/docs/html/functions_0x6e.html @@ -76,7 +76,7 @@ Here is a list of all class members with links to the classes they belong to: : slsDetector::sharedSlsDetector
  • nTrimEn : slsDetector::sharedSlsDetector
  • numberOfPositions : slsDetector::sharedSlsDetector -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/functions_0x6f.html b/slsDetectorSoftware/docs/html/functions_0x6f.html index bb21d8dbf..2e797b297 100644 --- a/slsDetectorSoftware/docs/html/functions_0x6f.html +++ b/slsDetectorSoftware/docs/html/functions_0x6f.html @@ -63,7 +63,7 @@ Here is a list of all class members with links to the classes they belong to: : angleConversionConstant, sls_detector_module
  • ONLINE_FLAG : slsDetector
  • onlineFlag : slsDetector -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/functions_0x70.html b/slsDetectorSoftware/docs/html/functions_0x70.html index da53d0402..01684eb2b 100644 --- a/slsDetectorSoftware/docs/html/functions_0x70.html +++ b/slsDetectorSoftware/docs/html/functions_0x70.html @@ -61,8 +61,8 @@ Here is a list of all class members with links to the classes they belong to:
  • popDataQueue() : slsDetector
  • portno : MySocketTCP
  • processData() -: slsDetector -
    Generated on Fri Oct 9 16:01:04 2009 by  +: mythenDetector, slsDetector +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/functions_0x72.html b/slsDetectorSoftware/docs/html/functions_0x72.html index 58c81e089..62f804a29 100644 --- a/slsDetectorSoftware/docs/html/functions_0x72.html +++ b/slsDetectorSoftware/docs/html/functions_0x72.html @@ -62,13 +62,13 @@ Here is a list of all class members with links to the classes they belong to: : angleConversionConstant
  • rateCorrect() : slsDetector
  • readAll() : slsDetector
  • readAngularConversion() -: mythenDetector, slsDetector
  • readCalibrationFile() -: eigerDetector, mythenDetector, slsDetector
  • readConfigurationFile() -: slsDetector
  • readDataFile() -: eigerDetector, mythenDetector, slsDetector
  • readFrame() +: mythenDetector, slsDetector
  • readCalibrationFile() +: eigerDetector, mythenDetector, slsDetector
  • readConfigurationFile() +: mythenDetector, slsDetector
  • readDataFile() +: eigerDetector, mythenDetector, slsDetector
  • readFrame() : slsDetector
  • readRegister() : slsDetector
  • readTrimFile() -: eigerDetector, mythenDetector, slsDetector
  • receiveChannel() +: eigerDetector, mythenDetector, slsDetector
  • receiveChannel() : slsDetector
  • receiveChip() : slsDetector
  • ReceiveData() : MySocketTCP
  • ReceiveDataAndKeepConnection() @@ -76,11 +76,11 @@ Here is a list of all class members with links to the classes they belong to: : MySocketTCP
  • receiveModule() : slsDetector
  • reg : sls_detector_module, sls_detector_chip, sls_detector_channel
  • resetMerging() -: mythenDetector, slsDetector
  • retrieveDetectorSetup() -: slsDetector
  • roFlags +: mythenDetector, slsDetector
  • retrieveDetectorSetup() +: mythenDetector, slsDetector
  • roFlags : slsDetector::sharedSlsDetector
  • roiLimits : slsDetector::sharedSlsDetector -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/functions_0x73.html b/slsDetectorSoftware/docs/html/functions_0x73.html index dc80765fe..f6639bd13 100644 --- a/slsDetectorSoftware/docs/html/functions_0x73.html +++ b/slsDetectorSoftware/docs/html/functions_0x73.html @@ -68,13 +68,12 @@ Here is a list of all class members with links to the classes they belong to: : slsDetector
  • serialnumber : sls_detector_module
  • serverAddress : MySocketTCP
  • setAngularConversion() -: mythenDetector, slsDetector
  • setBadChannelCorrection() +: mythenDetector, slsDetector
  • setBadChannelCorrection() : slsDetector
  • setBinSize() -: mythenDetector, slsDetector
  • setCalDir() +: mythenDetector, slsDetector
  • setCalDir() : slsDetector
  • setChannel() : slsDetector
  • setChip() -: slsDetector
  • setClockDivider() -: slsDetector
  • setDAC() +: slsDetector
  • setDAC() : slsDetector
  • setDetectorType() : slsDetector
  • setDynamicRange() : slsDetector
  • setExternalCommunicationMode() @@ -83,18 +82,18 @@ Here is a list of all class members with links to the classes they belong to: : slsDetector
  • setFileName() : slsDetector
  • setFilePath() : slsDetector
  • setFineOffset() -: mythenDetector, slsDetector
  • setFlatFieldCorrection() +: mythenDetector, slsDetector
  • setFlatFieldCorrection() : slsDetector
  • setGlobalOffset() -: mythenDetector, slsDetector
  • setModule() +: mythenDetector, slsDetector
  • setModule() : slsDetector
  • setNumberOfModules() : slsDetector
  • setOnline() : slsDetector
  • setPositions() -: mythenDetector, slsDetector
  • setRateCorrection() +: mythenDetector, slsDetector
  • setRateCorrection() : slsDetector
  • setReadOutFlags() : slsDetector
  • setROI() -: slsDetector
  • setSetLength() -: slsDetector
  • setSettings() -: slsDetector
  • setTCPSocket() +: slsDetector
  • setSettings() +: slsDetector
  • setSpeed() +: slsDetector
  • setTCPSocket() : slsDetector
  • setThresholdEnergy() : slsDetector
  • setTimer() : slsDetector
  • setTrimDir() @@ -111,7 +110,7 @@ Here is a list of all class members with links to the classes they belong to: : slsDetector
  • stopPort : slsDetector::sharedSlsDetector
  • stopSocket : slsDetector -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/functions_0x74.html b/slsDetectorSoftware/docs/html/functions_0x74.html index 579786a88..3f01e2d43 100644 --- a/slsDetectorSoftware/docs/html/functions_0x74.html +++ b/slsDetectorSoftware/docs/html/functions_0x74.html @@ -65,7 +65,7 @@ Here is a list of all class members with links to the classes they belong to: : slsDetector::sharedSlsDetector
  • trimDir : slsDetector::sharedSlsDetector
  • trimEnergies : slsDetector::sharedSlsDetector -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/functions_0x77.html b/slsDetectorSoftware/docs/html/functions_0x77.html index 72ab3ee7d..fb1e4bc53 100644 --- a/slsDetectorSoftware/docs/html/functions_0x77.html +++ b/slsDetectorSoftware/docs/html/functions_0x77.html @@ -59,13 +59,13 @@ Here is a list of all class members with links to the classes they belong to:

    - w -

    -
    Generated on Fri Oct 9 16:01:04 2009 by  +: eigerDetector, mythenDetector, slsDetector +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/functions_0x78.html b/slsDetectorSoftware/docs/html/functions_0x78.html index 0555e6f36..1de33b6ed 100644 --- a/slsDetectorSoftware/docs/html/functions_0x78.html +++ b/slsDetectorSoftware/docs/html/functions_0x78.html @@ -61,7 +61,7 @@ Here is a list of all class members with links to the classes they belong to:
  • xmax : ROI
  • xmin : ROI -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/functions_0x79.html b/slsDetectorSoftware/docs/html/functions_0x79.html index 0a1480d8d..6266c43b0 100644 --- a/slsDetectorSoftware/docs/html/functions_0x79.html +++ b/slsDetectorSoftware/docs/html/functions_0x79.html @@ -61,7 +61,7 @@ Here is a list of all class members with links to the classes they belong to:
  • ymax : ROI
  • ymin : ROI -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/functions_0x7e.html b/slsDetectorSoftware/docs/html/functions_0x7e.html index a78c2bc77..b954894ef 100644 --- a/slsDetectorSoftware/docs/html/functions_0x7e.html +++ b/slsDetectorSoftware/docs/html/functions_0x7e.html @@ -60,10 +60,9 @@ Here is a list of all class members with links to the classes they belong to:

    - ~ -

    -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/functions_eval.html b/slsDetectorSoftware/docs/html/functions_eval.html index eb5b8b72f..bb5bee277 100644 --- a/slsDetectorSoftware/docs/html/functions_eval.html +++ b/slsDetectorSoftware/docs/html/functions_eval.html @@ -35,7 +35,7 @@ : slsDetector
  • OFFLINE_FLAG : slsDetector
  • ONLINE_FLAG : slsDetector -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/functions_func.html b/slsDetectorSoftware/docs/html/functions_func.html index a1b1d72e4..490ca75d1 100644 --- a/slsDetectorSoftware/docs/html/functions_func.html +++ b/slsDetectorSoftware/docs/html/functions_func.html @@ -51,21 +51,21 @@

    - a -

    - c -

    +: slsDetector

    - d -

    +: mythenDetector, slsDetector

    - e -

    - p -

    +: mythenDetector, slsDetector

    - r -

    +: mythenDetector, slsDetector
  • retrieveDetectorSetup() +: mythenDetector, slsDetector

    - s -

    - w -

    +: eigerDetector, mythenDetector, slsDetector

    - ~ -

    -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/functions_type.html b/slsDetectorSoftware/docs/html/functions_type.html index c90b0b88f..448392ba0 100644 --- a/slsDetectorSoftware/docs/html/functions_type.html +++ b/slsDetectorSoftware/docs/html/functions_type.html @@ -33,7 +33,7 @@ -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/functions_vars.html b/slsDetectorSoftware/docs/html/functions_vars.html index 632771c47..79aefe74d 100644 --- a/slsDetectorSoftware/docs/html/functions_vars.html +++ b/slsDetectorSoftware/docs/html/functions_vars.html @@ -59,11 +59,13 @@
  • adcoff : slsDetector::sharedSlsDetector
  • adcs : sls_detector_module, slsDetector
  • alreadyExisting -: slsDetector::sharedSlsDetector
  • angDirection +: slsDetector::sharedSlsDetector
  • angConvFile +: slsDetector::sharedSlsDetector
  • angDirection : slsDetector::sharedSlsDetector
  • angOff : slsDetector::sharedSlsDetector

    - b -

    -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/globals.html b/slsDetectorSoftware/docs/html/globals.html index 53598671c..dfa2308d7 100644 --- a/slsDetectorSoftware/docs/html/globals.html +++ b/slsDetectorSoftware/docs/html/globals.html @@ -30,26 +30,27 @@
    @@ -66,232 +67,7 @@ Here is a list of all file members with links to the files they belong to: : sls_detector_defs.h
  • AUTO : sls_detector_defs.h
  • AVERAGE_NEIGHBOURS_FOR_BAD_CHANNELS : sls_detector_defs.h -

    - b -

    -

    - c -

    -

    - d -

    -

    - e -

    -

    - f -

    -

    - g -

    -

    - h -

    -

    - i -

    -

    - m -

    -

    - n -

    -

    - o -

    -

    - p -

    -

    - r -

    -

    - s -

    -

    - t -

    -

    - u -

    -

    - x -

    -

    - y -

    -

    - z -

    -
    Generated on Fri Oct 9 16:01:05 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/globals_defs.html b/slsDetectorSoftware/docs/html/globals_defs.html index eb3c1528c..13f5b4a52 100644 --- a/slsDetectorSoftware/docs/html/globals_defs.html +++ b/slsDetectorSoftware/docs/html/globals_defs.html @@ -35,7 +35,7 @@ : slsDetector.h
  • DEFAULT_PORTNO : MySocketTCP.h
  • DEFAULT_SHM_KEY : slsDetector.h
  • defaultTDead -: slsDetector.h
  • GET_FLAG +: mythenDetector.h, slsDetector.h
  • GET_FLAG : sls_detector_defs.h
  • MAX_BADCHANS : slsDetector.h
  • MAX_ROIS : slsDetector.h
  • MAX_STR_LENGTH @@ -50,7 +50,7 @@ : slsDetector.h
  • PI : usersFunctions.h
  • SEND_REC_MAX_SIZE : MySocketTCP.h -
    Generated on Fri Oct 9 16:01:05 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/globals_enum.html b/slsDetectorSoftware/docs/html/globals_enum.html index 17843b1f5..82d35d0aa 100644 --- a/slsDetectorSoftware/docs/html/globals_enum.html +++ b/slsDetectorSoftware/docs/html/globals_enum.html @@ -47,10 +47,11 @@ : sls_detector_defs.h
  • moduleRegisterBit : sls_detector_defs.h
  • numberOf : sls_detector_defs.h
  • readOutFlags -: sls_detector_defs.h
  • timerIndex +: sls_detector_defs.h
  • speedVariable +: sls_detector_defs.h
  • timerIndex : sls_detector_defs.h
  • trimMode : sls_detector_defs.h -
    Generated on Fri Oct 9 16:01:05 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/globals_eval.html b/slsDetectorSoftware/docs/html/globals_eval.html index 32fad025e..d2291767c 100644 --- a/slsDetectorSoftware/docs/html/globals_eval.html +++ b/slsDetectorSoftware/docs/html/globals_eval.html @@ -47,6 +47,7 @@
  • s
  • t
  • u
  • +
  • w
  • x
  • y
  • z
  • @@ -74,7 +75,8 @@ : sls_detector_defs.h
  • CALIBRATION_PULSES : sls_detector_defs.h
  • CHIP_OUTPUT_WIDTH : sls_detector_defs.h
  • CHIP_TEST -: sls_detector_defs.h
  • COMPARATOR_ENABLE +: sls_detector_defs.h
  • CLOCK_DIVIDER +: sls_detector_defs.h
  • COMPARATOR_ENABLE : sls_detector_defs.h
  • CYCLES_NUMBER : sls_detector_defs.h

    - d -

    - s -

    +

    - w -

    - x -

    @@ -249,7 +257,7 @@
  • Z : sls_detector_defs.h
  • ZERO_COMPRESSION : sls_detector_defs.h -
    Generated on Fri Oct 9 16:01:05 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/globals_func.html b/slsDetectorSoftware/docs/html/globals_func.html index 2a6cb3ff5..67ace4738 100644 --- a/slsDetectorSoftware/docs/html/globals_func.html +++ b/slsDetectorSoftware/docs/html/globals_func.html @@ -37,7 +37,7 @@ : usersFunctions.c, usersFunctions.h
  • go_to_position() : usersFunctions.c, usersFunctions.h
  • go_to_position_no_wait() : usersFunctions.c, usersFunctions.h -
    Generated on Fri Oct 9 16:01:05 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/globals_vars.html b/slsDetectorSoftware/docs/html/globals_vars.html index 2d3e74cda..ed4622654 100644 --- a/slsDetectorSoftware/docs/html/globals_vars.html +++ b/slsDetectorSoftware/docs/html/globals_vars.html @@ -33,7 +33,7 @@ -
    Generated on Fri Oct 9 16:01:05 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/hierarchy.html b/slsDetectorSoftware/docs/html/hierarchy.html index e7fb78bf1..bbe4d9601 100644 --- a/slsDetectorSoftware/docs/html/hierarchy.html +++ b/slsDetectorSoftware/docs/html/hierarchy.html @@ -34,7 +34,7 @@
  • slsDetector::sharedSlsDetector -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/index.html b/slsDetectorSoftware/docs/html/index.html index f0217bd9f..d70505339 100644 --- a/slsDetectorSoftware/docs/html/index.html +++ b/slsDetectorSoftware/docs/html/index.html @@ -26,11 +26,16 @@ The architecture of the acquisitions system is intended as follows:
    • C++ classes common to all detectors for client-server communication. These can be supplied to users as libraries and embedded also in acquisition systems which are not developed by the SLS
      See also:
      MySocketTCP slsDetector
    • the possibility of using a Qt-based graphical user interface (with eventually root analisys capabilities)
    • -
    • the possibility of runnin alla commands from command line. In order to ensure a fast operation of this so called "text client" the detector parameters should not be re-initialized everytime. For this reason a shared memory block is allocated where the main detector flags and parameters are stored
      See also:
      slsDetector::sharedSlsDetector
      -
      Author:
      Anna Bergamaschi
      +
    • the possibility of runnin alla commands from command line. In order to ensure a fast operation of this so called "text client" the detector parameters should not be re-initialized everytime. For this reason a shared memory block is allocated where the main detector flags and parameters are stored
      See also:
      slsDetector::sharedSlsDetector
    -
    Generated on Fri Oct 9 16:01:04 2009 by  +

    +How to use it

    +The best way to operate the slsDetectors is to use the software (text client or GUI) developed by the sls detectors group. In case you need to embed the detector control in a previously existing software, compile these classes using
    + make package
    + and link the shared library created to your software bin/libSlsDetector.so.1.0.1 Then in your software you should use the class related to the detector you want to control (mythenDetector or eigerDetector).

    +

    Author:
    Anna Bergamaschi
    +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/mythenDetector_8h-source.html b/slsDetectorSoftware/docs/html/mythenDetector_8h-source.html index 59db5d845..e93e5a1cc 100644 --- a/slsDetectorSoftware/docs/html/mythenDetector_8h-source.html +++ b/slsDetectorSoftware/docs/html/mythenDetector_8h-source.html @@ -24,97 +24,103 @@ 00004 #ifndef MYTHEN_DETECTOR_H 00005 #define MYTHEN_DETECTOR_H 00006 -00007 using namespace std; +00007 #include "slsDetector.h" 00008 -00009 -00010 -00022 #include "slsDetector.h" -00023 -00024 class mythenDetector : public slsDetector{ +00009 #define defaultTDead {170,90,750} +00010 +00011 using namespace std; +00023 class mythenDetector : public slsDetector{ +00024 00025 00026 -00027 -00028 public: -00029 -00030 -00031 -00038 mythenDetector(int id=0); -00039 //slsDetector(string const fname); -00041 ~mythenDetector(){}; -00042 -00043 -00044 -00052 sls_detector_module* readTrimFile(string fname, sls_detector_module* myMod=NULL); -00053 -00062 int writeTrimFile(string fname, sls_detector_module mod); -00063 -00071 int writeTrimFile(string fname, int imod); -00072 -00073 -00087 int writeDataFile(string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int nch=-1); -00088 -00095 int writeDataFile(string fname, int *data); -00096 -00110 int readDataFile(string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int nch=0); -00111 -00118 int readDataFile(string fname, int *data); -00119 -00132 int readCalibrationFile(string fname, float &gain, float &offset); -00133 -00141 int writeCalibrationFile(string fname, float gain, float offset); -00142 -00143 -00149 int readAngularConversion(string fname=""); -00155 int writeAngularConversion(string fname=""); -00156 -00157 -00158 -00159 /* Communication to server */ -00160 -00161 // Tests and identification -00162 -00168 int setAngularConversion(string fname=""); -00169 -00176 int getAngularConversion(int &direction, angleConversionConstant *angconv=NULL); -00177 -00181 float setGlobalOffset(float f){thisDetector->globalOffset=f; return thisDetector->globalOffset;}; +00027 public: +00031 mythenDetector(int id=0) : slsDetector(MYTHEN, id); +00032 //slsDetector(string const fname); +00033 // ~slsDetector(){while(dataQueue.size()>0){}}; +00035 ~mythenDetector(){}; +00036 +00037 +00038 int readConfigurationFile(string const fname); +00050 int writeConfigurationFile(string const fname); +00051 +00052 +00053 /* +00054 It should be possible to dump all the settings of the detector (including trimbits, threshold energy, gating/triggering, acquisition time etc. +00055 in a file and retrieve it for repeating the measurement with identicals ettings, if necessary +00056 */ +00062 int dumpDetectorSetup(string const fname); +00068 int retrieveDetectorSetup(string const fname); +00069 +00070 +00071 +00079 sls_detector_module* readTrimFile(string fname, sls_detector_module* myMod=NULL); +00080 +00089 int writeTrimFile(string fname, sls_detector_module mod); +00090 +00098 int writeTrimFile(string fname, int imod); +00099 +00113 int writeDataFile(string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int nch=-1); +00114 +00121 int writeDataFile(string fname, int *data); +00122 +00136 int readDataFile(string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int nch=0); +00137 +00144 int readDataFile(string fname, int *data); +00145 +00146 +00154 int readCalibrationFile(string fname, float &gain, float &offset); +00162 int writeCalibrationFile(string fname, float gain, float offset); +00163 +00164 +00170 int readAngularConversion(string fname=""); +00176 int writeAngularConversion(string fname=""); +00177 +00178 +00179 +00180 +00181 //Corrections 00182 -00186 float setFineOffset(float f){thisDetector->fineOffset=f; return thisDetector->fineOffset;}; -00190 float getFineOffset(){return thisDetector->fineOffset;}; -00191 -00195 float getGlobalOffset(){return thisDetector->globalOffset;}; -00196 -00203 int setPositions(int nPos, float *pos){thisDetector->numberOfPositions=nPos; for (int ip=0; ip<nPos; ip++) thisDetector->detPositions[ip]=pos[ip]; return thisDetector->numberOfPositions;}; -00209 int getPositions(float *pos=NULL){ if (pos ) {for (int ip=0; ip<thisDetector->numberOfPositions; ip++) pos[ip]=thisDetector->detPositions[ip];} return thisDetector->numberOfPositions;}; -00210 -00211 -00213 float setBinSize(float bs) {thisDetector->binSize=bs; return thisDetector->binSize;} -00215 float getBinSize() {return thisDetector->binSize;} -00216 -00217 -00218 -00219 -00220 +00183 +00189 int setAngularConversion(string fname=""); +00190 +00197 int getAngularConversion(int &direction, angleConversionConstant *angconv=NULL); +00198 +00199 +00201 char *getAngularConversion() {return thisDetector->angConvFile;}; +00202 +00206 float setGlobalOffset(float f){thisDetector->globalOffset=f; return thisDetector->globalOffset;}; +00207 +00211 float setFineOffset(float f){thisDetector->fineOffset=f; return thisDetector->fineOffset;}; +00215 float getFineOffset(){return thisDetector->fineOffset;}; +00216 +00220 float getGlobalOffset(){return thisDetector->globalOffset;}; 00221 -00227 float* decodeData(int *datain); -00228 -00229 -00230 -00231 int resetMerging(float *mp, float *mv,float *me, int *mm); -00242 int addToMerging(float *p1, float *v1, float *e1, float *mp, float *mv,float *me, int *mm); +00228 int setPositions(int nPos, float *pos){thisDetector->numberOfPositions=nPos; for (int ip=0; ip<nPos; ip++) thisDetector->detPositions[ip]=pos[ip]; return thisDetector->numberOfPositions;}; +00234 int getPositions(float *pos=NULL){ if (pos ) {for (int ip=0; ip<thisDetector->numberOfPositions; ip++) pos[ip]=thisDetector->detPositions[ip];} return thisDetector->numberOfPositions;}; +00235 +00236 +00238 float setBinSize(float bs) {thisDetector->binSize=bs; return thisDetector->binSize;} +00240 float getBinSize() {return thisDetector->binSize;} +00241 +00242 00243 -00252 int finalizeMerging(float *mp, float *mv,float *me, int *mm); -00253 -00254 -00255 -00256 private: -00257 -00258 -00259 }; -00260 -00261 -00262 #endif -
    Generated on Fri Oct 9 16:01:04 2009 by  +00244 +00252 int resetMerging(float *mp, float *mv,float *me, int *mm); +00262 int addToMerging(float *p1, float *v1, float *e1, float *mp, float *mv,float *me, int *mm); +00263 +00272 int finalizeMerging(float *mp, float *mv,float *me, int *mm); +00273 +00274 +00278 void* processData(); // thread function +00279 +00288 void acquire(); +00289 +00290 +00291 }; +00292 +00293 +00294 #endif +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/mythenDetector_8h.html b/slsDetectorSoftware/docs/html/mythenDetector_8h.html index 55ab7a8c1..b7118e31e 100644 --- a/slsDetectorSoftware/docs/html/mythenDetector_8h.html +++ b/slsDetectorSoftware/docs/html/mythenDetector_8h.html @@ -26,9 +26,27 @@

    Classes

    class  mythenDetector - This calss contains all mythen specific functions. More...
    +

    Defines

    +#define defaultTDead   {170,90,750} + -
    Generated on Fri Oct 9 16:01:04 2009 by  +

    Define Documentation

    + +
    +
    + + + + +
    #define defaultTDead   {170,90,750}
    +
    +
    + +

    + +

    +

    +


    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/namespaces.html b/slsDetectorSoftware/docs/html/namespaces.html index 8c83d98ad..41f8460f6 100644 --- a/slsDetectorSoftware/docs/html/namespaces.html +++ b/slsDetectorSoftware/docs/html/namespaces.html @@ -16,7 +16,7 @@

    Namespace List

    Here is a list of all namespaces with brief descriptions:
    std
    -
    Generated on Fri Oct 9 16:01:05 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/namespacestd.html b/slsDetectorSoftware/docs/html/namespacestd.html index 65e50282a..230fe4118 100644 --- a/slsDetectorSoftware/docs/html/namespacestd.html +++ b/slsDetectorSoftware/docs/html/namespacestd.html @@ -18,7 +18,7 @@
    -
    Generated on Fri Oct 9 16:01:05 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/pages.html b/slsDetectorSoftware/docs/html/pages.html index 84c34fc2d..d693c9cd6 100644 --- a/slsDetectorSoftware/docs/html/pages.html +++ b/slsDetectorSoftware/docs/html/pages.html @@ -17,7 +17,7 @@
  • Bug List -
    Generated on Fri Oct 9 16:01:05 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/slsDetector_8cpp.html b/slsDetectorSoftware/docs/html/slsDetector_8cpp.html index dad5a408a..82db797f7 100644 --- a/slsDetectorSoftware/docs/html/slsDetector_8cpp.html +++ b/slsDetectorSoftware/docs/html/slsDetector_8cpp.html @@ -26,7 +26,7 @@
    -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/slsDetector_8h-source.html b/slsDetectorSoftware/docs/html/slsDetector_8h-source.html index 0febaa00a..8c72f1a0f 100644 --- a/slsDetectorSoftware/docs/html/slsDetector_8h-source.html +++ b/slsDetectorSoftware/docs/html/slsDetector_8h-source.html @@ -42,475 +42,481 @@ 00022 #include <sys/uio.h> 00023 00024 -00025 #define MAX_TIMERS 10 -00026 #define MAX_ROIS 100 -00027 #define MAX_BADCHANS 2000 -00028 #define MAXPOS 50 -00029 -00030 #define NMODMAXX 24 -00031 #define NMODMAXY 24 -00032 #define MAXMODS 36 -00033 #define NCHIPSMAX 10 -00034 #define NCHANSMAX 65536 -00035 #define NDACSMAX 16 -00036 -00037 #define DEFAULT_HOSTNAME "localhost" -00038 #define DEFAULT_SHM_KEY 5678 -00039 -00040 #define defaultTDead {170,90,750} +00025 #include "sls_detector_defs.h" +00026 +00027 #define MAX_TIMERS 10 +00028 #define MAX_ROIS 100 +00029 #define MAX_BADCHANS 2000 +00030 #define MAXPOS 50 +00031 +00032 #define NMODMAXX 24 +00033 #define NMODMAXY 24 +00034 #define MAXMODS 36 +00035 #define NCHIPSMAX 10 +00036 #define NCHANSMAX 65536 +00037 #define NDACSMAX 16 +00038 +00039 #define DEFAULT_HOSTNAME "localhost" +00040 #define DEFAULT_SHM_KEY 5678 00041 -00042 using namespace std; -00078 class slsDetector { -00079 -00080 -00081 -00082 public: -00083 -00084 -00086 enum {GET_ONLINE_FLAG, -00087 OFFLINE_FLAG, -00088 ONLINE_FLAG -00089 }; +00042 #define defaultTDead {170,90,750} +00044 using namespace std; +00045 +00084 class slsDetector { +00085 +00086 +00087 +00088 public: +00089 00090 -00091 -00092 #include "sls_detector_defs.h" -00093 -00094 -00099 typedef struct sharedSlsDetector { -00101 int alreadyExisting; -00102 -00104 char hostname[MAX_STR_LENGTH]; -00106 int controlPort; -00108 int stopPort; -00110 int dataPort; -00111 -00113 detectorType myDetectorType; -00114 +00092 enum {GET_ONLINE_FLAG, +00093 OFFLINE_FLAG, +00094 ONLINE_FLAG +00095 }; +00096 +00097 +00098 +00103 typedef struct sharedSlsDetector { +00105 int alreadyExisting; +00106 +00108 char hostname[MAX_STR_LENGTH]; +00110 int controlPort; +00112 int stopPort; +00114 int dataPort; 00115 -00117 char trimDir[MAX_STR_LENGTH]; -00119 char calDir[MAX_STR_LENGTH]; -00121 int nTrimEn; -00123 int trimEnergies[100]; -00124 -00125 -00127 int fileIndex; -00129 char filePath[MAX_STR_LENGTH]; -00131 char fileName[MAX_STR_LENGTH]; -00132 -00133 /* size of the detector */ -00134 -00136 int nMod[2]; -00138 int nMods; -00140 int nModMax[2]; -00142 int nModsMax; -00144 int nChans; -00146 int nChips; -00148 int nDacs; -00150 int nAdcs; -00152 int dynamicRange; -00154 int dataBytes; -00155 -00157 int correctionMask; -00159 float tDead; -00161 int nBadChans; -00163 int badChansList[MAX_BADCHANS]; -00165 int nBadFF; -00167 int badFFList[MAX_BADCHANS]; -00168 -00170 angleConversionConstant angOff[MAXMODS]; -00172 int angDirection; -00174 float fineOffset; -00176 float globalOffset; -00178 int numberOfPositions; -00180 float detPositions[MAXPOS]; -00182 float binSize; -00183 -00184 /* infos necessary for the readout to determine the size of the data */ -00186 int nROI; -00188 ROI roiLimits[MAX_ROIS]; -00190 readOutFlags roFlags; +00117 detectorType myDetectorType; +00118 +00119 +00121 char trimDir[MAX_STR_LENGTH]; +00123 char calDir[MAX_STR_LENGTH]; +00125 int nTrimEn; +00127 int trimEnergies[100]; +00128 +00129 +00131 int fileIndex; +00133 char filePath[MAX_STR_LENGTH]; +00135 char fileName[MAX_STR_LENGTH]; +00136 +00137 /* size of the detector */ +00138 +00140 int nMod[2]; +00142 int nMods; +00144 int nModMax[2]; +00146 int nModsMax; +00148 int nChans; +00150 int nChips; +00152 int nDacs; +00154 int nAdcs; +00156 int dynamicRange; +00158 int dataBytes; +00159 +00161 int correctionMask; +00163 float tDead; +00165 int nBadChans; +00167 char badChanFile[MAX_STR_LENGTH]; +00169 int badChansList[MAX_BADCHANS]; +00171 int nBadFF; +00173 int badFFList[MAX_BADCHANS]; +00174 +00176 char angConvFile[MAX_STR_LENGTH]; +00178 angleConversionConstant angOff[MAXMODS]; +00180 int angDirection; +00182 float fineOffset; +00184 float globalOffset; +00186 int numberOfPositions; +00188 float detPositions[MAXPOS]; +00190 float binSize; 00191 -00192 /* detector setup - not needed */ -00194 detectorSettings currentSettings; -00196 int currentThresholdEV; -00198 int64_t timerValue[MAX_TIMERS]; -00200 int clkDiv; -00201 -00202 /*offsets*/ -00204 int ffoff; -00206 int fferroff; -00208 int modoff; -00210 int dacoff; -00212 int adcoff; -00214 int chipoff; -00216 int chanoff; -00217 -00218 } sharedSlsDetector; -00219 -00220 -00221 -00228 slsDetector(detectorType type=GENERIC, int id=0); -00229 //slsDetector(string const fname); -00230 // ~slsDetector(){while(dataQueue.size()>0){}}; -00232 ~slsDetector(){}; -00233 -00234 -00237 int setOnline(int const online); -00240 int exists() {return thisDetector->alreadyExisting;}; +00192 /* infos necessary for the readout to determine the size of the data */ +00194 int nROI; +00196 ROI roiLimits[MAX_ROIS]; +00198 readOutFlags roFlags; +00199 +00200 /* detector setup - not needed */ +00202 detectorSettings currentSettings; +00204 int currentThresholdEV; +00206 int64_t timerValue[MAX_TIMERS]; +00208 int clkDiv; +00209 +00210 /*offsets*/ +00212 int ffoff; +00214 int fferroff; +00216 int modoff; +00218 int dacoff; +00220 int adcoff; +00222 int chipoff; +00224 int chanoff; +00225 +00226 } sharedSlsDetector; +00227 +00228 +00229 +00236 slsDetector(detectorType type=GENERIC, int id=0); +00237 //slsDetector(string const fname); +00238 // ~slsDetector(){while(dataQueue.size()>0){}}; +00240 ~slsDetector(){}; 00241 -00254 int readConfigurationFile(string const fname); -00266 int writeConfigurationFile(string const fname); -00267 -00268 -00269 /* -00270 It should be possible to dump all the settings of the detector (including trimbits, threshold energy, gating/triggering, acquisition time etc. -00271 in a file and retrieve it for repeating the measurement with identicals ettings, if necessary -00272 */ -00278 int dumpDetectorSetup(string const fname); -00284 int retrieveDetectorSetup(string const fname); -00285 -00297 int setTCPSocket(string const name="", int const control_port=-1, int const stop_port=-1, int const data_port=-1); -00299 char* getHostname() {return thisDetector->hostname;}; -00301 int getControlPort() {return thisDetector->controlPort;}; -00303 int getStopPort() {return thisDetector->stopPort;}; -00305 int getDataPort() {return thisDetector->dataPort;}; -00306 -00307 -00308 /* I/O */ -00310 char* getTrimDir() {return thisDetector->trimDir;}; -00312 char* setTrimDir(string s) {sprintf(thisDetector->trimDir, s.c_str()); return thisDetector->trimDir;}; -00319 int getTrimEn(int *en) {for (int ien=0; ien<thisDetector->nTrimEn; ien++) en[ien]=thisDetector->trimEnergies[ien]; return (thisDetector->nTrimEn);}; -00320 -00328 sls_detector_module* readTrimFile(string fname, sls_detector_module* myMod=NULL); -00329 -00338 int writeTrimFile(string fname, sls_detector_module mod); +00242 +00245 int setOnline(int const online); +00248 int exists() {return thisDetector->alreadyExisting;}; +00249 +00256 virtual int readConfigurationFile(string const fname)=0; +00262 virtual int writeConfigurationFile(string const fname)=0; +00263 +00264 +00265 /* +00266 It should be possible to dump all the settings of the detector (including trimbits, threshold energy, gating/triggering, acquisition time etc. +00267 in a file and retrieve it for repeating the measurement with identicals ettings, if necessary +00268 */ +00275 virtual int dumpDetectorSetup(string const fname)=0; +00281 virtual int retrieveDetectorSetup(string const fname)=0; +00282 +00294 int setTCPSocket(string const name="", int const control_port=-1, int const stop_port=-1, int const data_port=-1); +00296 char* getHostname() {return thisDetector->hostname;}; +00298 int getControlPort() {return thisDetector->controlPort;}; +00300 int getStopPort() {return thisDetector->stopPort;}; +00302 int getDataPort() {return thisDetector->dataPort;}; +00303 +00304 +00305 /* I/O */ +00307 char* getTrimDir() {return thisDetector->trimDir;}; +00309 char* setTrimDir(string s) {sprintf(thisDetector->trimDir, s.c_str()); return thisDetector->trimDir;}; +00316 int getTrimEn(int *en=NULL) {if (en) {for (int ien=0; ien<thisDetector->nTrimEn; ien++) en[ien]=thisDetector->trimEnergies[ien];} return (thisDetector->nTrimEn);}; +00317 +00327 virtual sls_detector_module* readTrimFile(string fname, sls_detector_module* myMod=NULL)=0; +00328 +00338 virtual int writeTrimFile(string fname, sls_detector_module mod)=0; 00339 -00347 int writeTrimFile(string fname, int imod); -00348 -00353 char* setFilePath(string s) {sprintf(thisDetector->filePath, s.c_str()); return thisDetector->filePath;}; -00354 -00359 char* setFileName(string s) {sprintf(thisDetector->fileName, s.c_str()); return thisDetector->fileName;}; -00360 -00365 int setFileIndex(int i) {thisDetector->fileIndex=i; return thisDetector->fileIndex;}; -00366 -00371 char* getFilePath() {return thisDetector->filePath;}; -00372 -00377 char* getFileName() {return thisDetector->fileName;}; -00378 -00383 int getFileIndex() {return thisDetector->fileIndex;}; -00384 -00396 string createFileName(); -00397 -00411 int writeDataFile(string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int nch=-1); -00412 -00419 int writeDataFile(string fname, int *data); -00420 -00434 int readDataFile(string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int nch=0); -00435 -00442 int readDataFile(string fname, int *data); -00443 -00448 char* getCalDir() {return thisDetector->calDir;}; -00453 char* setCalDir(string s) {sprintf(thisDetector->calDir, s.c_str()); return thisDetector->calDir;}; -00461 int readCalibrationFile(string fname, float &gain, float &offset); -00469 int writeCalibrationFile(string fname, float gain, float offset); -00470 -00471 -00477 int readAngularConversion(string fname=""); -00483 int writeAngularConversion(string fname=""); -00484 -00485 -00486 -00487 /* Communication to server */ -00488 -00489 // General purpose functions -00490 -00498 int execCommand(string cmd, string answer); -00499 -00506 int setDetectorType(detectorType type=GET_DETECTOR_TYPE); -00507 -00514 int setDetectorType(string type); -00515 -00521 void getDetectorType(char *type); -00522 -00523 -00524 // Detector configuration functions -00531 int setNumberOfModules(int n, dimension d=X); // if n=GET_FLAG returns the number of installed modules -00532 -00533 /* -00534 returns the instrinsic size of the detector (maxmodx, maxmody, nchans, nchips, ndacs -00535 enum numberOf { -00536 MAXMODX, -00537 MAXMODY, -00538 CHANNELS, -00539 CHIPS, -00540 DACS -00541 } -00542 */ -00543 -00544 -00550 int getMaxNumberOfModules(dimension d=X); // -00551 -00552 -00559 externalSignalFlag setExternalSignalFlags(externalSignalFlag pol=GET_EXTERNAL_SIGNAL_FLAG , int signalindex=0); -00560 -00561 -00569 externalCommunicationMode setExternalCommunicationMode(externalCommunicationMode pol=GET_EXTERNAL_COMMUNICATION_MODE); -00570 -00571 -00572 // Tests and identification -00573 -00580 int64_t getId(idMode mode, int imod=0); -00587 int digitalTest(digitalTestMode mode, int imod=0); -00596 int* analogTest(analogTestMode mode); -00597 -00603 int enableAnalogOutput(int ichan); -00604 -00610 int enableAnalogOutput(int imod, int ichip, int ichan); -00611 -00620 int giveCalibrationPulse(float vcal, int npulses); -00621 -00622 // Expert Initialization functions -00623 -00624 -00632 int writeRegister(int addr, int val); -00633 -00640 int readRegister(int addr); +00348 virtual int writeTrimFile(string fname, int imod)=0; +00349 +00354 char* setFilePath(string s) {sprintf(thisDetector->filePath, s.c_str()); return thisDetector->filePath;}; +00355 +00360 char* setFileName(string s) {sprintf(thisDetector->fileName, s.c_str()); return thisDetector->fileName;}; +00361 +00366 int setFileIndex(int i) {thisDetector->fileIndex=i; return thisDetector->fileIndex;}; +00367 +00372 char* getFilePath() {return thisDetector->filePath;}; +00373 +00378 char* getFileName() {return thisDetector->fileName;}; +00379 +00384 int getFileIndex() {return thisDetector->fileIndex;}; +00385 +00397 string createFileName(); +00398 +00413 virtual int writeDataFile(string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int nch=-1)=0; +00414 +00423 virtual int writeDataFile(string fname, int *data)=0; +00424 +00439 virtual int readDataFile(string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int nch=0)=0; +00440 +00449 virtual int readDataFile(string fname, int *data)=0; +00450 +00455 char* getCalDir() {cout << "cal dir is " << thisDetector->calDir; return thisDetector->calDir;}; +00456 +00457 +00462 char* setCalDir(string s) {sprintf(thisDetector->calDir, s.c_str()); return thisDetector->calDir;}; +00471 virtual int readCalibrationFile(string fname, float &gain, float &offset)=0; +00480 virtual int writeCalibrationFile(string fname, float gain, float offset)=0; +00481 +00482 +00489 virtual int readAngularConversion(string fname="")=0; +00496 virtual int writeAngularConversion(string fname="")=0; +00497 +00498 +00499 +00500 /* Communication to server */ +00501 +00502 +00510 int execCommand(string cmd, string answer); +00511 +00518 int setDetectorType(detectorType type=GET_DETECTOR_TYPE); +00519 +00526 int setDetectorType(string type); +00527 +00533 void getDetectorType(char *type); +00534 +00535 +00536 // Detector configuration functions +00544 // Detector configuration functions +00551 int setNumberOfModules(int n, dimension d=X); // if n=GET_FLAG returns the number of installed modules +00552 +00553 /* +00554 returns the instrinsic size of the detector (maxmodx, maxmody, nchans, nchips, ndacs +00555 enum numberOf { +00556 MAXMODX, +00557 MAXMODY, +00558 CHANNELS, +00559 CHIPS, +00560 DACS +00561 } +00562 */ +00563 +00564 +00570 int getMaxNumberOfModules(dimension d=X); // +00571 +00572 +00579 externalSignalFlag setExternalSignalFlags(externalSignalFlag pol=GET_EXTERNAL_SIGNAL_FLAG , int signalindex=0); +00580 +00581 +00589 externalCommunicationMode setExternalCommunicationMode(externalCommunicationMode pol=GET_EXTERNAL_COMMUNICATION_MODE); +00590 +00591 +00592 // Tests and identification +00593 +00600 int64_t getId(idMode mode, int imod=0); +00607 int digitalTest(digitalTestMode mode, int imod=0); +00616 int* analogTest(analogTestMode mode); +00617 +00623 int enableAnalogOutput(int ichan); +00624 +00630 int enableAnalogOutput(int imod, int ichip, int ichan); +00631 +00640 int giveCalibrationPulse(float vcal, int npulses); 00641 -00649 float setDAC(float val, dacIndex index, int imod=-1); -00650 -00657 float getADC(dacIndex index, int imod=0); -00658 -00668 int setChannel(int64_t reg, int ichan=-1, int ichip=-1, int imod=-1); -00669 -00675 int setChannel(sls_detector_channel chan); -00676 -00684 sls_detector_channel getChannel(int ichan, int ichip, int imod); -00685 -00686 -00687 -00696 int setChip(int reg, int ichip=-1, int imod=-1); -00697 -00704 int setChip(sls_detector_chip chip); -00705 -00714 sls_detector_chip getChip(int ichip, int imod); -00715 -00716 -00723 int setModule(int reg, int imod=-1); -00724 -00731 int setModule(sls_detector_module module); -00732 -00738 sls_detector_module *getModule(int imod); -00739 -00740 // calibration functions -00741 // int setCalibration(int imod, detectorSettings isettings, float gain, float offset); -00742 //int getCalibration(int imod, detectorSettings isettings, float &gain, float &offset); -00743 +00642 // Expert Initialization functions +00643 +00644 +00652 int writeRegister(int addr, int val); +00653 +00660 int readRegister(int addr); +00661 +00669 float setDAC(float val, dacIndex index, int imod=-1); +00670 +00677 float getADC(dacIndex index, int imod=0); +00678 +00688 int setChannel(int64_t reg, int ichan=-1, int ichip=-1, int imod=-1); +00689 +00695 int setChannel(sls_detector_channel chan); +00696 +00704 sls_detector_channel getChannel(int ichan, int ichip, int imod); +00705 +00706 +00707 +00716 int setChip(int reg, int ichip=-1, int imod=-1); +00717 +00724 int setChip(sls_detector_chip chip); +00725 +00734 sls_detector_chip getChip(int ichip, int imod); +00735 +00736 +00743 int setModule(int reg, int imod=-1); 00744 -00745 /* -00746 calibrated setup of the threshold -00747 */ -00753 int getThresholdEnergy(int imod=-1); -00754 -00762 int setThresholdEnergy(int e_eV, int imod=-1, detectorSettings isettings=GET_SETTINGS); -00763 -00769 detectorSettings getSettings(int imod=-1); -00770 -00779 detectorSettings setSettings(detectorSettings isettings, int imod=-1); -00780 -00781 -00782 // Acquisition functions -00783 -00784 -00789 int startAcquisition(); +00751 int setModule(sls_detector_module module); +00752 +00758 sls_detector_module *getModule(int imod); +00759 +00760 // calibration functions +00761 // int setCalibration(int imod, detectorSettings isettings, float gain, float offset); +00762 //int getCalibration(int imod, detectorSettings isettings, float &gain, float &offset); +00763 +00764 +00765 /* +00766 calibrated setup of the threshold +00767 */ +00773 int getThresholdEnergy(int imod=-1); +00774 +00782 int setThresholdEnergy(int e_eV, int imod=-1, detectorSettings isettings=GET_SETTINGS); +00783 +00789 detectorSettings getSettings(int imod=-1); 00790 -00795 int stopAcquisition(); -00796 -00801 int startReadOut(); -00802 -00807 int getRunStatus(); -00808 -00814 int* startAndReadAll(); -00815 -00820 int startAndReadAllNoWait(); -00821 -00827 int* getDataFromDetectorNoWait(); +00799 detectorSettings setSettings(detectorSettings isettings, int imod=-1); +00800 +00801 +00802 // Acquisition functions +00803 +00804 +00809 int startAcquisition(); +00810 +00815 int stopAcquisition(); +00816 +00821 int startReadOut(); +00822 +00827 int getRunStatus(); 00828 -00834 int* readFrame(); -00835 -00841 int* readAll(); -00842 -00843 -00849 int* popDataQueue(); -00850 -00857 int64_t setTimer(timerIndex index, int64_t t=-1); -00858 -00864 int64_t getTimeLeft(timerIndex index); -00865 -00872 int setClockDivider(int i) {cout << "not implemented any longer!"<< endl; thisDetector->clkDiv=i;return thisDetector->clkDiv;}; -00873 -00880 int getClockDivider() {return thisDetector->clkDiv;}; -00881 -00888 int setSetLength(int i) {cout << "not implemented any longer!"<< endl; thisDetector->clkDiv=i;return 3;}; -00889 -00895 int getSetLength() {return 3;}; -00896 -00897 -00898 // Flags -00906 int setDynamicRange(int n=-1); -00907 -00913 int setROI(int nroi=-1, int *xmin=NULL, int *xmax=NULL, int *ymin=NULL, int *ymax=NULL); -00914 -00915 -00921 int setReadOutFlags(readOutFlags flag); -00922 -00931 int executeTrimming(trimMode mode, int par1, int par2, int imod=-1); -00932 -00933 -00934 //Corrections -00935 -00941 int setFlatFieldCorrection(string fname=""); -00942 -00949 int getFlatFieldCorrections(float *corr=NULL, float *ecorr=NULL); -00950 -00956 int setRateCorrection(float t=0); -00957 -00958 -00964 int getRateCorrections(float &t); -00965 -00970 int getRateCorrections(); -00971 -00977 int setBadChannelCorrection(string fname=""); -00978 -00984 int getBadChannelCorrections(int *bad=NULL); -00985 -00986 -00992 int setAngularConversion(string fname=""); -00993 -01000 int getAngularConversion(int &direction, angleConversionConstant *angconv=NULL); -01001 -01005 float setGlobalOffset(float f){thisDetector->globalOffset=f; return thisDetector->globalOffset;}; -01006 -01010 float setFineOffset(float f){thisDetector->fineOffset=f; return thisDetector->fineOffset;}; -01014 float getFineOffset(){return thisDetector->fineOffset;}; -01015 -01019 float getGlobalOffset(){return thisDetector->globalOffset;}; -01020 -01027 int setPositions(int nPos, float *pos){thisDetector->numberOfPositions=nPos; for (int ip=0; ip<nPos; ip++) thisDetector->detPositions[ip]=pos[ip]; return thisDetector->numberOfPositions;}; -01033 int getPositions(float *pos=NULL){ if (pos ) {for (int ip=0; ip<thisDetector->numberOfPositions; ip++) pos[ip]=thisDetector->detPositions[ip];} return thisDetector->numberOfPositions;}; +00834 int* startAndReadAll(); +00835 +00840 int startAndReadAllNoWait(); +00841 +00847 int* getDataFromDetectorNoWait(); +00848 +00854 int* readFrame(); +00855 +00861 int* readAll(); +00862 +00863 +00869 int* popDataQueue(); +00870 +00877 int64_t setTimer(timerIndex index, int64_t t=-1); +00878 +00884 int64_t getTimeLeft(timerIndex index); +00885 +00886 +00887 +00888 +00895 int setSpeed(speedVariable sp, int value=-1); +00896 +00897 // Flags +00905 int setDynamicRange(int n=-1); +00906 +00912 int setROI(int nroi=-1, int *xmin=NULL, int *xmax=NULL, int *ymin=NULL, int *ymax=NULL); +00913 +00914 +00920 int setReadOutFlags(readOutFlags flag); +00921 +00930 int executeTrimming(trimMode mode, int par1, int par2, int imod=-1); +00931 +00932 +00933 //Corrections +00934 +00940 int setFlatFieldCorrection(string fname=""); +00941 +00948 int getFlatFieldCorrections(float *corr=NULL, float *ecorr=NULL); +00949 +00955 int setRateCorrection(float t=0); +00956 +00957 +00963 int getRateCorrections(float &t); +00964 +00969 int getRateCorrections(); +00970 +00976 int setBadChannelCorrection(string fname=""); +00977 +00983 int getBadChannelCorrections(int *bad=NULL); +00984 +00986 char *getBadChannelCorrectionFile() {return thisDetector->badChanFile;}; +00987 +00988 +00996 virtual int setAngularConversion(string fname="")=0; +00997 +01006 virtual int getAngularConversion(int &direction, angleConversionConstant *angconv=NULL)=0; +01007 +01008 +01013 virtual char *getAngularConversion()=0; +01014 +01020 virtual float setGlobalOffset(float f)=0; +01021 +01027 virtual float setFineOffset(float f)=0; +01033 virtual float getFineOffset()=0; 01034 -01035 -01037 float setBinSize(float bs) {thisDetector->binSize=bs; return thisDetector->binSize;} -01039 float getBinSize() {return thisDetector->binSize;} -01040 +01040 virtual float getGlobalOffset()=0; 01041 -01042 -01043 -01044 -01045 -01051 float* decodeData(int *datain); -01052 -01053 -01054 -01055 -01066 int flatFieldCorrect(float datain, float errin, float &dataout, float &errout, float ffcoefficient, float fferr); -01067 -01076 int flatFieldCorrect(float* datain, float *errin, float* dataout, float *errout); -01077 +01050 virtual int setPositions(int nPos, float *pos)=0; +01058 virtual int getPositions(float *pos=NULL)=0; +01059 +01060 +01067 virtual float setBinSize(float bs)=0; +01068 +01073 virtual float getBinSize()=0; +01074 +01075 +01076 +01077 01078 -01079 -01090 int rateCorrect(float datain, float errin, float &dataout, float &errout, float tau, float t); -01091 -01100 int rateCorrect(float* datain, float *errin, float* dataout, float *errout); -01101 -01102 -01110 int resetMerging(float *mp, float *mv,float *me, int *mm); -01121 int addToMerging(float *p1, float *v1, float *e1, float *mp, float *mv,float *me, int *mm); -01122 -01131 int finalizeMerging(float *mp, float *mv,float *me, int *mm); -01132 -01136 int exitServer(); -01137 -01141 void* processData(); // thread function -01146 sls_detector_module* createModule(); -01152 void deleteModule(sls_detector_module *myMod); -01153 -01154 -01155 void acquire(); -01156 -01157 private: -01158 -01162 sharedSlsDetector *thisDetector; -01163 -01167 int onlineFlag; -01168 -01172 int detId; -01173 -01177 int shmId; -01178 -01182 MySocketTCP *controlSocket; -01183 -01187 MySocketTCP *stopSocket; -01188 -01192 MySocketTCP *dataSocket; -01193 -01197 queue<int*> dataQueue; -01198 -01202 pthread_t dataProcessingThread; -01203 -01207 float currentPosition; -01208 -01212 float currentPositionIndex; -01213 -01217 float currentI0; -01218 -01219 -01220 -01222 float *mergingBins; -01223 -01225 float *mergingCounts; -01226 -01228 float *mergingErrors; +01079 +01085 float* decodeData(int *datain); +01086 +01087 +01088 +01089 +01100 int flatFieldCorrect(float datain, float errin, float &dataout, float &errout, float ffcoefficient, float fferr); +01101 +01110 int flatFieldCorrect(float* datain, float *errin, float* dataout, float *errout); +01111 +01112 +01113 +01124 int rateCorrect(float datain, float errin, float &dataout, float &errout, float tau, float t); +01125 +01134 int rateCorrect(float* datain, float *errin, float* dataout, float *errout); +01135 +01136 +01147 virtual int resetMerging(float *mp, float *mv,float *me, int *mm)=0; +01160 virtual int addToMerging(float *p1, float *v1, float *e1, float *mp, float *mv,float *me, int *mm)=0; +01161 +01171 int finalizeMerging(float *mp, float *mv,float *me, int *mm); +01172 +01176 int exitServer(); +01177 +01182 virtual void* processData()=0; // thread function +01187 sls_detector_module* createModule(); +01193 void deleteModule(sls_detector_module *myMod); +01194 +01195 +01206 virtual void acquire()=0; +01207 +01208 protected: +01209 +01213 sharedSlsDetector *thisDetector; +01214 +01218 int onlineFlag; +01219 +01223 int detId; +01224 +01228 int shmId; 01229 -01231 int *mergingMultiplicity; -01232 -01233 +01233 MySocketTCP *controlSocket; 01234 -01235 -01236 -01237 -01238 -01240 float *ffcoefficients; -01242 float *fferrors; -01244 sls_detector_module *detectorModules; -01246 float *dacs; -01248 float *adcs; -01250 int *chipregs; -01252 int *chanregs; -01254 int *badChannelMask; -01255 -01261 int* getDataFromDetector(); -01262 -01268 int initSharedMemory(detectorType type=GENERIC, int id=0); -01269 -01271 int freeSharedMemory(); -01277 int initializeDetectorSize(detectorType type); -01281 int initializeDetectorStructure(); -01285 int sendChannel(sls_detector_channel*); -01289 int sendChip(sls_detector_chip*); -01293 int sendModule(sls_detector_module*); -01297 int receiveChannel(sls_detector_channel*); -01301 int receiveChip(sls_detector_chip*); -01305 int receiveModule(sls_detector_module*); -01306 -01310 void startThread(); -01311 -01315 int fillBadChannelMask(); -01316 }; -01317 -01318 -01319 //static void* startProcessData(void *n); -01320 #endif -
    Generated on Fri Oct 9 16:01:04 2009 by  +01238 MySocketTCP *stopSocket; +01239 +01243 MySocketTCP *dataSocket; +01244 +01248 queue<int*> dataQueue; +01249 +01253 pthread_t dataProcessingThread; +01254 +01258 float currentPosition; +01259 +01263 float currentPositionIndex; +01264 +01268 float currentI0; +01269 +01270 +01271 +01273 float *mergingBins; +01274 +01276 float *mergingCounts; +01277 +01279 float *mergingErrors; +01280 +01282 int *mergingMultiplicity; +01283 +01284 +01285 +01286 +01287 +01288 +01289 +01291 float *ffcoefficients; +01293 float *fferrors; +01295 sls_detector_module *detectorModules; +01297 float *dacs; +01299 float *adcs; +01301 int *chipregs; +01303 int *chanregs; +01305 int *badChannelMask; +01306 +01312 int* getDataFromDetector(); +01313 +01319 int initSharedMemory(detectorType type=GENERIC, int id=0); +01320 +01322 int freeSharedMemory(); +01328 int initializeDetectorSize(detectorType type); +01332 int initializeDetectorStructure(); +01336 int sendChannel(sls_detector_channel*); +01340 int sendChip(sls_detector_chip*); +01344 int sendModule(sls_detector_module*); +01348 int receiveChannel(sls_detector_channel*); +01352 int receiveChip(sls_detector_chip*); +01356 int receiveModule(sls_detector_module*); +01357 +01361 void startThread(); +01362 +01366 int fillBadChannelMask(); +01367 }; +01368 +01369 +01370 //static void* startProcessData(void *n); +01371 #endif +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/slsDetector_8h.html b/slsDetectorSoftware/docs/html/slsDetector_8h.html index cea35af33..79161fa8e 100644 --- a/slsDetectorSoftware/docs/html/slsDetector_8h.html +++ b/slsDetectorSoftware/docs/html/slsDetector_8h.html @@ -118,7 +118,7 @@

    - +should be changed in order to have it separate for the different detector types

    @@ -271,7 +271,7 @@

    -


    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/sls__detector__defs_8h-source.html b/slsDetectorSoftware/docs/html/sls__detector__defs_8h-source.html index c57b7f8ac..feb88a58a 100644 --- a/slsDetectorSoftware/docs/html/sls__detector__defs_8h-source.html +++ b/slsDetectorSoftware/docs/html/sls__detector__defs_8h-source.html @@ -106,204 +106,212 @@ 00149 00153 enum { 00154 OK, -00155 FAIL -00156 }; -00157 -00161 enum { -00162 DISABLED, -00163 ENABLED -00164 }; -00165 -00169 enum externalSignalFlag { -00170 GET_EXTERNAL_SIGNAL_FLAG, -00171 SIGNAL_OFF, -00172 GATE_IN_ACTIVE_HIGH, -00173 GATE_IN_ACTIVE_LOW, -00174 TRIGGER_IN_RISING_EDGE, -00175 TRIGGER_IN_FALLING_EDGE, -00176 RO_TRIGGER_IN_RISING_EDGE, -00177 RO_TRIGGER_IN_FALLING_EDGE, -00178 GATE_OUT_ACTIVE_HIGH, -00179 GATE_OUT_ACTIVE_LOW, -00180 TRIGGER_OUT_RISING_EDGE, -00181 TRIGGER_OUT_FALLING_EDGE, -00182 RO_TRIGGER_OUT_RISING_EDGE, -00183 RO_TRIGGER_OUT_FALLING_EDGE -00184 }; -00185 -00191 enum externalCommunicationMode{ -00192 GET_EXTERNAL_COMMUNICATION_MODE, -00193 AUTO, -00194 TRIGGER_EXPOSURE, -00195 TRIGGER_READOUT, -00196 TRIGGER_COINCIDENCE_WITH_INTERNAL_ENABLE, -00197 GATE_FIX_NUMBER, -00198 GATE_FIX_DURATION, -00199 GATE_WITH_START_TRIGGER, -00200 GATE_COINCIDENCE_WITH_INTERNAL_ENABLE -00201 }; -00205 enum idMode{ -00206 MODULE_SERIAL_NUMBER, -00207 MODULE_FIRMWARE_VERSION, -00208 DETECTOR_SERIAL_NUMBER, -00209 DETECTOR_FIRMWARE_VERSION, -00210 DETECTOR_SOFTWARE_VERSION, -00211 THIS_SOFTWARE_VERSION -00212 }; -00216 enum digitalTestMode { -00217 CHIP_TEST, -00218 MODULE_FIRMWARE_TEST, -00219 DETECTOR_FIRMWARE_TEST, -00220 DETECTOR_MEMORY_TEST, -00221 DETECTOR_BUS_TEST, -00222 DETECTOR_SOFTWARE_TEST -00223 }; -00227 enum analogTestMode { -00228 CALIBRATION_PULSES, -00229 MY_ANALOG_TEST_MODE -00230 }; -00231 -00235 enum dacIndex { -00236 THRESHOLD, -00237 CALIBRATION_PULSE, -00238 TRIMBIT_SIZE, -00239 PREAMP, -00240 SHAPER1, -00241 SHAPER2, -00242 TEMPERATURE, -00243 HUMIDITY, -00244 DETECTOR_BIAS -00245 }; -00246 -00250 enum detectorSettings{ -00251 GET_SETTINGS=-1, -00252 STANDARD, -00253 FAST, -00254 HIGHGAIN, -00255 UNDEFINED, -00256 UNINITIALIZED -00257 }; -00262 enum channelRegisterBit { -00263 TRIMBIT_OFF, -00264 COMPARATOR_ENABLE=0x100, -00265 ANALOG_SIGNAL_ENABLE=0x200, -00266 CALIBRATION_ENABLE=0x300, -00267 }; -00272 enum chipRegisterBit { -00273 ENABLE_ANALOG_OUTPUT=0x1, -00274 CHIP_OUTPUT_WIDTH=0x2 -00275 }; -00279 enum moduleRegisterBit { -00280 MY_MODULE_REGISTER_BIT, -00281 MODULE_OUTPUT_WIDTH -00282 }; -00283 -00287 enum timerIndex { -00288 FRAME_NUMBER, -00289 ACQUISITION_TIME, -00290 FRAME_PERIOD, -00291 DELAY_AFTER_TRIGGER, -00292 GATES_NUMBER, -00293 PROBES_NUMBER, -00294 CYCLES_NUMBER -00295 }; -00296 -00300 enum readOutFlags { -00301 GET_READOUT_FLAGS=-1, -00302 NORMAL_READOUT=0, -00303 STORE_IN_RAM=0x1, -00304 READ_HITS=0x2, -00305 ZERO_COMPRESSION=0x4, -00306 PUMP_PROBE_MODE=0x8, -00307 BACKGROUND_CORRECTIONS=0x1000 -00308 }; -00312 enum trimMode { -00313 NOISE_TRIMMING, -00314 BEAM_TRIMMING, -00315 IMPROVE_TRIMMING, -00316 FIXEDSETTINGS_TRIMMING, -00317 OFFLINE_TRIMMING +00155 FAIL, +00156 FINISHED +00157 }; +00158 +00162 enum { +00163 DISABLED, +00164 ENABLED +00165 }; +00166 +00170 enum externalSignalFlag { +00171 GET_EXTERNAL_SIGNAL_FLAG, +00172 SIGNAL_OFF, +00173 GATE_IN_ACTIVE_HIGH, +00174 GATE_IN_ACTIVE_LOW, +00175 TRIGGER_IN_RISING_EDGE, +00176 TRIGGER_IN_FALLING_EDGE, +00177 RO_TRIGGER_IN_RISING_EDGE, +00178 RO_TRIGGER_IN_FALLING_EDGE, +00179 GATE_OUT_ACTIVE_HIGH, +00180 GATE_OUT_ACTIVE_LOW, +00181 TRIGGER_OUT_RISING_EDGE, +00182 TRIGGER_OUT_FALLING_EDGE, +00183 RO_TRIGGER_OUT_RISING_EDGE, +00184 RO_TRIGGER_OUT_FALLING_EDGE +00185 }; +00186 +00192 enum externalCommunicationMode{ +00193 GET_EXTERNAL_COMMUNICATION_MODE, +00194 AUTO, +00195 TRIGGER_EXPOSURE, +00196 TRIGGER_READOUT, +00197 TRIGGER_COINCIDENCE_WITH_INTERNAL_ENABLE, +00198 GATE_FIX_NUMBER, +00199 GATE_FIX_DURATION, +00200 GATE_WITH_START_TRIGGER, +00201 GATE_COINCIDENCE_WITH_INTERNAL_ENABLE +00202 }; +00206 enum idMode{ +00207 MODULE_SERIAL_NUMBER, +00208 MODULE_FIRMWARE_VERSION, +00209 DETECTOR_SERIAL_NUMBER, +00210 DETECTOR_FIRMWARE_VERSION, +00211 DETECTOR_SOFTWARE_VERSION, +00212 THIS_SOFTWARE_VERSION +00213 }; +00217 enum digitalTestMode { +00218 CHIP_TEST, +00219 MODULE_FIRMWARE_TEST, +00220 DETECTOR_FIRMWARE_TEST, +00221 DETECTOR_MEMORY_TEST, +00222 DETECTOR_BUS_TEST, +00223 DETECTOR_SOFTWARE_TEST +00224 }; +00228 enum analogTestMode { +00229 CALIBRATION_PULSES, +00230 MY_ANALOG_TEST_MODE +00231 }; +00232 +00236 enum dacIndex { +00237 THRESHOLD, +00238 CALIBRATION_PULSE, +00239 TRIMBIT_SIZE, +00240 PREAMP, +00241 SHAPER1, +00242 SHAPER2, +00243 TEMPERATURE, +00244 HUMIDITY, +00245 DETECTOR_BIAS +00246 }; +00247 +00251 enum detectorSettings{ +00252 GET_SETTINGS=-1, +00253 STANDARD, +00254 FAST, +00255 HIGHGAIN, +00256 UNDEFINED, +00257 UNINITIALIZED +00258 }; +00263 enum channelRegisterBit { +00264 TRIMBIT_OFF, +00265 COMPARATOR_ENABLE=0x100, +00266 ANALOG_SIGNAL_ENABLE=0x200, +00267 CALIBRATION_ENABLE=0x300, +00268 }; +00273 enum chipRegisterBit { +00274 ENABLE_ANALOG_OUTPUT=0x1, +00275 CHIP_OUTPUT_WIDTH=0x2 +00276 }; +00280 enum moduleRegisterBit { +00281 MY_MODULE_REGISTER_BIT, +00282 MODULE_OUTPUT_WIDTH +00283 }; +00284 +00288 enum timerIndex { +00289 FRAME_NUMBER, +00290 ACQUISITION_TIME, +00291 FRAME_PERIOD, +00292 DELAY_AFTER_TRIGGER, +00293 GATES_NUMBER, +00294 PROBES_NUMBER, +00295 CYCLES_NUMBER +00296 }; +00297 +00301 enum speedVariable { +00302 CLOCK_DIVIDER, +00303 WAIT_STATES, +00304 SET_SIGNAL_LENGTH +00305 }; +00306 +00310 enum readOutFlags { +00311 GET_READOUT_FLAGS=-1, +00312 NORMAL_READOUT=0, +00313 STORE_IN_RAM=0x1, +00314 READ_HITS=0x2, +00315 ZERO_COMPRESSION=0x4, +00316 PUMP_PROBE_MODE=0x8, +00317 BACKGROUND_CORRECTIONS=0x1000 00318 }; -00322 enum correctionFlags { -00323 DISCARD_BAD_CHANNELS, -00324 AVERAGE_NEIGHBOURS_FOR_BAD_CHANNELS, -00325 FLAT_FIELD_CORRECTION, -00326 RATE_CORRECTION, -00327 ANGULAR_CONVERSION, -00328 I0_NORMALIZATION -00329 }; -00330 -00339 enum { +00322 enum trimMode { +00323 NOISE_TRIMMING, +00324 BEAM_TRIMMING, +00325 IMPROVE_TRIMMING, +00326 FIXEDSETTINGS_TRIMMING, +00327 OFFLINE_TRIMMING +00328 }; +00332 enum correctionFlags { +00333 DISCARD_BAD_CHANNELS, +00334 AVERAGE_NEIGHBOURS_FOR_BAD_CHANNELS, +00335 FLAT_FIELD_CORRECTION, +00336 RATE_CORRECTION, +00337 ANGULAR_CONVERSION, +00338 I0_NORMALIZATION +00339 }; 00340 -00341 // General purpose functions -00342 F_EXEC_COMMAND, -00343 F_GET_ERROR, -00345 // configuration functions -00346 F_GET_DETECTOR_TYPE, -00347 F_SET_NUMBER_OF_MODULES, -00348 F_GET_MAX_NUMBER_OF_MODULES, -00349 F_SET_EXTERNAL_SIGNAL_FLAG, -00350 F_SET_EXTERNAL_COMMUNICATION_MODE, -00354 // Tests and identification -00355 -00356 F_GET_ID, -00357 F_DIGITAL_TEST, -00358 F_ANALOG_TEST, -00359 F_ENABLE_ANALOG_OUT, -00360 F_CALIBRATION_PULSE, -00362 // Initialization functions -00363 F_SET_DAC, -00364 F_GET_ADC, -00365 F_WRITE_REGISTER, -00366 F_READ_REGISTER, -00367 F_WRITE_MEMORY, -00368 F_READ_MEMORY, -00371 F_SET_CHANNEL, -00372 F_GET_CHANNEL, -00373 F_SET_ALL_CHANNELS, -00375 F_SET_CHIP, -00376 F_GET_CHIP, -00377 F_SET_ALL_CHIPS, -00379 F_SET_MODULE, -00380 F_GET_MODULE, -00381 F_SET_ALL_MODULES, -00384 F_SET_SETTINGS, -00385 F_GET_THRESHOLD_ENERGY, -00386 F_SET_THRESHOLD_ENERGY, -00389 // Acquisition functions -00390 F_START_ACQUISITION, -00391 F_STOP_ACQUISITION, -00392 F_START_READOUT, -00393 F_GET_RUN_STATUS, -00394 F_START_AND_READ_ALL, -00395 F_READ_FRAME, -00396 F_READ_ALL, -00398 //Acquisition setup functions -00399 F_SET_TIMER, -00400 F_GET_TIME_LEFT, -00404 F_SET_DYNAMIC_RANGE, -00405 F_SET_READOUT_FLAGS, -00406 F_SET_ROI, -00408 //Trimming -00409 F_EXECUTE_TRIMMING, -00414 F_EXIT_SERVER -00416 }; -00417 -00418 -00422 typedef struct { -00423 float center; -00424 float ecenter; -00425 float r_conversion; -00426 float er_conversion; -00427 float offset; -00428 float eoffset; -00429 float tilt; -00430 float etilt; -00431 } angleConversionConstant; -00432 -00433 -00434 #endif -
    Generated on Fri Oct 9 16:01:04 2009 by  +00349 enum { +00350 +00351 // General purpose functions +00352 F_EXEC_COMMAND, +00353 F_GET_ERROR, +00355 // configuration functions +00356 F_GET_DETECTOR_TYPE, +00357 F_SET_NUMBER_OF_MODULES, +00358 F_GET_MAX_NUMBER_OF_MODULES, +00359 F_SET_EXTERNAL_SIGNAL_FLAG, +00360 F_SET_EXTERNAL_COMMUNICATION_MODE, +00363 // Tests and identification +00364 +00365 F_GET_ID, +00366 F_DIGITAL_TEST, +00367 F_ANALOG_TEST, +00368 F_ENABLE_ANALOG_OUT, +00369 F_CALIBRATION_PULSE, +00371 // Initialization functions +00372 F_SET_DAC, +00373 F_GET_ADC, +00374 F_WRITE_REGISTER, +00375 F_READ_REGISTER, +00376 F_WRITE_MEMORY, +00377 F_READ_MEMORY, +00380 F_SET_CHANNEL, +00381 F_GET_CHANNEL, +00382 F_SET_ALL_CHANNELS, +00384 F_SET_CHIP, +00385 F_GET_CHIP, +00386 F_SET_ALL_CHIPS, +00388 F_SET_MODULE, +00389 F_GET_MODULE, +00390 F_SET_ALL_MODULES, +00393 F_SET_SETTINGS, +00394 F_GET_THRESHOLD_ENERGY, +00395 F_SET_THRESHOLD_ENERGY, +00398 // Acquisition functions +00399 F_START_ACQUISITION, +00400 F_STOP_ACQUISITION, +00401 F_START_READOUT, +00402 F_GET_RUN_STATUS, +00403 F_START_AND_READ_ALL, +00404 F_READ_FRAME, +00405 F_READ_ALL, +00407 //Acquisition setup functions +00408 F_SET_TIMER, +00409 F_GET_TIME_LEFT, +00413 F_SET_DYNAMIC_RANGE, +00414 F_SET_READOUT_FLAGS, +00415 F_SET_ROI, +00417 F_SET_SPEED, +00419 //Trimming +00420 F_EXECUTE_TRIMMING, +00425 F_EXIT_SERVER +00427 }; +00428 +00429 +00433 typedef struct { +00434 float center; +00435 float ecenter; +00436 float r_conversion; +00437 float er_conversion; +00438 float offset; +00439 float eoffset; +00440 float tilt; +00441 float etilt; +00442 } angleConversionConstant; +00443 +00444 +00445 #endif +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/sls__detector__defs_8h.html b/slsDetectorSoftware/docs/html/sls__detector__defs_8h.html index 0643a45ab..9ea7cef4f 100644 --- a/slsDetectorSoftware/docs/html/sls__detector__defs_8h.html +++ b/slsDetectorSoftware/docs/html/sls__detector__defs_8h.html @@ -77,7 +77,8 @@ } enum  { OK, -FAIL +FAIL, +FINISHED } enum  { DISABLED, @@ -198,6 +199,11 @@
    } +enum  speedVariable { CLOCK_DIVIDER, +WAIT_STATES, +SET_SIGNAL_LENGTH + } + enum  readOutFlags {
      GET_READOUT_FLAGS = -1, NORMAL_READOUT = 0, @@ -284,8 +290,10 @@
      F_SET_READOUT_FLAGS, F_SET_ROI, +F_SET_SPEED, F_EXECUTE_TRIMMING, -F_EXIT_SERVER +
    +  F_EXIT_SERVER
    } @@ -345,6 +353,8 @@ return values
    Enumerator:
    function succeeded FAIL  function failed +FINISHED  +function failed
    @@ -472,6 +482,8 @@ set/get detector dynamic range set/get readout flags F_SET_ROI  set/get region of interest +F_SET_SPEED  +set/get readout speed parameters F_EXECUTE_TRIMMING  execute trimming F_EXIT_SERVER  @@ -973,6 +985,31 @@ background corrections
  • + +

    + +

    +
    + + + + +
    enum speedVariable
    +
    +
    + +

    +important speed parameters

    Enumerator:
    + + + + +
    CLOCK_DIVIDER  +readout clock divider
    WAIT_STATES  +wait states for bus read
    SET_SIGNAL_LENGTH  +set/clear signal length
    +
    +

    @@ -1037,7 +1074,7 @@ trimming is performed offline

    -


    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/structROI-members.html b/slsDetectorSoftware/docs/html/structROI-members.html index a86a4c7c0..83b49f43f 100644 --- a/slsDetectorSoftware/docs/html/structROI-members.html +++ b/slsDetectorSoftware/docs/html/structROI-members.html @@ -24,7 +24,7 @@ xminROI ymaxROI yminROI -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/structROI.html b/slsDetectorSoftware/docs/html/structROI.html index 398eae7bb..2c4a50573 100644 --- a/slsDetectorSoftware/docs/html/structROI.html +++ b/slsDetectorSoftware/docs/html/structROI.html @@ -100,7 +100,7 @@ is the roi ymin (in channel number)


    The documentation for this struct was generated from the following file: -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/structangleConversionConstant-members.html b/slsDetectorSoftware/docs/html/structangleConversionConstant-members.html index 20438c0c6..c761c1ab6 100644 --- a/slsDetectorSoftware/docs/html/structangleConversionConstant-members.html +++ b/slsDetectorSoftware/docs/html/structangleConversionConstant-members.html @@ -28,7 +28,7 @@ offsetangleConversionConstant r_conversionangleConversionConstant tiltangleConversionConstant -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/structangleConversionConstant.html b/slsDetectorSoftware/docs/html/structangleConversionConstant.html index 6d900f96c..673889680 100644 --- a/slsDetectorSoftware/docs/html/structangleConversionConstant.html +++ b/slsDetectorSoftware/docs/html/structangleConversionConstant.html @@ -167,7 +167,7 @@ ossible tilt in the orthogonal direction (unused)


    The documentation for this struct was generated from the following file: -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/structiarray-members.html b/slsDetectorSoftware/docs/html/structiarray-members.html index e99fa9ad7..34772d766 100644 --- a/slsDetectorSoftware/docs/html/structiarray-members.html +++ b/slsDetectorSoftware/docs/html/structiarray-members.html @@ -22,7 +22,7 @@

    iarray Member List

    This is the complete list of members for iarray, including all inherited members.

    -
    iptriarray
    leniarray


    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/structiarray.html b/slsDetectorSoftware/docs/html/structiarray.html index 1d4e187e3..4d1f69c1b 100644 --- a/slsDetectorSoftware/docs/html/structiarray.html +++ b/slsDetectorSoftware/docs/html/structiarray.html @@ -65,7 +65,7 @@ is the number of elements of the array


    The documentation for this struct was generated from the following file: -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/structslsDetector_1_1sharedSlsDetector-members.html b/slsDetectorSoftware/docs/html/structslsDetector_1_1sharedSlsDetector-members.html index a0c00972d..21770f1ed 100644 --- a/slsDetectorSoftware/docs/html/structslsDetector_1_1sharedSlsDetector-members.html +++ b/slsDetectorSoftware/docs/html/structslsDetector_1_1sharedSlsDetector-members.html @@ -22,8 +22,10 @@

    slsDetector::sharedSlsDetector Member List

    This is the complete list of members for slsDetector::sharedSlsDetector, including all inherited members.

    + + @@ -70,7 +72,7 @@ -
    adcoffslsDetector::sharedSlsDetector
    alreadyExistingslsDetector::sharedSlsDetector
    angConvFileslsDetector::sharedSlsDetector
    angDirectionslsDetector::sharedSlsDetector
    angOffslsDetector::sharedSlsDetector
    badChanFileslsDetector::sharedSlsDetector
    badChansListslsDetector::sharedSlsDetector
    badFFListslsDetector::sharedSlsDetector
    binSizeslsDetector::sharedSlsDetector
    timerValueslsDetector::sharedSlsDetector
    trimDirslsDetector::sharedSlsDetector
    trimEnergiesslsDetector::sharedSlsDetector


    Generated on Fri Oct 9 16:01:05 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/structslsDetector_1_1sharedSlsDetector.html b/slsDetectorSoftware/docs/html/structslsDetector_1_1sharedSlsDetector.html index ba35a1c05..7e94b7f4a 100644 --- a/slsDetectorSoftware/docs/html/structslsDetector_1_1sharedSlsDetector.html +++ b/slsDetectorSoftware/docs/html/structslsDetector_1_1sharedSlsDetector.html @@ -81,12 +81,16 @@ int nBadChans +char badChanFile [MAX_STR_LENGTH] + int badChansList [MAX_BADCHANS] int nBadFF int badFFList [MAX_BADCHANS] +char angConvFile [MAX_STR_LENGTH] + angleConversionConstant angOff [MAXMODS] int angDirection @@ -164,6 +168,21 @@ memory offsets for the adc arrays already existing flag. If the detector does not yet exist (alreadyExisting=0) the sharedMemory will be created, otherwise it will simly be linked

    + +

    +
    + + + + +
    char slsDetector::sharedSlsDetector::angConvFile[MAX_STR_LENGTH]
    +
    +
    + +

    +file with the angular conversion factors +

    +

    @@ -193,6 +212,21 @@ angular direction (1 if it corresponds to the encoder direction i.e. channel 0 i

    array of angular conversion constants for each module

    See also:
    angleConversionConstant
    +
    +

    + +

    +
    + + + + +
    char slsDetector::sharedSlsDetector::badChanFile[MAX_STR_LENGTH]
    +
    +
    + +

    +file with the bad channels

    @@ -890,7 +924,7 @@ list of the energies at which the detector has been trimmed (unused)


    The documentation for this struct was generated from the following file: -
    Generated on Fri Oct 9 16:01:05 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/structsls__detector__channel-members.html b/slsDetectorSoftware/docs/html/structsls__detector__channel-members.html index bb3c515d6..ecd0697c4 100644 --- a/slsDetectorSoftware/docs/html/structsls__detector__channel-members.html +++ b/slsDetectorSoftware/docs/html/structsls__detector__channel-members.html @@ -24,7 +24,7 @@ chipsls_detector_channel modulesls_detector_channel regsls_detector_channel -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/structsls__detector__channel.html b/slsDetectorSoftware/docs/html/structsls__detector__channel.html index 68c0ac27a..2b56d8913 100644 --- a/slsDetectorSoftware/docs/html/structsls__detector__channel.html +++ b/slsDetectorSoftware/docs/html/structsls__detector__channel.html @@ -101,7 +101,7 @@ is the is the channel register (e.g. trimbits, calibration enable, comparator en


    The documentation for this struct was generated from the following file: -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/structsls__detector__chip-members.html b/slsDetectorSoftware/docs/html/structsls__detector__chip-members.html index e2e0771a9..f6a54f28d 100644 --- a/slsDetectorSoftware/docs/html/structsls__detector__chip-members.html +++ b/slsDetectorSoftware/docs/html/structsls__detector__chip-members.html @@ -25,7 +25,7 @@ modulesls_detector_chip nchansls_detector_chip regsls_detector_chip -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/structsls__detector__chip.html b/slsDetectorSoftware/docs/html/structsls__detector__chip.html index 6726b024c..099a08660 100644 --- a/slsDetectorSoftware/docs/html/structsls__detector__chip.html +++ b/slsDetectorSoftware/docs/html/structsls__detector__chip.html @@ -119,7 +119,7 @@ is the chip register (e.g. output analogue buffer enable)
    See


    The documentation for this struct was generated from the following file: -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/structsls__detector__module-members.html b/slsDetectorSoftware/docs/html/structsls__detector__module-members.html index 46e2695a2..0f6d99209 100644 --- a/slsDetectorSoftware/docs/html/structsls__detector__module-members.html +++ b/slsDetectorSoftware/docs/html/structsls__detector__module-members.html @@ -33,7 +33,7 @@ offsetsls_detector_module regsls_detector_module serialnumbersls_detector_module -
    Generated on Fri Oct 9 16:01:05 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/structsls__detector__module.html b/slsDetectorSoftware/docs/html/structsls__detector__module.html index aa62d8f83..8a0e64994 100644 --- a/slsDetectorSoftware/docs/html/structsls__detector__module.html +++ b/slsDetectorSoftware/docs/html/structsls__detector__module.html @@ -266,7 +266,7 @@ is the module serial number


    The documentation for this struct was generated from the following file: -
    Generated on Fri Oct 9 16:01:05 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/usersFunctions_8c.html b/slsDetectorSoftware/docs/html/usersFunctions_8c.html index b1cab6701..ff935cba6 100644 --- a/slsDetectorSoftware/docs/html/usersFunctions_8c.html +++ b/slsDetectorSoftware/docs/html/usersFunctions_8c.html @@ -197,7 +197,7 @@

    -


    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/usersFunctions_8h-source.html b/slsDetectorSoftware/docs/html/usersFunctions_8h-source.html index b94aa5169..2e8ddf18b 100644 --- a/slsDetectorSoftware/docs/html/usersFunctions_8h-source.html +++ b/slsDetectorSoftware/docs/html/usersFunctions_8h-source.html @@ -52,7 +52,7 @@ 00032 00033 00034 #endif -
    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/html/usersFunctions_8h.html b/slsDetectorSoftware/docs/html/usersFunctions_8h.html index 50409056b..0cdc90fe0 100644 --- a/slsDetectorSoftware/docs/html/usersFunctions_8h.html +++ b/slsDetectorSoftware/docs/html/usersFunctions_8h.html @@ -197,7 +197,7 @@

    -


    Generated on Fri Oct 9 16:01:04 2009 by  +
    Generated on Tue Dec 1 10:56:45 2009 by  doxygen 1.4.7
    diff --git a/slsDetectorSoftware/docs/latex/annotated.tex b/slsDetectorSoftware/docs/latex/annotated.tex index 1b7f38c77..5020f593b 100644 --- a/slsDetectorSoftware/docs/latex/annotated.tex +++ b/slsDetectorSoftware/docs/latex/annotated.tex @@ -4,7 +4,7 @@ Here are the classes, structs, unions and interfaces with brief descriptions:\be \item\contentsline{section}{\bf{eiger\-Detector} (This is class contains all eiger specific functionalities )}{\pageref{classeigerDetector}}{} \item\contentsline{section}{\bf{iarray} }{\pageref{structiarray}}{} \item\contentsline{section}{\bf{My\-Socket\-TCP} }{\pageref{classMySocketTCP}}{} -\item\contentsline{section}{\bf{mythen\-Detector} (This calss contains all mythen specific functions )}{\pageref{classmythenDetector}}{} +\item\contentsline{section}{\bf{mythen\-Detector} }{\pageref{classmythenDetector}}{} \item\contentsline{section}{\bf{ROI} }{\pageref{structROI}}{} \item\contentsline{section}{\bf{sls\_\-detector\_\-channel} }{\pageref{structsls__detector__channel}}{} \item\contentsline{section}{\bf{sls\_\-detector\_\-chip} }{\pageref{structsls__detector__chip}}{} diff --git a/slsDetectorSoftware/docs/latex/bug.tex b/slsDetectorSoftware/docs/latex/bug.tex index 33102c1d0..8ec0b4ee5 100644 --- a/slsDetectorSoftware/docs/latex/bug.tex +++ b/slsDetectorSoftware/docs/latex/bug.tex @@ -1,4 +1,4 @@ \section{Bug List}\label{bug} \label{bug__bug000001} \begin{description} -\item[Member \doxyref{sls\-Detector::get\-Chip}{p.}{classslsDetector_6dd6b42b668610dbd03a7700de84b845}(int ichip, int imod) ]probably does not return corretly! \end{description} +\item[Member \doxyref{sls\-Detector::get\-Chip}{p.}{classslsDetector_2eb7f887a72cc80d6b00cadd4731e672}(int ichip, int imod) ]probably does not return corretly! \end{description} diff --git a/slsDetectorSoftware/docs/latex/classeigerDetector.tex b/slsDetectorSoftware/docs/latex/classeigerDetector.tex index 6afa8fc5b..1d4b1eb0a 100644 --- a/slsDetectorSoftware/docs/latex/classeigerDetector.tex +++ b/slsDetectorSoftware/docs/latex/classeigerDetector.tex @@ -90,7 +90,7 @@ decode data from the detector converting them to an array of floats, one for eac Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_937d257464bade6dc6d3ab42c86843ba}.\index{eigerDetector@{eiger\-Detector}!readCalibrationFile@{readCalibrationFile}} \index{readCalibrationFile@{readCalibrationFile}!eigerDetector@{eiger\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int eiger\-Detector::read\-Calibration\-File (string {\em fname}, float \& {\em gain}, float \& {\em offset})}\label{classeigerDetector_6b1b4b5328a5d8c423e9a7a8a950028f} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int eiger\-Detector::read\-Calibration\-File (string {\em fname}, float \& {\em gain}, float \& {\em offset})\hspace{0.3cm}{\tt [virtual]}}\label{classeigerDetector_6b1b4b5328a5d8c423e9a7a8a950028f} int \doxyref{read\-Calibration\-File(string fname, float \&gain, float \&offset)}{p.}{classeigerDetector_6b1b4b5328a5d8c423e9a7a8a950028f}; @@ -104,9 +104,9 @@ int \doxyref{read\-Calibration\-File(string fname, float \&gain, float \&offset) \item[See also:]\doxyref{shared\-Sls\-Detector}{p.}{classslsDetector_2dd6bff7d94ab8005c2797152b19264e} \end{Desc} -Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_9305060e7499cfcabac23b99c884b92b}.\index{eigerDetector@{eiger\-Detector}!readDataFile@{readDataFile}} +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_6c7f837f0820b08f41649c30151cb7ac}.\index{eigerDetector@{eiger\-Detector}!readDataFile@{readDataFile}} \index{readDataFile@{readDataFile}!eigerDetector@{eiger\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int eiger\-Detector::read\-Data\-File (string {\em fname}, int $\ast$ {\em data})}\label{classeigerDetector_a6afa206101506d7f95d1ec835fbf843} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int eiger\-Detector::read\-Data\-File (string {\em fname}, int $\ast$ {\em data})\hspace{0.3cm}{\tt [virtual]}}\label{classeigerDetector_a6afa206101506d7f95d1ec835fbf843} reads a data file \begin{Desc} @@ -118,9 +118,9 @@ reads a data file \begin{Desc} \item[Returns:]OK or FAIL if it could not read the file or data=NULL \end{Desc} -Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_0d27017bc1140cc9da3e797f03848f2e}.\index{eigerDetector@{eiger\-Detector}!readDataFile@{readDataFile}} +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_4239e7a357df82640464c0f2d0a18d69}.\index{eigerDetector@{eiger\-Detector}!readDataFile@{readDataFile}} \index{readDataFile@{readDataFile}!eigerDetector@{eiger\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int eiger\-Detector::read\-Data\-File (string {\em fname}, float $\ast$ {\em data}, float $\ast$ {\em err} = {\tt NULL}, float $\ast$ {\em ang} = {\tt NULL}, char {\em dataformat} = {\tt 'f'}, int {\em nch} = {\tt 0})}\label{classeigerDetector_4d0b7da609b9a0457656bfc8cf0a7997} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int eiger\-Detector::read\-Data\-File (string {\em fname}, float $\ast$ {\em data}, float $\ast$ {\em err} = {\tt NULL}, float $\ast$ {\em ang} = {\tt NULL}, char {\em dataformat} = {\tt 'f'}, int {\em nch} = {\tt 0})\hspace{0.3cm}{\tt [virtual]}}\label{classeigerDetector_4d0b7da609b9a0457656bfc8cf0a7997} reads a data file \begin{Desc} @@ -132,9 +132,9 @@ reads a data file \begin{Desc} \item[Returns:]OK or FAIL if it could not read the file or data=NULL \end{Desc} -Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_ffd62fa6a3487693316209ea71502b4b}.\index{eigerDetector@{eiger\-Detector}!readTrimFile@{readTrimFile}} +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_86df95809e0e7979eafc04b2b868843d}.\index{eigerDetector@{eiger\-Detector}!readTrimFile@{readTrimFile}} \index{readTrimFile@{readTrimFile}!eigerDetector@{eiger\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}\bf{sls\_\-detector\_\-module}$\ast$ eiger\-Detector::read\-Trim\-File (string {\em fname}, \bf{sls\_\-detector\_\-module} $\ast$ {\em my\-Mod} = {\tt NULL})}\label{classeigerDetector_f24af0459e8eb45c1bc9c68a870e5094} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}\bf{sls\_\-detector\_\-module}$\ast$ eiger\-Detector::read\-Trim\-File (string {\em fname}, \bf{sls\_\-detector\_\-module} $\ast$ {\em my\-Mod} = {\tt NULL})\hspace{0.3cm}{\tt [virtual]}}\label{classeigerDetector_f24af0459e8eb45c1bc9c68a870e5094} reads a trim file \begin{Desc} @@ -147,9 +147,9 @@ reads a trim file \begin{Desc} \item[Returns:]the pointer to my\-Mod or NULL if reading the file failed \end{Desc} -Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_e84b8a7a2b27db3f89a98f9f8a81efca}.\index{eigerDetector@{eiger\-Detector}!writeCalibrationFile@{writeCalibrationFile}} +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_612b52469e27c6675969499d3680abe6}.\index{eigerDetector@{eiger\-Detector}!writeCalibrationFile@{writeCalibrationFile}} \index{writeCalibrationFile@{writeCalibrationFile}!eigerDetector@{eiger\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int eiger\-Detector::write\-Calibration\-File (string {\em fname}, float {\em gain}, float {\em offset})}\label{classeigerDetector_d5fbecfcc46cb151160c6011aa8e33b2} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int eiger\-Detector::write\-Calibration\-File (string {\em fname}, float {\em gain}, float {\em offset})\hspace{0.3cm}{\tt [virtual]}}\label{classeigerDetector_d5fbecfcc46cb151160c6011aa8e33b2} writes a clibration file \begin{Desc} @@ -161,9 +161,9 @@ writes a clibration file \begin{Desc} \item[See also:]\doxyref{shared\-Sls\-Detector}{p.}{classslsDetector_2dd6bff7d94ab8005c2797152b19264e} \end{Desc} -Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_8eb676a1ab6ef35601ba5cae942ba380}.\index{eigerDetector@{eiger\-Detector}!writeDataFile@{writeDataFile}} +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_d12edef440bf2b2f930e83f0ccceb01e}.\index{eigerDetector@{eiger\-Detector}!writeDataFile@{writeDataFile}} \index{writeDataFile@{writeDataFile}!eigerDetector@{eiger\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int eiger\-Detector::write\-Data\-File (string {\em fname}, int $\ast$ {\em data})}\label{classeigerDetector_68a740d5e43fcdb00c57f401666c0856} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int eiger\-Detector::write\-Data\-File (string {\em fname}, int $\ast$ {\em data})\hspace{0.3cm}{\tt [virtual]}}\label{classeigerDetector_68a740d5e43fcdb00c57f401666c0856} writes a data file \begin{Desc} @@ -175,9 +175,9 @@ writes a data file \begin{Desc} \item[Returns:]OK or FAIL if it could not write the file or data=NULL \end{Desc} -Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_3e1a8e49fbfb34a54381452abc8b5258}.\index{eigerDetector@{eiger\-Detector}!writeDataFile@{writeDataFile}} +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_efa98ca652306e2a026c9a5b2fbfe2dc}.\index{eigerDetector@{eiger\-Detector}!writeDataFile@{writeDataFile}} \index{writeDataFile@{writeDataFile}!eigerDetector@{eiger\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int eiger\-Detector::write\-Data\-File (string {\em fname}, float $\ast$ {\em data}, float $\ast$ {\em err} = {\tt NULL}, float $\ast$ {\em ang} = {\tt NULL}, char {\em dataformat} = {\tt 'f'}, int {\em nch} = {\tt -1})}\label{classeigerDetector_5ad2bf5b10d17e8c4ad7ae6e81e647e0} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int eiger\-Detector::write\-Data\-File (string {\em fname}, float $\ast$ {\em data}, float $\ast$ {\em err} = {\tt NULL}, float $\ast$ {\em ang} = {\tt NULL}, char {\em dataformat} = {\tt 'f'}, int {\em nch} = {\tt -1})\hspace{0.3cm}{\tt [virtual]}}\label{classeigerDetector_5ad2bf5b10d17e8c4ad7ae6e81e647e0} writes a data file \begin{Desc} @@ -189,9 +189,9 @@ writes a data file \begin{Desc} \item[Returns:]OK or FAIL if it could not write the file or data=NULL \end{Desc} -Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_889c060afb5693830ca2be4fc6a5442c}.\index{eigerDetector@{eiger\-Detector}!writeTrimFile@{writeTrimFile}} +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_08823d7078b5e6dd1a4cb7d8b3cfe0af}.\index{eigerDetector@{eiger\-Detector}!writeTrimFile@{writeTrimFile}} \index{writeTrimFile@{writeTrimFile}!eigerDetector@{eiger\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int eiger\-Detector::write\-Trim\-File (string {\em fname}, int {\em imod})}\label{classeigerDetector_df3a0dff0fc3111e10af0363bdd15a6a} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int eiger\-Detector::write\-Trim\-File (string {\em fname}, int {\em imod})\hspace{0.3cm}{\tt [virtual]}}\label{classeigerDetector_df3a0dff0fc3111e10af0363bdd15a6a} writes a trim file for module number imod - the values will be read from the current detector structure \begin{Desc} @@ -205,9 +205,9 @@ writes a trim file for module number imod - the values will be read from the cur \item[See also:]\doxyref{sls\_\-detector\_\-module}{p.}{structsls__detector__module} \doxyref{shared\-Sls\-Detector}{p.}{classslsDetector_2dd6bff7d94ab8005c2797152b19264e} \end{Desc} -Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_afe675432bf8e5dcb47774da3cc81106}.\index{eigerDetector@{eiger\-Detector}!writeTrimFile@{writeTrimFile}} +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_cb27a987551e66093eb201523ac8d8b0}.\index{eigerDetector@{eiger\-Detector}!writeTrimFile@{writeTrimFile}} \index{writeTrimFile@{writeTrimFile}!eigerDetector@{eiger\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int eiger\-Detector::write\-Trim\-File (string {\em fname}, \bf{sls\_\-detector\_\-module} {\em mod})}\label{classeigerDetector_8380366bf7112021c49be8e6f29f18d8} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int eiger\-Detector::write\-Trim\-File (string {\em fname}, \bf{sls\_\-detector\_\-module} {\em mod})\hspace{0.3cm}{\tt [virtual]}}\label{classeigerDetector_8380366bf7112021c49be8e6f29f18d8} writes a trim file \begin{Desc} @@ -221,7 +221,7 @@ writes a trim file \begin{Desc} \item[See also:]\doxyref{sls\_\-detector\_\-module}{p.}{structsls__detector__module} \end{Desc} -Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_9cbb1f97b8e48bd4b108a2dfa992c6af}. +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_5b97351cfaffe067016dbcebbd0778a7}. The documentation for this class was generated from the following file:\begin{CompactItemize} \item diff --git a/slsDetectorSoftware/docs/latex/classmythenDetector.tex b/slsDetectorSoftware/docs/latex/classmythenDetector.tex index 48f8d080e..92a30a722 100644 --- a/slsDetectorSoftware/docs/latex/classmythenDetector.tex +++ b/slsDetectorSoftware/docs/latex/classmythenDetector.tex @@ -1,8 +1,5 @@ \section{mythen\-Detector Class Reference} \label{classmythenDetector}\index{mythenDetector@{mythenDetector}} -This calss contains all mythen specific functions. - - {\tt \#include $<$mythen\-Detector.h$>$} Inheritance diagram for mythen\-Detector::\begin{figure}[H] @@ -14,9 +11,13 @@ Inheritance diagram for mythen\-Detector::\begin{figure}[H] \subsection*{Public Member Functions} \begin{CompactItemize} \item -\bf{mythen\-Detector} (int id=0) +int \bf{read\-Configuration\-File} (string const fname) \item -\bf{$\sim$mythen\-Detector} () +int \bf{write\-Configuration\-File} (string const fname) +\item +int \bf{dump\-Detector\-Setup} (string const fname) +\item +int \bf{retrieve\-Detector\-Setup} (string const fname) \item \bf{sls\_\-detector\_\-module} $\ast$ \bf{read\-Trim\-File} (string fname, \bf{sls\_\-detector\_\-module} $\ast$my\-Mod=NULL) \item @@ -44,6 +45,8 @@ int \bf{set\-Angular\-Conversion} (string fname=\char`\"{}\char`\"{}) \item int \bf{get\-Angular\-Conversion} (int \&direction, \bf{angle\-Conversion\-Constant} $\ast$angconv=NULL) \item +char $\ast$ \bf{get\-Angular\-Conversion} () +\item float \bf{set\-Global\-Offset} (float f) \item float \bf{set\-Fine\-Offset} (float f) @@ -60,77 +63,52 @@ float \bf{set\-Bin\-Size} (float bs) \item float \bf{get\-Bin\-Size} () \item -float $\ast$ \bf{decode\-Data} (int $\ast$datain) -\item int \bf{reset\-Merging} (float $\ast$mp, float $\ast$mv, float $\ast$me, int $\ast$mm) \item int \bf{add\-To\-Merging} (float $\ast$p1, float $\ast$v1, float $\ast$e1, float $\ast$mp, float $\ast$mv, float $\ast$me, int $\ast$mm) \item int \bf{finalize\-Merging} (float $\ast$mp, float $\ast$mv, float $\ast$me, int $\ast$mm) +\item +void $\ast$ \bf{process\-Data} () +\item +void \bf{acquire} () \end{CompactItemize} -\subsection{Detailed Description} -This calss contains all mythen specific functions. - -The \doxyref{mythen\-Detector}{p.}{classmythenDetector} class contains the functions specific to the mythen detector - -\begin{Desc} -\item[Author:]Anna Bergamaschi \end{Desc} -\begin{Desc} -\item[Version:]0.1alpha (any string) \end{Desc} - - - - -\subsection{Constructor \& Destructor Documentation} -\index{mythenDetector@{mythen\-Detector}!mythenDetector@{mythenDetector}} -\index{mythenDetector@{mythenDetector}!mythenDetector@{mythen\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}mythen\-Detector::mythen\-Detector (int {\em id} = {\tt 0})}\label{classmythenDetector_5efa6a91622e5e173d7491801f60bda0} - - -(default) constructor - -\begin{Desc} -\item[Parameters:] -\begin{description} -\item[{\em id}]is the detector index which is needed to define the shared memory id. Different physical detectors should have different IDs in order to work independently \end{description} -\end{Desc} -\index{mythenDetector@{mythen\-Detector}!~mythenDetector@{$\sim$mythenDetector}} -\index{~mythenDetector@{$\sim$mythenDetector}!mythenDetector@{mythen\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}mythen\-Detector::$\sim$mythen\-Detector ()\hspace{0.3cm}{\tt [inline]}}\label{classmythenDetector_8118166c2e7c3d3968b9ae5016614693} - - -destructor - \subsection{Member Function Documentation} -\index{mythenDetector@{mythen\-Detector}!addToMerging@{addToMerging}} +\index{mythenDetector@{mythen\-Detector}!acquire@{acquire}} +\index{acquire@{acquire}!mythenDetector@{mythen\-Detector}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}void mythen\-Detector::acquire ()\hspace{0.3cm}{\tt [virtual]}}\label{classmythenDetector_bb3d2f51a414cf9dace29a4b5676828f} + + +performs the complete acquisition and data processing moves the detector to next position \par + starts and reads the detector \par + reads the IC (if required) \par + reads the encoder (iof required for angualr conversion) \par + processes the data (flat field, rate, angular conversion and merging process\-Data()) + +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_d2ee30dfd50f06431dca4e4b9619f301}.\index{mythenDetector@{mythen\-Detector}!addToMerging@{addToMerging}} \index{addToMerging@{addToMerging}!mythenDetector@{mythen\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::add\-To\-Merging (float $\ast$ {\em p1}, float $\ast$ {\em v1}, float $\ast$ {\em e1}, float $\ast$ {\em mp}, float $\ast$ {\em mv}, float $\ast$ {\em me}, int $\ast$ {\em mm})}\label{classmythenDetector_eaaf7d7e3150f473e3bbcf59d91692c2} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::add\-To\-Merging (float $\ast$ {\em p1}, float $\ast$ {\em v1}, float $\ast$ {\em e1}, float $\ast$ {\em mp}, float $\ast$ {\em mv}, float $\ast$ {\em me}, int $\ast$ {\em mm})\hspace{0.3cm}{\tt [virtual]}}\label{classmythenDetector_eaaf7d7e3150f473e3bbcf59d91692c2} -not yet implemented merge dataset \begin{Desc} +merge dataset \begin{Desc} \item[Parameters:] \begin{description} \item[{\em p1}]angular positions of dataset \item[{\em v1}]data \item[{\em e1}]errors \item[{\em mp}]already merged postions \item[{\em mv}]already merged data \item[{\em me}]already merged errors (squared sum) \item[{\em mm}]multiplicity of merged arrays \end{description} \end{Desc} -Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_ed3ddadb246080ef644b6d1455fa2e32}.\index{mythenDetector@{mythen\-Detector}!decodeData@{decodeData}} -\index{decodeData@{decodeData}!mythenDetector@{mythen\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float$\ast$ mythen\-Detector::decode\-Data (int $\ast$ {\em datain})}\label{classmythenDetector_77e8c92003fab14da768af660509241d} +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_feb8730f24292620e5d451cd2d4bb9cd}.\index{mythenDetector@{mythen\-Detector}!dumpDetectorSetup@{dumpDetectorSetup}} +\index{dumpDetectorSetup@{dumpDetectorSetup}!mythenDetector@{mythen\-Detector}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::dump\-Detector\-Setup (string const {\em fname})\hspace{0.3cm}{\tt [virtual]}}\label{classmythenDetector_a0fe9987e8fa240a312ad353ae539188} -decode data from the detector converting them to an array of floats, one for each channle \begin{Desc} -\item[Parameters:] -\begin{description} -\item[{\em datain}]data from the detector \end{description} -\end{Desc} -\begin{Desc} -\item[Returns:]pointer to a float array with a data per channel \end{Desc} +not yet implemented +should dump to a file all the current detector parameters -Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_937d257464bade6dc6d3ab42c86843ba}.\index{mythenDetector@{mythen\-Detector}!finalizeMerging@{finalizeMerging}} +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_96428855d6e286408a52e675e045cf45}.\index{mythenDetector@{mythen\-Detector}!finalizeMerging@{finalizeMerging}} \index{finalizeMerging@{finalizeMerging}!mythenDetector@{mythen\-Detector}} \subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::finalize\-Merging (float $\ast$ {\em mp}, float $\ast$ {\em mv}, float $\ast$ {\em me}, int $\ast$ {\em mm})}\label{classmythenDetector_a919a42bd89fe21c4086bae5f1fb2f32} @@ -146,7 +124,14 @@ calculates the \char`\"{}final\char`\"{} positions, data value and errors for th Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_8f73479f68ca2171fd2108c2f157299e}.\index{mythenDetector@{mythen\-Detector}!getAngularConversion@{getAngularConversion}} \index{getAngularConversion@{getAngularConversion}!mythenDetector@{mythen\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::get\-Angular\-Conversion (int \& {\em direction}, \bf{angle\-Conversion\-Constant} $\ast$ {\em angconv} = {\tt NULL})}\label{classmythenDetector_b2b2f17c36883323ad0abf762c63494f} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}char$\ast$ mythen\-Detector::get\-Angular\-Conversion ()\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmythenDetector_fab45faa264e44178fc52300eaf92cad} + + +returns the angular conversion file + +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_0c2e502441fd74ec7fc20604c5c08c27}.\index{mythenDetector@{mythen\-Detector}!getAngularConversion@{getAngularConversion}} +\index{getAngularConversion@{getAngularConversion}!mythenDetector@{mythen\-Detector}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::get\-Angular\-Conversion (int \& {\em direction}, \bf{angle\-Conversion\-Constant} $\ast$ {\em angconv} = {\tt NULL})\hspace{0.3cm}{\tt [virtual]}}\label{classmythenDetector_b2b2f17c36883323ad0abf762c63494f} get angular conversion \begin{Desc} @@ -158,30 +143,30 @@ get angular conversion \begin{Desc} \item[Returns:]0 if angular conversion disabled, $>$0 otherwise \end{Desc} -Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_a146baee5af54b53db0997de02f4779c}.\index{mythenDetector@{mythen\-Detector}!getBinSize@{getBinSize}} +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_a110e9eb82123756cf89fda0a4cb464d}.\index{mythenDetector@{mythen\-Detector}!getBinSize@{getBinSize}} \index{getBinSize@{getBinSize}!mythenDetector@{mythen\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float mythen\-Detector::get\-Bin\-Size ()\hspace{0.3cm}{\tt [inline]}}\label{classmythenDetector_9fd4e479d7eb3f9c53d5d56a43bbccaf} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float mythen\-Detector::get\-Bin\-Size ()\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmythenDetector_9fd4e479d7eb3f9c53d5d56a43bbccaf} return detector bin size used for merging (approx angular resolution) -Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_8a78eda56f5a0c487bbc4e2f962d04db}.\index{mythenDetector@{mythen\-Detector}!getFineOffset@{getFineOffset}} +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_7d83754e3f41042caa9297da9a33b714}.\index{mythenDetector@{mythen\-Detector}!getFineOffset@{getFineOffset}} \index{getFineOffset@{getFineOffset}!mythenDetector@{mythen\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float mythen\-Detector::get\-Fine\-Offset ()\hspace{0.3cm}{\tt [inline]}}\label{classmythenDetector_00720f1445f3f301fa3316828d978de6} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float mythen\-Detector::get\-Fine\-Offset ()\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmythenDetector_00720f1445f3f301fa3316828d978de6} get detector fine offset -Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_1a402a849d04190024e9dc87d4dae6dc}.\index{mythenDetector@{mythen\-Detector}!getGlobalOffset@{getGlobalOffset}} +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_8e39680a1a096ca13ed672504b5b08e6}.\index{mythenDetector@{mythen\-Detector}!getGlobalOffset@{getGlobalOffset}} \index{getGlobalOffset@{getGlobalOffset}!mythenDetector@{mythen\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float mythen\-Detector::get\-Global\-Offset ()\hspace{0.3cm}{\tt [inline]}}\label{classmythenDetector_b2086f336d7198381453556b520dd556} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float mythen\-Detector::get\-Global\-Offset ()\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmythenDetector_b2086f336d7198381453556b520dd556} get detector global offset -Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_42f854256e2900f18b2a17201813b48c}.\index{mythenDetector@{mythen\-Detector}!getPositions@{getPositions}} +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_8964e3efa73f29b04bd9479578bd1c59}.\index{mythenDetector@{mythen\-Detector}!getPositions@{getPositions}} \index{getPositions@{getPositions}!mythenDetector@{mythen\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::get\-Positions (float $\ast$ {\em pos} = {\tt NULL})\hspace{0.3cm}{\tt [inline]}}\label{classmythenDetector_0d306720dced0d3576474978b06b4be4} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::get\-Positions (float $\ast$ {\em pos} = {\tt NULL})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmythenDetector_0d306720dced0d3576474978b06b4be4} get positions for the acquisition \begin{Desc} @@ -193,9 +178,16 @@ get positions for the acquisition \begin{Desc} \item[Returns:]number of positions \end{Desc} -Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_732f6d36456d6e87d70324a4bdc1bbb8}.\index{mythenDetector@{mythen\-Detector}!readAngularConversion@{readAngularConversion}} +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_248794801b9794d20e7d58bceab564ab}.\index{mythenDetector@{mythen\-Detector}!processData@{processData}} +\index{processData@{processData}!mythenDetector@{mythen\-Detector}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}void$\ast$ mythen\-Detector::process\-Data ()\hspace{0.3cm}{\tt [virtual]}}\label{classmythenDetector_b5416cb00251f95fc3661936c3cbb1c4} + + +function for processing data + +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_971d316af920fcb3ade98c486fe42c99}.\index{mythenDetector@{mythen\-Detector}!readAngularConversion@{readAngularConversion}} \index{readAngularConversion@{readAngularConversion}!mythenDetector@{mythen\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::read\-Angular\-Conversion (string {\em fname} = {\tt \char`\"{}\char`\"{}})}\label{classmythenDetector_33bf1b939eb877bbd4aa42f400d7ca36} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::read\-Angular\-Conversion (string {\em fname} = {\tt \char`\"{}\char`\"{}})\hspace{0.3cm}{\tt [virtual]}}\label{classmythenDetector_33bf1b939eb877bbd4aa42f400d7ca36} reads an angular conversion file \begin{Desc} @@ -207,12 +199,12 @@ reads an angular conversion file \begin{Desc} \item[See also:]\doxyref{angle\-Conversion\-Constant}{p.}{structangleConversionConstant} \end{Desc} -Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_23398787e01e519bf8ac5f313ca5af01}.\index{mythenDetector@{mythen\-Detector}!readCalibrationFile@{readCalibrationFile}} +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_cd9d6358db471600f2e1a143a53c61c1}.\index{mythenDetector@{mythen\-Detector}!readCalibrationFile@{readCalibrationFile}} \index{readCalibrationFile@{readCalibrationFile}!mythenDetector@{mythen\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::read\-Calibration\-File (string {\em fname}, float \& {\em gain}, float \& {\em offset})}\label{classmythenDetector_f8f1b7b42012420fc557aacd714140f8} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::read\-Calibration\-File (string {\em fname}, float \& {\em gain}, float \& {\em offset})\hspace{0.3cm}{\tt [virtual]}}\label{classmythenDetector_f8f1b7b42012420fc557aacd714140f8} -int \doxyref{read\-Calibration\-File(string fname, float \&gain, float \&offset)}{p.}{classmythenDetector_f8f1b7b42012420fc557aacd714140f8}; \begin{Desc} +reads a calibration file \begin{Desc} \item[Parameters:] \begin{description} \item[{\em fname}]file to be read \item[{\em gain}]reference to the gain variable reference to the offset variable \end{description} @@ -221,9 +213,16 @@ int \doxyref{read\-Calibration\-File(string fname, float \&gain, float \&offset) \item[See also:]\doxyref{shared\-Sls\-Detector}{p.}{classslsDetector_2dd6bff7d94ab8005c2797152b19264e} \end{Desc} -Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_9305060e7499cfcabac23b99c884b92b}.\index{mythenDetector@{mythen\-Detector}!readDataFile@{readDataFile}} +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_6c7f837f0820b08f41649c30151cb7ac}.\index{mythenDetector@{mythen\-Detector}!readConfigurationFile@{readConfigurationFile}} +\index{readConfigurationFile@{readConfigurationFile}!mythenDetector@{mythen\-Detector}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::read\-Configuration\-File (string const {\em fname})\hspace{0.3cm}{\tt [virtual]}}\label{classmythenDetector_92a32bcc57919fcf9eea844905640e90} + + +Purely virtual function Should be implemented in the specific detector class /sa \doxyref{mythen\-Detector::read\-Configuration\-File}{p.}{classmythenDetector_92a32bcc57919fcf9eea844905640e90} + +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_80266f80cfe49c2ccec7118de341d983}.\index{mythenDetector@{mythen\-Detector}!readDataFile@{readDataFile}} \index{readDataFile@{readDataFile}!mythenDetector@{mythen\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::read\-Data\-File (string {\em fname}, int $\ast$ {\em data})}\label{classmythenDetector_d83819d61ea01148cf18cd3c46f2a9f7} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::read\-Data\-File (string {\em fname}, int $\ast$ {\em data})\hspace{0.3cm}{\tt [virtual]}}\label{classmythenDetector_d83819d61ea01148cf18cd3c46f2a9f7} reads a data file \begin{Desc} @@ -235,9 +234,9 @@ reads a data file \begin{Desc} \item[Returns:]OK or FAIL if it could not read the file or data=NULL \end{Desc} -Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_0d27017bc1140cc9da3e797f03848f2e}.\index{mythenDetector@{mythen\-Detector}!readDataFile@{readDataFile}} +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_4239e7a357df82640464c0f2d0a18d69}.\index{mythenDetector@{mythen\-Detector}!readDataFile@{readDataFile}} \index{readDataFile@{readDataFile}!mythenDetector@{mythen\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::read\-Data\-File (string {\em fname}, float $\ast$ {\em data}, float $\ast$ {\em err} = {\tt NULL}, float $\ast$ {\em ang} = {\tt NULL}, char {\em dataformat} = {\tt 'f'}, int {\em nch} = {\tt 0})}\label{classmythenDetector_1937a5355eed0dc553cb05d2098f7c47} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::read\-Data\-File (string {\em fname}, float $\ast$ {\em data}, float $\ast$ {\em err} = {\tt NULL}, float $\ast$ {\em ang} = {\tt NULL}, char {\em dataformat} = {\tt 'f'}, int {\em nch} = {\tt 0})\hspace{0.3cm}{\tt [virtual]}}\label{classmythenDetector_1937a5355eed0dc553cb05d2098f7c47} reads a data file \begin{Desc} @@ -249,9 +248,9 @@ reads a data file \begin{Desc} \item[Returns:]OK or FAIL if it could not read the file or data=NULL \end{Desc} -Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_ffd62fa6a3487693316209ea71502b4b}.\index{mythenDetector@{mythen\-Detector}!readTrimFile@{readTrimFile}} +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_86df95809e0e7979eafc04b2b868843d}.\index{mythenDetector@{mythen\-Detector}!readTrimFile@{readTrimFile}} \index{readTrimFile@{readTrimFile}!mythenDetector@{mythen\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}\bf{sls\_\-detector\_\-module}$\ast$ mythen\-Detector::read\-Trim\-File (string {\em fname}, \bf{sls\_\-detector\_\-module} $\ast$ {\em my\-Mod} = {\tt NULL})}\label{classmythenDetector_2120f9105997fd8f8bf9165dbffc55e7} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}\bf{sls\_\-detector\_\-module}$\ast$ mythen\-Detector::read\-Trim\-File (string {\em fname}, \bf{sls\_\-detector\_\-module} $\ast$ {\em my\-Mod} = {\tt NULL})\hspace{0.3cm}{\tt [virtual]}}\label{classmythenDetector_2120f9105997fd8f8bf9165dbffc55e7} reads a trim file \begin{Desc} @@ -264,9 +263,9 @@ reads a trim file \begin{Desc} \item[Returns:]the pointer to my\-Mod or NULL if reading the file failed \end{Desc} -Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_e84b8a7a2b27db3f89a98f9f8a81efca}.\index{mythenDetector@{mythen\-Detector}!resetMerging@{resetMerging}} +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_612b52469e27c6675969499d3680abe6}.\index{mythenDetector@{mythen\-Detector}!resetMerging@{resetMerging}} \index{resetMerging@{resetMerging}!mythenDetector@{mythen\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::reset\-Merging (float $\ast$ {\em mp}, float $\ast$ {\em mv}, float $\ast$ {\em me}, int $\ast$ {\em mm})}\label{classmythenDetector_7d38c9af0d94bc15571c3c15b38f39a8} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::reset\-Merging (float $\ast$ {\em mp}, float $\ast$ {\em mv}, float $\ast$ {\em me}, int $\ast$ {\em mm})\hspace{0.3cm}{\tt [virtual]}}\label{classmythenDetector_7d38c9af0d94bc15571c3c15b38f39a8} sets the arrays of the merged data to 0. NB The array should be created with size $>$= 360./get\-Bin\-Size(); \begin{Desc} @@ -278,9 +277,18 @@ sets the arrays of the merged data to 0. NB The array should be created with siz \item[Returns:]OK or FAIL \end{Desc} -Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_208c3a5a80ba931056f1f2ff3cb5d0e5}.\index{mythenDetector@{mythen\-Detector}!setAngularConversion@{setAngularConversion}} +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_20156c620f868445e454bc4115871822}.\index{mythenDetector@{mythen\-Detector}!retrieveDetectorSetup@{retrieveDetectorSetup}} +\index{retrieveDetectorSetup@{retrieveDetectorSetup}!mythenDetector@{mythen\-Detector}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::retrieve\-Detector\-Setup (string const {\em fname})\hspace{0.3cm}{\tt [virtual]}}\label{classmythenDetector_8eedcd0b6739dd878559de5b675fae83} + + +not yet implemented + +should retrieve from a file all the current detector parameters + +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_0ec6aa8998db1bee1b00aeecbe870d5f}.\index{mythenDetector@{mythen\-Detector}!setAngularConversion@{setAngularConversion}} \index{setAngularConversion@{setAngularConversion}!mythenDetector@{mythen\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::set\-Angular\-Conversion (string {\em fname} = {\tt \char`\"{}\char`\"{}})}\label{classmythenDetector_78efe554a277de7fb8759307992fc61b} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::set\-Angular\-Conversion (string {\em fname} = {\tt \char`\"{}\char`\"{}})\hspace{0.3cm}{\tt [virtual]}}\label{classmythenDetector_78efe554a277de7fb8759307992fc61b} set angular conversion \begin{Desc} @@ -292,30 +300,30 @@ set angular conversion \begin{Desc} \item[Returns:]0 if angular conversion disabled, $>$0 otherwise \end{Desc} -Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_30fe39ddd78fa880b6b7815d1d5462ec}.\index{mythenDetector@{mythen\-Detector}!setBinSize@{setBinSize}} +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_0a17abc301de750f7dafd43b7ad8b0c9}.\index{mythenDetector@{mythen\-Detector}!setBinSize@{setBinSize}} \index{setBinSize@{setBinSize}!mythenDetector@{mythen\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float mythen\-Detector::set\-Bin\-Size (float {\em bs})\hspace{0.3cm}{\tt [inline]}}\label{classmythenDetector_8f466447f886379204a59eb6785f1ed0} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float mythen\-Detector::set\-Bin\-Size (float {\em bs})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmythenDetector_8f466447f886379204a59eb6785f1ed0} set detector bin size used for merging (approx angular resolution) -Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_96e2fb6fb0aa34bdbe59facf367c4ae1}.\index{mythenDetector@{mythen\-Detector}!setFineOffset@{setFineOffset}} +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_1a2ebbe67dae42059723071f437eb721}.\index{mythenDetector@{mythen\-Detector}!setFineOffset@{setFineOffset}} \index{setFineOffset@{setFineOffset}!mythenDetector@{mythen\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float mythen\-Detector::set\-Fine\-Offset (float {\em f})\hspace{0.3cm}{\tt [inline]}}\label{classmythenDetector_fe142e36f1a5fa8b2ab5fc45e9f8c781} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float mythen\-Detector::set\-Fine\-Offset (float {\em f})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmythenDetector_fe142e36f1a5fa8b2ab5fc45e9f8c781} set detector fine offset -Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_fd3b79c59688a7a0f4f72ba5676a2f9b}.\index{mythenDetector@{mythen\-Detector}!setGlobalOffset@{setGlobalOffset}} +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_7b3b6b3ac5b3b1ee0677f7deeec5c9e3}.\index{mythenDetector@{mythen\-Detector}!setGlobalOffset@{setGlobalOffset}} \index{setGlobalOffset@{setGlobalOffset}!mythenDetector@{mythen\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float mythen\-Detector::set\-Global\-Offset (float {\em f})\hspace{0.3cm}{\tt [inline]}}\label{classmythenDetector_e24dd88c4eb965687bd656a12bae8ad7} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float mythen\-Detector::set\-Global\-Offset (float {\em f})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmythenDetector_e24dd88c4eb965687bd656a12bae8ad7} set detector global offset -Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_84c8dc8017e692d93246cd546e6366c1}.\index{mythenDetector@{mythen\-Detector}!setPositions@{setPositions}} +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_2a03a8aec6dbf74a606e6960e178fceb}.\index{mythenDetector@{mythen\-Detector}!setPositions@{setPositions}} \index{setPositions@{setPositions}!mythenDetector@{mythen\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::set\-Positions (int {\em n\-Pos}, float $\ast$ {\em pos})\hspace{0.3cm}{\tt [inline]}}\label{classmythenDetector_1ffb0963f724e6d6d497685e6de62fd6} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::set\-Positions (int {\em n\-Pos}, float $\ast$ {\em pos})\hspace{0.3cm}{\tt [inline, virtual]}}\label{classmythenDetector_1ffb0963f724e6d6d497685e6de62fd6} set positions for the acquisition \begin{Desc} @@ -327,9 +335,9 @@ set positions for the acquisition \begin{Desc} \item[Returns:]number of positions \end{Desc} -Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_ed6493ad015660281b14814f9a7f6cb5}.\index{mythenDetector@{mythen\-Detector}!writeAngularConversion@{writeAngularConversion}} +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_961e3976e3077803e2fc245873f81d81}.\index{mythenDetector@{mythen\-Detector}!writeAngularConversion@{writeAngularConversion}} \index{writeAngularConversion@{writeAngularConversion}!mythenDetector@{mythen\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::write\-Angular\-Conversion (string {\em fname} = {\tt \char`\"{}\char`\"{}})}\label{classmythenDetector_3c5f27709351c49dd715212adc5ba7d2} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::write\-Angular\-Conversion (string {\em fname} = {\tt \char`\"{}\char`\"{}})\hspace{0.3cm}{\tt [virtual]}}\label{classmythenDetector_3c5f27709351c49dd715212adc5ba7d2} writes an angular conversion file \begin{Desc} @@ -341,9 +349,9 @@ writes an angular conversion file \begin{Desc} \item[See also:]\doxyref{angle\-Conversion\-Constant}{p.}{structangleConversionConstant} \end{Desc} -Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_921f212286be085d7e1b8d0d11110d9c}.\index{mythenDetector@{mythen\-Detector}!writeCalibrationFile@{writeCalibrationFile}} +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_cace8f0d8706a175915289d86c1fd8d6}.\index{mythenDetector@{mythen\-Detector}!writeCalibrationFile@{writeCalibrationFile}} \index{writeCalibrationFile@{writeCalibrationFile}!mythenDetector@{mythen\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::write\-Calibration\-File (string {\em fname}, float {\em gain}, float {\em offset})}\label{classmythenDetector_10e7213bb0e7138c07231687e9a6899a} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::write\-Calibration\-File (string {\em fname}, float {\em gain}, float {\em offset})\hspace{0.3cm}{\tt [virtual]}}\label{classmythenDetector_10e7213bb0e7138c07231687e9a6899a} writes a clibration file \begin{Desc} @@ -355,9 +363,18 @@ writes a clibration file \begin{Desc} \item[See also:]\doxyref{shared\-Sls\-Detector}{p.}{classslsDetector_2dd6bff7d94ab8005c2797152b19264e} \end{Desc} -Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_8eb676a1ab6ef35601ba5cae942ba380}.\index{mythenDetector@{mythen\-Detector}!writeDataFile@{writeDataFile}} +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_d12edef440bf2b2f930e83f0ccceb01e}.\index{mythenDetector@{mythen\-Detector}!writeConfigurationFile@{writeConfigurationFile}} +\index{writeConfigurationFile@{writeConfigurationFile}!mythenDetector@{mythen\-Detector}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::write\-Configuration\-File (string const {\em fname})\hspace{0.3cm}{\tt [virtual]}}\label{classmythenDetector_6ad688e0c1a59001ecc61117c67e5434} + + +Every detector should have a basic configuration file containing: type (mythen, pilatus etc.) hostname portnumber communication type (default TCP/IP) eventually secondary portnumber (e.g. mythen stop function) number of modules installed if different from the detector size (x,y) + +to be changed + +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_7801c6d43c72ce5ccaa72743a6f307d2}.\index{mythenDetector@{mythen\-Detector}!writeDataFile@{writeDataFile}} \index{writeDataFile@{writeDataFile}!mythenDetector@{mythen\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::write\-Data\-File (string {\em fname}, int $\ast$ {\em data})}\label{classmythenDetector_9a49c84d7ad664f7891b00fba0ce829a} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::write\-Data\-File (string {\em fname}, int $\ast$ {\em data})\hspace{0.3cm}{\tt [virtual]}}\label{classmythenDetector_9a49c84d7ad664f7891b00fba0ce829a} writes a data file \begin{Desc} @@ -369,9 +386,9 @@ writes a data file \begin{Desc} \item[Returns:]OK or FAIL if it could not write the file or data=NULL \end{Desc} -Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_3e1a8e49fbfb34a54381452abc8b5258}.\index{mythenDetector@{mythen\-Detector}!writeDataFile@{writeDataFile}} +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_efa98ca652306e2a026c9a5b2fbfe2dc}.\index{mythenDetector@{mythen\-Detector}!writeDataFile@{writeDataFile}} \index{writeDataFile@{writeDataFile}!mythenDetector@{mythen\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::write\-Data\-File (string {\em fname}, float $\ast$ {\em data}, float $\ast$ {\em err} = {\tt NULL}, float $\ast$ {\em ang} = {\tt NULL}, char {\em dataformat} = {\tt 'f'}, int {\em nch} = {\tt -1})}\label{classmythenDetector_42c1d320f594ebd87e2465cc986ee848} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::write\-Data\-File (string {\em fname}, float $\ast$ {\em data}, float $\ast$ {\em err} = {\tt NULL}, float $\ast$ {\em ang} = {\tt NULL}, char {\em dataformat} = {\tt 'f'}, int {\em nch} = {\tt -1})\hspace{0.3cm}{\tt [virtual]}}\label{classmythenDetector_42c1d320f594ebd87e2465cc986ee848} writes a data file \begin{Desc} @@ -383,9 +400,9 @@ writes a data file \begin{Desc} \item[Returns:]OK or FAIL if it could not write the file or data=NULL \end{Desc} -Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_889c060afb5693830ca2be4fc6a5442c}.\index{mythenDetector@{mythen\-Detector}!writeTrimFile@{writeTrimFile}} +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_08823d7078b5e6dd1a4cb7d8b3cfe0af}.\index{mythenDetector@{mythen\-Detector}!writeTrimFile@{writeTrimFile}} \index{writeTrimFile@{writeTrimFile}!mythenDetector@{mythen\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::write\-Trim\-File (string {\em fname}, int {\em imod})}\label{classmythenDetector_94179431a737bbceb20f27ca1fd30349} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::write\-Trim\-File (string {\em fname}, int {\em imod})\hspace{0.3cm}{\tt [virtual]}}\label{classmythenDetector_94179431a737bbceb20f27ca1fd30349} writes a trim file for module number imod - the values will be read from the current detector structure \begin{Desc} @@ -399,9 +416,9 @@ writes a trim file for module number imod - the values will be read from the cur \item[See also:]\doxyref{sls\_\-detector\_\-module}{p.}{structsls__detector__module} \doxyref{shared\-Sls\-Detector}{p.}{classslsDetector_2dd6bff7d94ab8005c2797152b19264e} \end{Desc} -Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_afe675432bf8e5dcb47774da3cc81106}.\index{mythenDetector@{mythen\-Detector}!writeTrimFile@{writeTrimFile}} +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_cb27a987551e66093eb201523ac8d8b0}.\index{mythenDetector@{mythen\-Detector}!writeTrimFile@{writeTrimFile}} \index{writeTrimFile@{writeTrimFile}!mythenDetector@{mythen\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::write\-Trim\-File (string {\em fname}, \bf{sls\_\-detector\_\-module} {\em mod})}\label{classmythenDetector_0b137abd78bd3d03653cd21436eb6c4d} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int mythen\-Detector::write\-Trim\-File (string {\em fname}, \bf{sls\_\-detector\_\-module} {\em mod})\hspace{0.3cm}{\tt [virtual]}}\label{classmythenDetector_0b137abd78bd3d03653cd21436eb6c4d} writes a trim file \begin{Desc} @@ -415,7 +432,7 @@ writes a trim file \begin{Desc} \item[See also:]\doxyref{sls\_\-detector\_\-module}{p.}{structsls__detector__module} \end{Desc} -Reimplemented from \bf{sls\-Detector} \doxyref{p.}{classslsDetector_9cbb1f97b8e48bd4b108a2dfa992c6af}. +Implements \bf{sls\-Detector} \doxyref{p.}{classslsDetector_5b97351cfaffe067016dbcebbd0778a7}. The documentation for this class was generated from the following file:\begin{CompactItemize} \item diff --git a/slsDetectorSoftware/docs/latex/classslsDetector.tex b/slsDetectorSoftware/docs/latex/classslsDetector.tex index ccd17b208..3efe90744 100644 --- a/slsDetectorSoftware/docs/latex/classslsDetector.tex +++ b/slsDetectorSoftware/docs/latex/classslsDetector.tex @@ -38,13 +38,13 @@ int \bf{set\-Online} (int const online) \item int \bf{exists} () \item -int \bf{read\-Configuration\-File} (string const fname) +virtual int \bf{read\-Configuration\-File} (string const fname)=0 \item -int \bf{write\-Configuration\-File} (string const fname) +virtual int \bf{write\-Configuration\-File} (string const fname)=0 \item -int \bf{dump\-Detector\-Setup} (string const fname) +virtual int \bf{dump\-Detector\-Setup} (string const fname)=0 \item -int \bf{retrieve\-Detector\-Setup} (string const fname) +virtual int \bf{retrieve\-Detector\-Setup} (string const fname)=0 \item int \bf{set\-TCPSocket} (string const name=\char`\"{}\char`\"{}, int const control\_\-port=-1, int const stop\_\-port=-1, int const data\_\-port=-1) \item @@ -60,13 +60,13 @@ char $\ast$ \bf{get\-Trim\-Dir} () \item char $\ast$ \bf{set\-Trim\-Dir} (string s) \item -int \bf{get\-Trim\-En} (int $\ast$en) +int \bf{get\-Trim\-En} (int $\ast$en=NULL) \item -\bf{sls\_\-detector\_\-module} $\ast$ \bf{read\-Trim\-File} (string fname, \bf{sls\_\-detector\_\-module} $\ast$my\-Mod=NULL) +virtual \bf{sls\_\-detector\_\-module} $\ast$ \bf{read\-Trim\-File} (string fname, \bf{sls\_\-detector\_\-module} $\ast$my\-Mod=NULL)=0 \item -int \bf{write\-Trim\-File} (string fname, \bf{sls\_\-detector\_\-module} mod) +virtual int \bf{write\-Trim\-File} (string fname, \bf{sls\_\-detector\_\-module} mod)=0 \item -int \bf{write\-Trim\-File} (string fname, int imod) +virtual int \bf{write\-Trim\-File} (string fname, int imod)=0 \item char $\ast$ \bf{set\-File\-Path} (string s) \item @@ -82,25 +82,25 @@ int \bf{get\-File\-Index} () \item string \bf{create\-File\-Name} () \item -int \bf{write\-Data\-File} (string fname, float $\ast$data, float $\ast$err=NULL, float $\ast$ang=NULL, char dataformat='f', int nch=-1) +virtual int \bf{write\-Data\-File} (string fname, float $\ast$data, float $\ast$err=NULL, float $\ast$ang=NULL, char dataformat='f', int nch=-1)=0 \item -int \bf{write\-Data\-File} (string fname, int $\ast$data) +virtual int \bf{write\-Data\-File} (string fname, int $\ast$data)=0 \item -int \bf{read\-Data\-File} (string fname, float $\ast$data, float $\ast$err=NULL, float $\ast$ang=NULL, char dataformat='f', int nch=0) +virtual int \bf{read\-Data\-File} (string fname, float $\ast$data, float $\ast$err=NULL, float $\ast$ang=NULL, char dataformat='f', int nch=0)=0 \item -int \bf{read\-Data\-File} (string fname, int $\ast$data) +virtual int \bf{read\-Data\-File} (string fname, int $\ast$data)=0 \item char $\ast$ \bf{get\-Cal\-Dir} () \item char $\ast$ \bf{set\-Cal\-Dir} (string s) \item -int \bf{read\-Calibration\-File} (string fname, float \&gain, float \&offset) +virtual int \bf{read\-Calibration\-File} (string fname, float \&gain, float \&offset)=0 \item -int \bf{write\-Calibration\-File} (string fname, float gain, float offset) +virtual int \bf{write\-Calibration\-File} (string fname, float gain, float offset)=0 \item -int \bf{read\-Angular\-Conversion} (string fname=\char`\"{}\char`\"{}) +virtual int \bf{read\-Angular\-Conversion} (string fname=\char`\"{}\char`\"{})=0 \item -int \bf{write\-Angular\-Conversion} (string fname=\char`\"{}\char`\"{}) +virtual int \bf{write\-Angular\-Conversion} (string fname=\char`\"{}\char`\"{})=0 \item int \bf{exec\-Command} (string cmd, string answer) \item @@ -188,13 +188,7 @@ int64\_\-t \bf{set\-Timer} (\bf{timer\-Index} index, int64\_\-t t=-1) \item int64\_\-t \bf{get\-Time\-Left} (\bf{timer\-Index} index) \item -int \bf{set\-Clock\-Divider} (int i) -\item -int \bf{get\-Clock\-Divider} () -\item -int \bf{set\-Set\-Length} (int i) -\item -int \bf{get\-Set\-Length} () +int \bf{set\-Speed} (\bf{speed\-Variable} sp, int value=-1) \item int \bf{set\-Dynamic\-Range} (int n=-1) \item @@ -218,25 +212,29 @@ int \bf{set\-Bad\-Channel\-Correction} (string fname=\char`\"{}\char`\"{}) \item int \bf{get\-Bad\-Channel\-Corrections} (int $\ast$bad=NULL) \item -int \bf{set\-Angular\-Conversion} (string fname=\char`\"{}\char`\"{}) +char $\ast$ \bf{get\-Bad\-Channel\-Correction\-File} () \item -int \bf{get\-Angular\-Conversion} (int \&direction, \bf{angle\-Conversion\-Constant} $\ast$angconv=NULL) +virtual int \bf{set\-Angular\-Conversion} (string fname=\char`\"{}\char`\"{})=0 \item -float \bf{set\-Global\-Offset} (float f) +virtual int \bf{get\-Angular\-Conversion} (int \&direction, \bf{angle\-Conversion\-Constant} $\ast$angconv=NULL)=0 \item -float \bf{set\-Fine\-Offset} (float f) +virtual char $\ast$ \bf{get\-Angular\-Conversion} ()=0 \item -float \bf{get\-Fine\-Offset} () +virtual float \bf{set\-Global\-Offset} (float f)=0 \item -float \bf{get\-Global\-Offset} () +virtual float \bf{set\-Fine\-Offset} (float f)=0 \item -int \bf{set\-Positions} (int n\-Pos, float $\ast$\bf{pos}) +virtual float \bf{get\-Fine\-Offset} ()=0 \item -int \bf{get\-Positions} (float $\ast$\bf{pos}=NULL) +virtual float \bf{get\-Global\-Offset} ()=0 \item -float \bf{set\-Bin\-Size} (float bs) +virtual int \bf{set\-Positions} (int n\-Pos, float $\ast$\bf{pos})=0 \item -float \bf{get\-Bin\-Size} () +virtual int \bf{get\-Positions} (float $\ast$\bf{pos}=NULL)=0 +\item +virtual float \bf{set\-Bin\-Size} (float bs)=0 +\item +virtual float \bf{get\-Bin\-Size} ()=0 \item float $\ast$ \bf{decode\-Data} (int $\ast$datain) \item @@ -248,23 +246,23 @@ int \bf{rate\-Correct} (float datain, float errin, float \&dataout, float \&erro \item int \bf{rate\-Correct} (float $\ast$datain, float $\ast$errin, float $\ast$dataout, float $\ast$errout) \item -int \bf{reset\-Merging} (float $\ast$mp, float $\ast$mv, float $\ast$me, int $\ast$mm) +virtual int \bf{reset\-Merging} (float $\ast$mp, float $\ast$mv, float $\ast$me, int $\ast$mm)=0 \item -int \bf{add\-To\-Merging} (float $\ast$p1, float $\ast$v1, float $\ast$e1, float $\ast$mp, float $\ast$mv, float $\ast$me, int $\ast$mm) +virtual int \bf{add\-To\-Merging} (float $\ast$p1, float $\ast$v1, float $\ast$e1, float $\ast$mp, float $\ast$mv, float $\ast$me, int $\ast$mm)=0 \item int \bf{finalize\-Merging} (float $\ast$mp, float $\ast$mv, float $\ast$me, int $\ast$mm) \item int \bf{exit\-Server} () \item -void $\ast$ \bf{process\-Data} () +virtual void $\ast$ \bf{process\-Data} ()=0 \item \bf{sls\_\-detector\_\-module} $\ast$ \bf{create\-Module} () \item void \bf{delete\-Module} (\bf{sls\_\-detector\_\-module} $\ast$my\-Mod) \item -void \bf{acquire} () +virtual void \bf{acquire} ()=0 \end{CompactItemize} -\subsection*{Private Member Functions} +\subsection*{Protected Member Functions} \begin{CompactItemize} \item int $\ast$ \bf{get\-Data\-From\-Detector} () @@ -293,7 +291,7 @@ void \bf{start\-Thread} () \item int \bf{fill\-Bad\-Channel\-Mask} () \end{CompactItemize} -\subsection*{Private Attributes} +\subsection*{Protected Attributes} \begin{CompactItemize} \item \bf{shared\-Sls\-Detector} $\ast$ \bf{this\-Detector} @@ -359,7 +357,7 @@ The \doxyref{sls\-Detector}{p.}{classslsDetector} class is expected to become th \begin{Desc} \item[Author:]Anna Bergamaschi \end{Desc} \begin{Desc} -\item[Version:]0.1alpha (any string) \end{Desc} +\item[Version:]0.1alpha \end{Desc} @@ -425,22 +423,32 @@ destructor \subsection{Member Function Documentation} \index{slsDetector@{sls\-Detector}!acquire@{acquire}} \index{acquire@{acquire}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}void sls\-Detector::acquire ()}\label{classslsDetector_b09a80264ca69e51b2c8379124398410} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}virtual void sls\-Detector::acquire ()\hspace{0.3cm}{\tt [pure virtual]}}\label{classslsDetector_d2ee30dfd50f06431dca4e4b9619f301} -\index{slsDetector@{sls\-Detector}!addToMerging@{addToMerging}} +pure virtual function performs the complete acquisition and data processing moves the detector to next position \par + starts and reads the detector \par + reads the IC (if required) \par + reads the encoder (iof required for angualr conversion) \par + processes the data (flat field, rate, angular conversion and merging process\-Data()) \begin{Desc} +\item[See also:]\doxyref{mythen\-Detector::acquire()}{p.}{classmythenDetector_bb3d2f51a414cf9dace29a4b5676828f} \end{Desc} + + +Implemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_bb3d2f51a414cf9dace29a4b5676828f}.\index{slsDetector@{sls\-Detector}!addToMerging@{addToMerging}} \index{addToMerging@{addToMerging}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::add\-To\-Merging (float $\ast$ {\em p1}, float $\ast$ {\em v1}, float $\ast$ {\em e1}, float $\ast$ {\em mp}, float $\ast$ {\em mv}, float $\ast$ {\em me}, int $\ast$ {\em mm})}\label{classslsDetector_ed3ddadb246080ef644b6d1455fa2e32} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}virtual int sls\-Detector::add\-To\-Merging (float $\ast$ {\em p1}, float $\ast$ {\em v1}, float $\ast$ {\em e1}, float $\ast$ {\em mp}, float $\ast$ {\em mv}, float $\ast$ {\em me}, int $\ast$ {\em mm})\hspace{0.3cm}{\tt [pure virtual]}}\label{classslsDetector_feb8730f24292620e5d451cd2d4bb9cd} -not yet implemented merge dataset \begin{Desc} +pure virtual function merge dataset \begin{Desc} \item[Parameters:] \begin{description} \item[{\em p1}]angular positions of dataset \item[{\em v1}]data \item[{\em e1}]errors \item[{\em mp}]already merged postions \item[{\em mv}]already merged data \item[{\em me}]already merged errors (squared sum) \item[{\em mm}]multiplicity of merged arrays \end{description} \end{Desc} +\begin{Desc} +\item[See also:]\doxyref{mythen\-Detector::add\-To\-Merging}{p.}{classmythenDetector_eaaf7d7e3150f473e3bbcf59d91692c2} \end{Desc} -Reimplemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_eaaf7d7e3150f473e3bbcf59d91692c2}.\index{slsDetector@{sls\-Detector}!analogTest@{analogTest}} +Implemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_eaaf7d7e3150f473e3bbcf59d91692c2}.\index{slsDetector@{sls\-Detector}!analogTest@{analogTest}} \index{analogTest@{analogTest}!slsDetector@{sls\-Detector}} \subsubsection{\setlength{\rightskip}{0pt plus 5cm}int$\ast$ sls\-Detector::analog\-Test (\bf{analog\-Test\-Mode} {\em mode})}\label{classslsDetector_18f91f8cf70d2d4eef9b3488b90bac51} @@ -465,7 +473,7 @@ in case also appends the position index Filenames will be of the form: filepath/filename(\_\-px)\_\-i where x is the position index and i is the run index \index{slsDetector@{sls\-Detector}!createModule@{createModule}} \index{createModule@{createModule}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}sls\-Detector::sls\_\-detector\_\-module $\ast$ sls\-Detector::create\-Module ()}\label{classslsDetector_15e6fa87a3c57ff1c8e1943ec72ec6ad} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}\bf{sls\_\-detector\_\-module} $\ast$ sls\-Detector::create\-Module ()}\label{classslsDetector_b1d4c6c01d1e10fe06bc83329410d4f4} Allocates the memory for a \doxyref{sls\_\-detector\_\-module}{p.}{structsls__detector__module} structure and initializes it \begin{Desc} @@ -484,7 +492,7 @@ decode data from the detector converting them to an array of floats, one for eac \item[Returns:]pointer to a float array with a data per channel \end{Desc} -Reimplemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_77e8c92003fab14da768af660509241d}, and \bf{eiger\-Detector} \doxyref{p.}{classeigerDetector_3e0573baf38c37818c7769fb351010b3}.\index{slsDetector@{sls\-Detector}!deleteModule@{deleteModule}} +Reimplemented in \bf{eiger\-Detector} \doxyref{p.}{classeigerDetector_3e0573baf38c37818c7769fb351010b3}.\index{slsDetector@{sls\-Detector}!deleteModule@{deleteModule}} \index{deleteModule@{deleteModule}!slsDetector@{sls\-Detector}} \subsubsection{\setlength{\rightskip}{0pt plus 5cm}void sls\-Detector::delete\-Module (\bf{sls\_\-detector\_\-module} $\ast$ {\em my\-Mod})}\label{classslsDetector_48984c8d058355c5249233165bf0c410} @@ -508,12 +516,12 @@ Digital test of the modules \begin{Desc} \item[Returns:]OK or error mask \end{Desc} \index{slsDetector@{sls\-Detector}!dumpDetectorSetup@{dumpDetectorSetup}} \index{dumpDetectorSetup@{dumpDetectorSetup}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::dump\-Detector\-Setup (string const {\em fname})}\label{classslsDetector_dc4f62e536b4ef6d0d2d178e3bfbec5e} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}virtual int sls\-Detector::dump\-Detector\-Setup (string const {\em fname})\hspace{0.3cm}{\tt [pure virtual]}}\label{classslsDetector_96428855d6e286408a52e675e045cf45} -not yet implemented +Purely virtual function Should be implemented in the specific detector class /sa \doxyref{mythen\-Detector::dump\-Detector\-Setup}{p.}{classmythenDetector_a0fe9987e8fa240a312ad353ae539188} -should dump to a file all the current detector parameters \index{slsDetector@{sls\-Detector}!enableAnalogOutput@{enableAnalogOutput}} +Implemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_a0fe9987e8fa240a312ad353ae539188}.\index{slsDetector@{sls\-Detector}!enableAnalogOutput@{enableAnalogOutput}} \index{enableAnalogOutput@{enableAnalogOutput}!slsDetector@{sls\-Detector}} \subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::enable\-Analog\-Output (int {\em imod}, int {\em ichip}, int {\em ichan})}\label{classslsDetector_b20fef344ee47114fccb4d1bc8c6e5bd} @@ -563,9 +571,9 @@ sets the online\-Flag \begin{Desc} \subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::exit\-Server ()}\label{classslsDetector_466e9a65aa0b404c771d70c9f01af8b9} -turns of server \index{slsDetector@{sls\-Detector}!fillBadChannelMask@{fillBadChannelMask}} +turns off server \index{slsDetector@{sls\-Detector}!fillBadChannelMask@{fillBadChannelMask}} \index{fillBadChannelMask@{fillBadChannelMask}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::fill\-Bad\-Channel\-Mask ()\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_6a0ebe013e27c065b2f67158a27f64ac} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::fill\-Bad\-Channel\-Mask ()\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_6a0ebe013e27c065b2f67158a27f64ac} fill bad channel mask (0 if channel is good, 1 if bad) \index{slsDetector@{sls\-Detector}!finalizeMerging@{finalizeMerging}} @@ -573,13 +581,15 @@ fill bad channel mask (0 if channel is good, 1 if bad) \index{slsDetector@{sls\- \subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::finalize\-Merging (float $\ast$ {\em mp}, float $\ast$ {\em mv}, float $\ast$ {\em me}, int $\ast$ {\em mm})}\label{classslsDetector_8f73479f68ca2171fd2108c2f157299e} -calculates the \char`\"{}final\char`\"{} positions, data value and errors for the emrged data \begin{Desc} +pure virtual function calculates the \char`\"{}final\char`\"{} positions, data value and errors for the emrged data \begin{Desc} \item[Parameters:] \begin{description} \item[{\em mp}]already merged postions \item[{\em mv}]already merged data \item[{\em me}]already merged errors (squared sum) \item[{\em mm}]multiplicity of merged arrays \end{description} \end{Desc} \begin{Desc} -\item[Returns:]FAIL or the \end{Desc} +\item[Returns:]FAIL or the number of non empty bins (i.e. points belonging to the pattern) \end{Desc} +\begin{Desc} +\item[See also:]\doxyref{mythen\-Detector::finalize\-Merging}{p.}{classmythenDetector_a919a42bd89fe21c4086bae5f1fb2f32} \end{Desc} Reimplemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_a919a42bd89fe21c4086bae5f1fb2f32}.\index{slsDetector@{sls\-Detector}!flatFieldCorrect@{flatFieldCorrect}} @@ -608,7 +618,7 @@ flat field correct data \begin{Desc} \item[Returns:]0 \end{Desc} \index{slsDetector@{sls\-Detector}!freeSharedMemory@{freeSharedMemory}} \index{freeSharedMemory@{freeSharedMemory}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::free\-Shared\-Memory ()\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_5de7fb0d82ae2bcc406385373e665c6f} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::free\-Shared\-Memory ()\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_5de7fb0d82ae2bcc406385373e665c6f} Frees the shared memory - should not be used \index{slsDetector@{sls\-Detector}!getADC@{getADC}} @@ -625,19 +635,35 @@ set dacs value \begin{Desc} \item[Returns:]current ADC value \end{Desc} \index{slsDetector@{sls\-Detector}!getAngularConversion@{getAngularConversion}} \index{getAngularConversion@{getAngularConversion}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::get\-Angular\-Conversion (int \& {\em direction}, \bf{angle\-Conversion\-Constant} $\ast$ {\em angconv} = {\tt NULL})}\label{classslsDetector_a146baee5af54b53db0997de02f4779c} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}virtual char$\ast$ sls\-Detector::get\-Angular\-Conversion ()\hspace{0.3cm}{\tt [pure virtual]}}\label{classslsDetector_0c2e502441fd74ec7fc20604c5c08c27} -get angular conversion \begin{Desc} +pure virtual function returns the angular conversion file \begin{Desc} +\item[See also:]\doxyref{mythen\-Detector::get\-Angular\-Conversion}{p.}{classmythenDetector_b2b2f17c36883323ad0abf762c63494f} \end{Desc} + + +Implemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_fab45faa264e44178fc52300eaf92cad}.\index{slsDetector@{sls\-Detector}!getAngularConversion@{getAngularConversion}} +\index{getAngularConversion@{getAngularConversion}!slsDetector@{sls\-Detector}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}virtual int sls\-Detector::get\-Angular\-Conversion (int \& {\em direction}, \bf{angle\-Conversion\-Constant} $\ast$ {\em angconv} = {\tt NULL})\hspace{0.3cm}{\tt [pure virtual]}}\label{classslsDetector_a110e9eb82123756cf89fda0a4cb464d} + + +pure virtual function get angular conversion \begin{Desc} \item[Parameters:] \begin{description} \item[{\em reference}]to diffractometer direction \item[{\em angconv}]array that will be filled with the angular conversion constants \end{description} \end{Desc} \begin{Desc} \item[Returns:]0 if angular conversion disabled, $>$0 otherwise \end{Desc} +\begin{Desc} +\item[See also:]\doxyref{mythen\-Detector::get\-Angular\-Conversion}{p.}{classmythenDetector_b2b2f17c36883323ad0abf762c63494f} \end{Desc} -Reimplemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_b2b2f17c36883323ad0abf762c63494f}.\index{slsDetector@{sls\-Detector}!getBadChannelCorrections@{getBadChannelCorrections}} +Implemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_b2b2f17c36883323ad0abf762c63494f}.\index{slsDetector@{sls\-Detector}!getBadChannelCorrectionFile@{getBadChannelCorrectionFile}} +\index{getBadChannelCorrectionFile@{getBadChannelCorrectionFile}!slsDetector@{sls\-Detector}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}char$\ast$ sls\-Detector::get\-Bad\-Channel\-Correction\-File ()\hspace{0.3cm}{\tt [inline]}}\label{classslsDetector_0b562f90b64c80e3eb64e9e2153bb234} + + +returns the bad channel list file \index{slsDetector@{sls\-Detector}!getBadChannelCorrections@{getBadChannelCorrections}} \index{getBadChannelCorrections@{getBadChannelCorrections}!slsDetector@{sls\-Detector}} \subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::get\-Bad\-Channel\-Corrections (int $\ast$ {\em bad} = {\tt NULL})}\label{classslsDetector_f80db913b55026bb69d35585b08729cc} @@ -651,12 +677,14 @@ get bad channels correction \begin{Desc} \item[Returns:]0 if bad channel disabled or no bad channels, $>$0 otherwise \end{Desc} \index{slsDetector@{sls\-Detector}!getBinSize@{getBinSize}} \index{getBinSize@{getBinSize}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float sls\-Detector::get\-Bin\-Size ()\hspace{0.3cm}{\tt [inline]}}\label{classslsDetector_8a78eda56f5a0c487bbc4e2f962d04db} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}virtual float sls\-Detector::get\-Bin\-Size ()\hspace{0.3cm}{\tt [pure virtual]}}\label{classslsDetector_7d83754e3f41042caa9297da9a33b714} -return detector bin size used for merging (approx angular resolution) +pure virtual function return detector bin size used for merging (approx angular resolution) \begin{Desc} +\item[See also:]\doxyref{mythen\-Detector::get\-Bin\-Size}{p.}{classmythenDetector_9fd4e479d7eb3f9c53d5d56a43bbccaf} \end{Desc} -Reimplemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_9fd4e479d7eb3f9c53d5d56a43bbccaf}.\index{slsDetector@{sls\-Detector}!getCalDir@{getCalDir}} + +Implemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_9fd4e479d7eb3f9c53d5d56a43bbccaf}.\index{slsDetector@{sls\-Detector}!getCalDir@{getCalDir}} \index{getCalDir@{getCalDir}!slsDetector@{sls\-Detector}} \subsubsection{\setlength{\rightskip}{0pt plus 5cm}char$\ast$ sls\-Detector::get\-Cal\-Dir ()\hspace{0.3cm}{\tt [inline]}}\label{classslsDetector_102679594e60ed261daff24b4aeac21a} @@ -665,7 +693,7 @@ returns the location of the calibration files \begin{Desc} \item[See also:]\doxyref{shared\-Sls\-Detector}{p.}{structslsDetector_1_1sharedSlsDetector} \end{Desc} \index{slsDetector@{sls\-Detector}!getChannel@{getChannel}} \index{getChannel@{getChannel}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}sls\-Detector::sls\_\-detector\_\-channel sls\-Detector::get\-Channel (int {\em ichan}, int {\em ichip}, int {\em imod})}\label{classslsDetector_bbf8573e249da1f0a436f581d0dc62e4} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}\bf{sls\_\-detector\_\-channel} sls\-Detector::get\-Channel (int {\em ichan}, int {\em ichip}, int {\em imod})}\label{classslsDetector_05f1a170b7416db77bf7cff762e9b58a} get channel \begin{Desc} @@ -677,7 +705,7 @@ get channel \begin{Desc} \item[Returns:]current channel structure for channel \end{Desc} \index{slsDetector@{sls\-Detector}!getChip@{getChip}} \index{getChip@{getChip}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}sls\-Detector::sls\_\-detector\_\-chip sls\-Detector::get\-Chip (int {\em ichip}, int {\em imod})}\label{classslsDetector_6dd6b42b668610dbd03a7700de84b845} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}\bf{sls\_\-detector\_\-chip} sls\-Detector::get\-Chip (int {\em ichip}, int {\em imod})}\label{classslsDetector_2eb7f887a72cc80d6b00cadd4731e672} get chip \begin{Desc} @@ -689,14 +717,7 @@ get chip \begin{Desc} \item[Returns:]current chip structure for channel\end{Desc} \begin{Desc} \item[\bf{Bug}]probably does not return corretly! \end{Desc} -\index{slsDetector@{sls\-Detector}!getClockDivider@{getClockDivider}} -\index{getClockDivider@{getClockDivider}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::get\-Clock\-Divider ()\hspace{0.3cm}{\tt [inline]}}\label{classslsDetector_12b884821edc41fe9821f2ab084a0baf} - - -get clock divider - -not implemented (should be something more general like \char`\"{}set speed including also waitstates, set cycles etc.) \index{slsDetector@{sls\-Detector}!getControlPort@{getControlPort}} +\index{slsDetector@{sls\-Detector}!getControlPort@{getControlPort}} \index{getControlPort@{getControlPort}!slsDetector@{sls\-Detector}} \subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::get\-Control\-Port ()\hspace{0.3cm}{\tt [inline]}}\label{classslsDetector_40ffd69f1c40b26575954e826cdf606a} @@ -705,7 +726,7 @@ returns the detector control port\begin{Desc} \item[See also:]\doxyref{shared\-Sls\-Detector}{p.}{structslsDetector_1_1sharedSlsDetector} \end{Desc} \index{slsDetector@{sls\-Detector}!getDataFromDetector@{getDataFromDetector}} \index{getDataFromDetector@{getDataFromDetector}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int $\ast$ sls\-Detector::get\-Data\-From\-Detector ()\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_b1982e89f8e8de63c807a707ccba594c} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int $\ast$ sls\-Detector::get\-Data\-From\-Detector ()\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_b1982e89f8e8de63c807a707ccba594c} Receives a data frame from the detector socket \begin{Desc} @@ -759,12 +780,14 @@ returns the default output files path \begin{Desc} \item[See also:]\doxyref{shared\-Sls\-Detector}{p.}{structslsDetector_1_1sharedSlsDetector} \end{Desc} \index{slsDetector@{sls\-Detector}!getFineOffset@{getFineOffset}} \index{getFineOffset@{getFineOffset}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float sls\-Detector::get\-Fine\-Offset ()\hspace{0.3cm}{\tt [inline]}}\label{classslsDetector_1a402a849d04190024e9dc87d4dae6dc} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}virtual float sls\-Detector::get\-Fine\-Offset ()\hspace{0.3cm}{\tt [pure virtual]}}\label{classslsDetector_8e39680a1a096ca13ed672504b5b08e6} -get detector fine offset +pure virtual function get detector fine offset \begin{Desc} +\item[See also:]\doxyref{mythen\-Detector::get\-Fine\-Offset}{p.}{classmythenDetector_00720f1445f3f301fa3316828d978de6} \end{Desc} -Reimplemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_00720f1445f3f301fa3316828d978de6}.\index{slsDetector@{sls\-Detector}!getFlatFieldCorrections@{getFlatFieldCorrections}} + +Implemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_00720f1445f3f301fa3316828d978de6}.\index{slsDetector@{sls\-Detector}!getFlatFieldCorrections@{getFlatFieldCorrections}} \index{getFlatFieldCorrections@{getFlatFieldCorrections}!slsDetector@{sls\-Detector}} \subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::get\-Flat\-Field\-Corrections (float $\ast$ {\em corr} = {\tt NULL}, float $\ast$ {\em ecorr} = {\tt NULL})}\label{classslsDetector_af22c79193907e364c6db97f5e55b9fd} @@ -778,12 +801,14 @@ get flat field corrections \begin{Desc} \item[Returns:]0 if ff correction disabled, $>$0 otherwise \end{Desc} \index{slsDetector@{sls\-Detector}!getGlobalOffset@{getGlobalOffset}} \index{getGlobalOffset@{getGlobalOffset}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float sls\-Detector::get\-Global\-Offset ()\hspace{0.3cm}{\tt [inline]}}\label{classslsDetector_42f854256e2900f18b2a17201813b48c} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}virtual float sls\-Detector::get\-Global\-Offset ()\hspace{0.3cm}{\tt [pure virtual]}}\label{classslsDetector_8964e3efa73f29b04bd9479578bd1c59} -get detector global offset +pure virtual function get detector global offset \begin{Desc} +\item[See also:]\doxyref{mythen\-Detector::get\-Global\-Offset}{p.}{classmythenDetector_b2086f336d7198381453556b520dd556} \end{Desc} -Reimplemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_b2086f336d7198381453556b520dd556}.\index{slsDetector@{sls\-Detector}!getHostname@{getHostname}} + +Implemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_b2086f336d7198381453556b520dd556}.\index{slsDetector@{sls\-Detector}!getHostname@{getHostname}} \index{getHostname@{getHostname}!slsDetector@{sls\-Detector}} \subsubsection{\setlength{\rightskip}{0pt plus 5cm}char$\ast$ sls\-Detector::get\-Hostname ()\hspace{0.3cm}{\tt [inline]}}\label{classslsDetector_fad06908ad59bfd8a8577899d6aa1843} @@ -816,7 +841,7 @@ get the maximum size of the detector \begin{Desc} \item[Returns:]maximum number of modules that can be installed in direction d \end{Desc} \index{slsDetector@{sls\-Detector}!getModule@{getModule}} \index{getModule@{getModule}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}sls\-Detector::sls\_\-detector\_\-module $\ast$ sls\-Detector::get\-Module (int {\em imod})}\label{classslsDetector_d1b14626e602ceaebfcf4321f6f40997} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}\bf{sls\_\-detector\_\-module} $\ast$ sls\-Detector::get\-Module (int {\em imod})}\label{classslsDetector_32557eee02e541840246b4b4a3e76c83} get module \begin{Desc} @@ -828,19 +853,21 @@ get module \begin{Desc} \item[Returns:]pointer to module structure (which has bee created and must then be deleted) \end{Desc} \index{slsDetector@{sls\-Detector}!getPositions@{getPositions}} \index{getPositions@{getPositions}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::get\-Positions (float $\ast$ {\em pos} = {\tt NULL})\hspace{0.3cm}{\tt [inline]}}\label{classslsDetector_732f6d36456d6e87d70324a4bdc1bbb8} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}virtual int sls\-Detector::get\-Positions (float $\ast$ {\em pos} = {\tt NULL})\hspace{0.3cm}{\tt [pure virtual]}}\label{classslsDetector_248794801b9794d20e7d58bceab564ab} -get positions for the acquisition \begin{Desc} +pure virtual function get positions for the acquisition \begin{Desc} \item[Parameters:] \begin{description} \item[{\em pos}]array which will contain the encoder positions \end{description} \end{Desc} \begin{Desc} \item[Returns:]number of positions \end{Desc} +\begin{Desc} +\item[See also:]\doxyref{mythen\-Detector::get\-Positions}{p.}{classmythenDetector_0d306720dced0d3576474978b06b4be4} \end{Desc} -Reimplemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_0d306720dced0d3576474978b06b4be4}.\index{slsDetector@{sls\-Detector}!getRateCorrections@{getRateCorrections}} +Implemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_0d306720dced0d3576474978b06b4be4}.\index{slsDetector@{sls\-Detector}!getRateCorrections@{getRateCorrections}} \index{getRateCorrections@{getRateCorrections}!slsDetector@{sls\-Detector}} \subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::get\-Rate\-Corrections ()}\label{classslsDetector_7606366a3cbe280c90dc659036814697} @@ -866,16 +893,9 @@ get rate correction \begin{Desc} get run status \begin{Desc} \item[Returns:]status mask \end{Desc} -\index{slsDetector@{sls\-Detector}!getSetLength@{getSetLength}} -\index{getSetLength@{getSetLength}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::get\-Set\-Length ()\hspace{0.3cm}{\tt [inline]}}\label{classslsDetector_51a88168bf9e4cd2ef7730b973963055} - - -get length cycles - -not implemented (should be something more general like \char`\"{}set speed including also waitstates, set cycles etc.) \index{slsDetector@{sls\-Detector}!getSettings@{getSettings}} +\index{slsDetector@{sls\-Detector}!getSettings@{getSettings}} \index{getSettings@{getSettings}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}\bf{sls\-Detector::detector\-Settings} sls\-Detector::get\-Settings (int {\em imod} = {\tt -1})}\label{classslsDetector_d112702360f31a967bfad9fe2aabf6f6} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}\bf{detector\-Settings} sls\-Detector::get\-Settings (int {\em imod} = {\tt -1})}\label{classslsDetector_cfccfada625943feb410c6a14607a366} get detector settings \begin{Desc} @@ -925,7 +945,7 @@ returns the detector trimbit directory\begin{Desc} \item[See also:]\doxyref{shared\-Sls\-Detector}{p.}{structslsDetector_1_1sharedSlsDetector} \end{Desc} \index{slsDetector@{sls\-Detector}!getTrimEn@{getTrimEn}} \index{getTrimEn@{getTrimEn}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::get\-Trim\-En (int $\ast$ {\em en})\hspace{0.3cm}{\tt [inline]}}\label{classslsDetector_fa24d8a0ec1393c7e27e4e558e72cf87} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::get\-Trim\-En (int $\ast$ {\em en} = {\tt NULL})\hspace{0.3cm}{\tt [inline]}}\label{classslsDetector_8862569a4a2530558914daa2e2251138} returns the number of trim energies and their value\begin{Desc} @@ -951,7 +971,7 @@ give a train of calibration pulses \begin{Desc} \end{Desc} not yet implemented \index{slsDetector@{sls\-Detector}!initializeDetectorSize@{initializeDetectorSize}} \index{initializeDetectorSize@{initializeDetectorSize}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::initialize\-Detector\-Size (\bf{detector\-Type} {\em type})\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_19f1c6d120293c98a0d2dc992e5616f8} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::initialize\-Detector\-Size (\bf{detector\-Type} {\em type})\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_19f1c6d120293c98a0d2dc992e5616f8} Initializes the this\-Detector structure \begin{Desc} @@ -987,6 +1007,8 @@ set correction mask to 0 set deat time +sets bad channel list file to none + set number of bad chans to 0 set number of bad flat field chans to 0 @@ -1009,6 +1031,8 @@ set clockdivider to 1 set number of positions to 0 +sets angular conversion file to none + set binsize calculates the memory offsets for flat field coefficients and errors, module structures, dacs, adcs, chips and channels @@ -1023,7 +1047,7 @@ fill the Bad\-Channel\-Mask \begin{Desc} \item[See also:]\doxyref{fill\-Bad\-Channel\-Mask}{p.}{classslsDetector_6a0ebe013e27c065b2f67158a27f64ac} \end{Desc} \index{slsDetector@{sls\-Detector}!initializeDetectorStructure@{initializeDetectorStructure}} \index{initializeDetectorStructure@{initializeDetectorStructure}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::initialize\-Detector\-Structure ()\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_1c39e47efe5d8794b68cb32295cddf3c} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::initialize\-Detector\-Structure ()\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_1c39e47efe5d8794b68cb32295cddf3c} Initializes the module structures in this\-Detector if the detector did not exists before @@ -1044,7 +1068,7 @@ initializes the channel registers to 0 initialize gain and offset to -1 \index{slsDetector@{sls\-Detector}!initSharedMemory@{initSharedMemory}} \index{initSharedMemory@{initSharedMemory}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::init\-Shared\-Memory (\bf{detector\-Type} {\em type} = {\tt GENERIC}, int {\em id} = {\tt 0})\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_cb94b9bfa7bbea2d9e1b0289a272bca8} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::init\-Shared\-Memory (\bf{detector\-Type} {\em type} = {\tt GENERIC}, int {\em id} = {\tt 0})\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_cb94b9bfa7bbea2d9e1b0289a272bca8} Initializes the shared memory \begin{Desc} @@ -1073,26 +1097,14 @@ pops the data from the data queue \begin{Desc} \item[See also:]\doxyref{data\-Queue}{p.}{classslsDetector_52e9fe9baf37db001cdf58f982ab5dd6} \end{Desc} \index{slsDetector@{sls\-Detector}!processData@{processData}} \index{processData@{processData}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}void $\ast$ sls\-Detector::process\-Data ()}\label{classslsDetector_717eb12630b1d1f5138f98e5f7ba021f} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}virtual void$\ast$ sls\-Detector::process\-Data ()\hspace{0.3cm}{\tt [pure virtual]}}\label{classslsDetector_971d316af920fcb3ade98c486fe42c99} -function for processing data +pure virtual function function for processing data \begin{Desc} +\item[See also:]\doxyref{mythen\-Detector::process\-Data}{p.}{classmythenDetector_b5416cb00251f95fc3661936c3cbb1c4} \end{Desc} -Pop data queue -decode data - -write raw data file - -rate correction - -flat field correction - -angular conversion - -data merging - -file writing \index{slsDetector@{sls\-Detector}!rateCorrect@{rateCorrect}} +Implemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_b5416cb00251f95fc3661936c3cbb1c4}.\index{slsDetector@{sls\-Detector}!rateCorrect@{rateCorrect}} \index{rateCorrect@{rateCorrect}!slsDetector@{sls\-Detector}} \subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::rate\-Correct (float $\ast$ {\em datain}, float $\ast$ {\em errin}, float $\ast$ {\em dataout}, float $\ast$ {\em errout})}\label{classslsDetector_518feacfa3a1d6156779f8eaacdf86d3} @@ -1127,68 +1139,72 @@ asks and receives all data from the detector and puts them in a data queue \begi \item[See also:]\doxyref{get\-Data\-From\-Detector}{p.}{classslsDetector_b1982e89f8e8de63c807a707ccba594c} \doxyref{data\-Queue}{p.}{classslsDetector_52e9fe9baf37db001cdf58f982ab5dd6} \end{Desc} \index{slsDetector@{sls\-Detector}!readAngularConversion@{readAngularConversion}} \index{readAngularConversion@{readAngularConversion}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::read\-Angular\-Conversion (string {\em fname} = {\tt \char`\"{}\char`\"{}})}\label{classslsDetector_23398787e01e519bf8ac5f313ca5af01} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}virtual int sls\-Detector::read\-Angular\-Conversion (string {\em fname} = {\tt \char`\"{}\char`\"{}})\hspace{0.3cm}{\tt [pure virtual]}}\label{classslsDetector_cd9d6358db471600f2e1a143a53c61c1} -reads an angular conversion file \begin{Desc} +Pure virtual function reads an angular conversion file \begin{Desc} \item[Parameters:] \begin{description} \item[{\em fname}]file to be read \end{description} \end{Desc} \begin{Desc} -\item[See also:]\doxyref{angle\-Conversion\-Constant}{p.}{structangleConversionConstant} \end{Desc} +\item[See also:]\doxyref{angle\-Conversion\-Constant}{p.}{structangleConversionConstant} \doxyref{mythen\-Detector::read\-Angular\-Conversion}{p.}{classmythenDetector_33bf1b939eb877bbd4aa42f400d7ca36} \end{Desc} -Reimplemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_33bf1b939eb877bbd4aa42f400d7ca36}.\index{slsDetector@{sls\-Detector}!readCalibrationFile@{readCalibrationFile}} +Implemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_33bf1b939eb877bbd4aa42f400d7ca36}.\index{slsDetector@{sls\-Detector}!readCalibrationFile@{readCalibrationFile}} \index{readCalibrationFile@{readCalibrationFile}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::read\-Calibration\-File (string {\em fname}, float \& {\em gain}, float \& {\em offset})}\label{classslsDetector_9305060e7499cfcabac23b99c884b92b} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}virtual int sls\-Detector::read\-Calibration\-File (string {\em fname}, float \& {\em gain}, float \& {\em offset})\hspace{0.3cm}{\tt [pure virtual]}}\label{classslsDetector_6c7f837f0820b08f41649c30151cb7ac} -reads a calibration file \begin{Desc} +Pure virtual function reads a calibration file \begin{Desc} \item[Parameters:] \begin{description} \item[{\em fname}]file to be read \item[{\em gain}]reference to the gain variable reference to the offset variable \end{description} \end{Desc} \begin{Desc} -\item[See also:]\doxyref{shared\-Sls\-Detector}{p.}{structslsDetector_1_1sharedSlsDetector} \end{Desc} +\item[See also:]\doxyref{shared\-Sls\-Detector}{p.}{structslsDetector_1_1sharedSlsDetector} \doxyref{mythen\-Detector::read\-Calibration\-File}{p.}{classmythenDetector_f8f1b7b42012420fc557aacd714140f8} \end{Desc} -Reimplemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_f8f1b7b42012420fc557aacd714140f8}, and \bf{eiger\-Detector} \doxyref{p.}{classeigerDetector_6b1b4b5328a5d8c423e9a7a8a950028f}.\index{slsDetector@{sls\-Detector}!readConfigurationFile@{readConfigurationFile}} +Implemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_f8f1b7b42012420fc557aacd714140f8}, and \bf{eiger\-Detector} \doxyref{p.}{classeigerDetector_6b1b4b5328a5d8c423e9a7a8a950028f}.\index{slsDetector@{sls\-Detector}!readConfigurationFile@{readConfigurationFile}} \index{readConfigurationFile@{readConfigurationFile}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::read\-Configuration\-File (string const {\em fname})}\label{classslsDetector_49c88825b21dc040269f6980e9725a3a} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}virtual int sls\-Detector::read\-Configuration\-File (string const {\em fname})\hspace{0.3cm}{\tt [pure virtual]}}\label{classslsDetector_80266f80cfe49c2ccec7118de341d983} -Every detector should have a basic configuration file containing: type (mythen, pilatus etc.) hostname portnumber communication type (default TCP/IP) eventually secondary portnumber (e.g. mythen stop function) number of modules installed if different from the detector size (x,y) +Purely virtual function Should be implemented in the specific detector class /sa \doxyref{mythen\-Detector::read\-Configuration\-File}{p.}{classmythenDetector_92a32bcc57919fcf9eea844905640e90} -to be changed \index{slsDetector@{sls\-Detector}!readDataFile@{readDataFile}} +Implemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_92a32bcc57919fcf9eea844905640e90}.\index{slsDetector@{sls\-Detector}!readDataFile@{readDataFile}} \index{readDataFile@{readDataFile}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::read\-Data\-File (string {\em fname}, int $\ast$ {\em data})}\label{classslsDetector_0d27017bc1140cc9da3e797f03848f2e} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}virtual int sls\-Detector::read\-Data\-File (string {\em fname}, int $\ast$ {\em data})\hspace{0.3cm}{\tt [pure virtual]}}\label{classslsDetector_4239e7a357df82640464c0f2d0a18d69} -reads a data file \begin{Desc} +Pure virtual function reads a data file \begin{Desc} \item[Parameters:] \begin{description} \item[{\em name}]of the file to be read \item[{\em data}]array of data values \end{description} \end{Desc} \begin{Desc} \item[Returns:]OK or FAIL if it could not read the file or data=NULL \end{Desc} +\begin{Desc} +\item[See also:]\doxyref{mythen\-Detector::read\-Data\-File}{p.}{classmythenDetector_1937a5355eed0dc553cb05d2098f7c47} \end{Desc} -Reimplemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_d83819d61ea01148cf18cd3c46f2a9f7}, and \bf{eiger\-Detector} \doxyref{p.}{classeigerDetector_a6afa206101506d7f95d1ec835fbf843}.\index{slsDetector@{sls\-Detector}!readDataFile@{readDataFile}} +Implemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_d83819d61ea01148cf18cd3c46f2a9f7}, and \bf{eiger\-Detector} \doxyref{p.}{classeigerDetector_a6afa206101506d7f95d1ec835fbf843}.\index{slsDetector@{sls\-Detector}!readDataFile@{readDataFile}} \index{readDataFile@{readDataFile}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::read\-Data\-File (string {\em fname}, float $\ast$ {\em data}, float $\ast$ {\em err} = {\tt NULL}, float $\ast$ {\em ang} = {\tt NULL}, char {\em dataformat} = {\tt 'f'}, int {\em nch} = {\tt 0})}\label{classslsDetector_ffd62fa6a3487693316209ea71502b4b} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}virtual int sls\-Detector::read\-Data\-File (string {\em fname}, float $\ast$ {\em data}, float $\ast$ {\em err} = {\tt NULL}, float $\ast$ {\em ang} = {\tt NULL}, char {\em dataformat} = {\tt 'f'}, int {\em nch} = {\tt 0})\hspace{0.3cm}{\tt [pure virtual]}}\label{classslsDetector_86df95809e0e7979eafc04b2b868843d} -reads a data file \begin{Desc} +Pure virtual function reads a data file \begin{Desc} \item[Parameters:] \begin{description} \item[{\em name}]of the file to be read \item[{\em data}]array of data values to be filled \item[{\em err}]array of arrors on the data. If NULL no errors are expected on the file\item[{\em ang}]array of angular values. If NULL data are expected in the form chan-val(-err) otherwise ang-val(-err) \item[{\em dataformat}]format of the data: can be 'i' integer or 'f' float (default) \item[{\em nch}]number of channels to be written to file. if $<$=0 defaults to the number of installed channels of the detector \end{description} \end{Desc} \begin{Desc} -\item[Returns:]OK or FAIL if it could not read the file or data=NULL \end{Desc} +\item[Returns:]OK or FAIL if it could not read the file or data=NULL\end{Desc} +\begin{Desc} +\item[See also:]\doxyref{mythen\-Detector::read\-Data\-File}{p.}{classmythenDetector_1937a5355eed0dc553cb05d2098f7c47} \end{Desc} -Reimplemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_1937a5355eed0dc553cb05d2098f7c47}, and \bf{eiger\-Detector} \doxyref{p.}{classeigerDetector_4d0b7da609b9a0457656bfc8cf0a7997}.\index{slsDetector@{sls\-Detector}!readFrame@{readFrame}} +Implemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_1937a5355eed0dc553cb05d2098f7c47}, and \bf{eiger\-Detector} \doxyref{p.}{classeigerDetector_4d0b7da609b9a0457656bfc8cf0a7997}.\index{slsDetector@{sls\-Detector}!readFrame@{readFrame}} \index{readFrame@{readFrame}!slsDetector@{sls\-Detector}} \subsubsection{\setlength{\rightskip}{0pt plus 5cm}int $\ast$ sls\-Detector::read\-Frame ()}\label{classslsDetector_b352d85c5a4f415d1ec930d17bae87fa} @@ -1211,10 +1227,10 @@ read register \begin{Desc} \item[Returns:]current register value \end{Desc} \index{slsDetector@{sls\-Detector}!readTrimFile@{readTrimFile}} \index{readTrimFile@{readTrimFile}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}\bf{sls\_\-detector\_\-module}$\ast$ sls\-Detector::read\-Trim\-File (string {\em fname}, \bf{sls\_\-detector\_\-module} $\ast$ {\em my\-Mod} = {\tt NULL})}\label{classslsDetector_e84b8a7a2b27db3f89a98f9f8a81efca} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}virtual \bf{sls\_\-detector\_\-module}$\ast$ sls\-Detector::read\-Trim\-File (string {\em fname}, \bf{sls\_\-detector\_\-module} $\ast$ {\em my\-Mod} = {\tt NULL})\hspace{0.3cm}{\tt [pure virtual]}}\label{classslsDetector_612b52469e27c6675969499d3680abe6} -reads a trim file \begin{Desc} +Pure virtual function reads a trim file \begin{Desc} \item[Parameters:] \begin{description} \item[{\em fname}]name of the file to be read \item[{\em my\-Mod}]pointer to the module structure which has to be set. \par @@ -1222,74 +1238,80 @@ reads a trim file \begin{Desc} \end{Desc} \begin{Desc} \item[Returns:]the pointer to my\-Mod or NULL if reading the file failed \end{Desc} +\begin{Desc} +\item[See also:]\doxyref{mythen\-Detector::read\-Trim\-File}{p.}{classmythenDetector_2120f9105997fd8f8bf9165dbffc55e7} \end{Desc} -Reimplemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_2120f9105997fd8f8bf9165dbffc55e7}, and \bf{eiger\-Detector} \doxyref{p.}{classeigerDetector_f24af0459e8eb45c1bc9c68a870e5094}.\index{slsDetector@{sls\-Detector}!receiveChannel@{receiveChannel}} +Implemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_2120f9105997fd8f8bf9165dbffc55e7}, and \bf{eiger\-Detector} \doxyref{p.}{classeigerDetector_f24af0459e8eb45c1bc9c68a870e5094}.\index{slsDetector@{sls\-Detector}!receiveChannel@{receiveChannel}} \index{receiveChannel@{receiveChannel}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::receive\-Channel (\bf{sls\_\-detector\_\-channel} $\ast$)\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_39f8959a55e92c7b0817529270be7667} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::receive\-Channel (\bf{sls\_\-detector\_\-channel} $\ast$)\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_39f8959a55e92c7b0817529270be7667} receive a \doxyref{sls\_\-detector\_\-channel}{p.}{structsls__detector__channel} structure over socket \index{slsDetector@{sls\-Detector}!receiveChip@{receiveChip}} \index{receiveChip@{receiveChip}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::receive\-Chip (\bf{sls\_\-detector\_\-chip} $\ast$)\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_21d070352bfbf4745543c572bd6ae8f7} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::receive\-Chip (\bf{sls\_\-detector\_\-chip} $\ast$)\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_21d070352bfbf4745543c572bd6ae8f7} receive a \doxyref{sls\_\-detector\_\-chip}{p.}{structsls__detector__chip} structure over socket \index{slsDetector@{sls\-Detector}!receiveModule@{receiveModule}} \index{receiveModule@{receiveModule}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::receive\-Module (\bf{sls\_\-detector\_\-module} $\ast$)\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_1356b4fabe6b1aaa9c67939ff9331f98} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::receive\-Module (\bf{sls\_\-detector\_\-module} $\ast$)\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_1356b4fabe6b1aaa9c67939ff9331f98} receive a \doxyref{sls\_\-detector\_\-module}{p.}{structsls__detector__module} structure over socket \index{slsDetector@{sls\-Detector}!resetMerging@{resetMerging}} \index{resetMerging@{resetMerging}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::reset\-Merging (float $\ast$ {\em mp}, float $\ast$ {\em mv}, float $\ast$ {\em me}, int $\ast$ {\em mm})}\label{classslsDetector_208c3a5a80ba931056f1f2ff3cb5d0e5} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}virtual int sls\-Detector::reset\-Merging (float $\ast$ {\em mp}, float $\ast$ {\em mv}, float $\ast$ {\em me}, int $\ast$ {\em mm})\hspace{0.3cm}{\tt [pure virtual]}}\label{classslsDetector_20156c620f868445e454bc4115871822} -sets the arrays of the merged data to 0. NB The array should be created with size $>$= 360./get\-Bin\-Size(); \begin{Desc} +pure virtual function sets the arrays of the merged data to 0. NB The array should be created with size $>$= 360./get\-Bin\-Size(); \begin{Desc} \item[Parameters:] \begin{description} \item[{\em mp}]already merged postions \item[{\em mv}]already merged data \item[{\em me}]already merged errors (squared sum) \item[{\em mm}]multiplicity of merged arrays \end{description} \end{Desc} \begin{Desc} \item[Returns:]OK or FAIL \end{Desc} +\begin{Desc} +\item[See also:]\doxyref{mythen\-Detector::reset\-Merging}{p.}{classmythenDetector_7d38c9af0d94bc15571c3c15b38f39a8} \end{Desc} -Reimplemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_7d38c9af0d94bc15571c3c15b38f39a8}.\index{slsDetector@{sls\-Detector}!retrieveDetectorSetup@{retrieveDetectorSetup}} +Implemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_7d38c9af0d94bc15571c3c15b38f39a8}.\index{slsDetector@{sls\-Detector}!retrieveDetectorSetup@{retrieveDetectorSetup}} \index{retrieveDetectorSetup@{retrieveDetectorSetup}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::retrieve\-Detector\-Setup (string const {\em fname})}\label{classslsDetector_233c3d27e9a946fb42b0aa49717d9251} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}virtual int sls\-Detector::retrieve\-Detector\-Setup (string const {\em fname})\hspace{0.3cm}{\tt [pure virtual]}}\label{classslsDetector_0ec6aa8998db1bee1b00aeecbe870d5f} -not yet implemented +Purely virtual function Should be implemented in the specific detector class /sa \doxyref{mythen\-Detector::retrieve\-Detector\-Setup}{p.}{classmythenDetector_8eedcd0b6739dd878559de5b675fae83} -should retrieve from a file all the current detector parameters \index{slsDetector@{sls\-Detector}!sendChannel@{sendChannel}} +Implemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_8eedcd0b6739dd878559de5b675fae83}.\index{slsDetector@{sls\-Detector}!sendChannel@{sendChannel}} \index{sendChannel@{sendChannel}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::send\-Channel (\bf{sls\_\-detector\_\-channel} $\ast$)\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_5cd249f9a287b25af9a3a7e7e675c559} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::send\-Channel (\bf{sls\_\-detector\_\-channel} $\ast$)\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_5cd249f9a287b25af9a3a7e7e675c559} send a \doxyref{sls\_\-detector\_\-channel}{p.}{structsls__detector__channel} structure over socket \index{slsDetector@{sls\-Detector}!sendChip@{sendChip}} \index{sendChip@{sendChip}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::send\-Chip (\bf{sls\_\-detector\_\-chip} $\ast$)\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_1e92a814b83501cdef5771c1e5c477aa} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::send\-Chip (\bf{sls\_\-detector\_\-chip} $\ast$)\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_1e92a814b83501cdef5771c1e5c477aa} send a \doxyref{sls\_\-detector\_\-chip}{p.}{structsls__detector__chip} structure over socket \index{slsDetector@{sls\-Detector}!sendModule@{sendModule}} \index{sendModule@{sendModule}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::send\-Module (\bf{sls\_\-detector\_\-module} $\ast$)\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_cc29561aa2b22ee49038c7bdf2be5ad7} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::send\-Module (\bf{sls\_\-detector\_\-module} $\ast$)\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_cc29561aa2b22ee49038c7bdf2be5ad7} send a \doxyref{sls\_\-detector\_\-module}{p.}{structsls__detector__module} structure over socket \index{slsDetector@{sls\-Detector}!setAngularConversion@{setAngularConversion}} \index{setAngularConversion@{setAngularConversion}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::set\-Angular\-Conversion (string {\em fname} = {\tt \char`\"{}\char`\"{}})}\label{classslsDetector_30fe39ddd78fa880b6b7815d1d5462ec} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}virtual int sls\-Detector::set\-Angular\-Conversion (string {\em fname} = {\tt \char`\"{}\char`\"{}})\hspace{0.3cm}{\tt [pure virtual]}}\label{classslsDetector_0a17abc301de750f7dafd43b7ad8b0c9} -set angular conversion \begin{Desc} +pure virtual function set angular conversion \begin{Desc} \item[Parameters:] \begin{description} \item[{\em fname}]file with angular conversion constants (\char`\"{}\char`\"{} disable) \end{description} \end{Desc} \begin{Desc} \item[Returns:]0 if angular conversion disabled, $>$0 otherwise \end{Desc} +\begin{Desc} +\item[See also:]\doxyref{mythen\-Detector::set\-Angular\-Conversion}{p.}{classmythenDetector_78efe554a277de7fb8759307992fc61b} \end{Desc} -Reimplemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_78efe554a277de7fb8759307992fc61b}.\index{slsDetector@{sls\-Detector}!setBadChannelCorrection@{setBadChannelCorrection}} +Implemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_78efe554a277de7fb8759307992fc61b}.\index{slsDetector@{sls\-Detector}!setBadChannelCorrection@{setBadChannelCorrection}} \index{setBadChannelCorrection@{setBadChannelCorrection}!slsDetector@{sls\-Detector}} \subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::set\-Bad\-Channel\-Correction (string {\em fname} = {\tt \char`\"{}\char`\"{}})}\label{classslsDetector_45833eb571b8cb20225f4046e2a17e5a} @@ -1303,12 +1325,21 @@ set bad channels correction \begin{Desc} \item[Returns:]0 if bad channel disabled, $>$0 otherwise \end{Desc} \index{slsDetector@{sls\-Detector}!setBinSize@{setBinSize}} \index{setBinSize@{setBinSize}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float sls\-Detector::set\-Bin\-Size (float {\em bs})\hspace{0.3cm}{\tt [inline]}}\label{classslsDetector_96e2fb6fb0aa34bdbe59facf367c4ae1} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}virtual float sls\-Detector::set\-Bin\-Size (float {\em bs})\hspace{0.3cm}{\tt [pure virtual]}}\label{classslsDetector_1a2ebbe67dae42059723071f437eb721} -set detector bin size used for merging (approx angular resolution) +pure virtual function set detector bin size used for merging (approx angular resolution) \begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em bs}]bin size in degrees \end{description} +\end{Desc} +\begin{Desc} +\item[Returns:]current bin size \end{Desc} +\begin{Desc} +\item[See also:]\doxyref{mythen\-Detector::set\-Bin\-Size}{p.}{classmythenDetector_8f466447f886379204a59eb6785f1ed0} \end{Desc} -Reimplemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_8f466447f886379204a59eb6785f1ed0}.\index{slsDetector@{sls\-Detector}!setCalDir@{setCalDir}} + +Implemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_8f466447f886379204a59eb6785f1ed0}.\index{slsDetector@{sls\-Detector}!setCalDir@{setCalDir}} \index{setCalDir@{setCalDir}!slsDetector@{sls\-Detector}} \subsubsection{\setlength{\rightskip}{0pt plus 5cm}char$\ast$ sls\-Detector::set\-Cal\-Dir (string {\em s})\hspace{0.3cm}{\tt [inline]}}\label{classslsDetector_9c4d2c796c176852537ff3cff4f5974b} @@ -1369,14 +1400,7 @@ configure chip \begin{Desc} \item[Returns:]current register value \end{Desc} \begin{Desc} \item[See also:]\doxyref{sls\_\-detector\_\-chip}{p.}{structsls__detector__chip} \end{Desc} -\index{slsDetector@{sls\-Detector}!setClockDivider@{setClockDivider}} -\index{setClockDivider@{setClockDivider}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::set\-Clock\-Divider (int {\em i})\hspace{0.3cm}{\tt [inline]}}\label{classslsDetector_49af64998d4a4d44e965eb0adb1facb2} - - -set clock divider - -not implemented (should be something more general like \char`\"{}set speed including also waitstates, set cycles etc.) \index{slsDetector@{sls\-Detector}!setDAC@{setDAC}} +\index{slsDetector@{sls\-Detector}!setDAC@{setDAC}} \index{setDAC@{setDAC}!slsDetector@{sls\-Detector}} \subsubsection{\setlength{\rightskip}{0pt plus 5cm}float sls\-Detector::set\-DAC (float {\em val}, \bf{dac\-Index} {\em index}, int {\em imod} = {\tt -1})}\label{classslsDetector_cfcce08c547e24dc09968a74e35daf40} @@ -1486,12 +1510,14 @@ sets the default output files path \begin{Desc} \item[See also:]\doxyref{shared\-Sls\-Detector}{p.}{structslsDetector_1_1sharedSlsDetector} \end{Desc} \index{slsDetector@{sls\-Detector}!setFineOffset@{setFineOffset}} \index{setFineOffset@{setFineOffset}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float sls\-Detector::set\-Fine\-Offset (float {\em f})\hspace{0.3cm}{\tt [inline]}}\label{classslsDetector_fd3b79c59688a7a0f4f72ba5676a2f9b} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}virtual float sls\-Detector::set\-Fine\-Offset (float {\em f})\hspace{0.3cm}{\tt [pure virtual]}}\label{classslsDetector_7b3b6b3ac5b3b1ee0677f7deeec5c9e3} -set detector fine offset +pure virtual function set detector fine offset \begin{Desc} +\item[See also:]\doxyref{mythen\-Detector::set\-Fine\-Offset}{p.}{classmythenDetector_fe142e36f1a5fa8b2ab5fc45e9f8c781} \end{Desc} -Reimplemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_fe142e36f1a5fa8b2ab5fc45e9f8c781}.\index{slsDetector@{sls\-Detector}!setFlatFieldCorrection@{setFlatFieldCorrection}} + +Implemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_fe142e36f1a5fa8b2ab5fc45e9f8c781}.\index{slsDetector@{sls\-Detector}!setFlatFieldCorrection@{setFlatFieldCorrection}} \index{setFlatFieldCorrection@{setFlatFieldCorrection}!slsDetector@{sls\-Detector}} \subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::set\-Flat\-Field\-Correction (string {\em fname} = {\tt \char`\"{}\char`\"{}})}\label{classslsDetector_b4e2c11303714d5e62b4fcc22f829d8f} @@ -1505,12 +1531,14 @@ set flat field corrections \begin{Desc} \item[Returns:]0 if disable (or file could not be read), $>$0 otherwise \end{Desc} \index{slsDetector@{sls\-Detector}!setGlobalOffset@{setGlobalOffset}} \index{setGlobalOffset@{setGlobalOffset}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float sls\-Detector::set\-Global\-Offset (float {\em f})\hspace{0.3cm}{\tt [inline]}}\label{classslsDetector_84c8dc8017e692d93246cd546e6366c1} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}virtual float sls\-Detector::set\-Global\-Offset (float {\em f})\hspace{0.3cm}{\tt [pure virtual]}}\label{classslsDetector_2a03a8aec6dbf74a606e6960e178fceb} -set detector global offset +pure virtual function set detector global offset \begin{Desc} +\item[See also:]\doxyref{mythen\-Detector::set\-Global\-Offset}{p.}{classmythenDetector_e24dd88c4eb965687bd656a12bae8ad7} \end{Desc} -Reimplemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_e24dd88c4eb965687bd656a12bae8ad7}.\index{slsDetector@{sls\-Detector}!setModule@{setModule}} + +Implemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_e24dd88c4eb965687bd656a12bae8ad7}.\index{slsDetector@{sls\-Detector}!setModule@{setModule}} \index{setModule@{setModule}!slsDetector@{sls\-Detector}} \subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::set\-Module (\bf{sls\_\-detector\_\-module} {\em module})}\label{classslsDetector_d659b9a8ae9a29cea616e6333e2e7be4} @@ -1565,19 +1593,21 @@ sets the online\-Flag \begin{Desc} \end{Desc} \index{slsDetector@{sls\-Detector}!setPositions@{setPositions}} \index{setPositions@{setPositions}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::set\-Positions (int {\em n\-Pos}, float $\ast$ {\em pos})\hspace{0.3cm}{\tt [inline]}}\label{classslsDetector_ed6493ad015660281b14814f9a7f6cb5} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}virtual int sls\-Detector::set\-Positions (int {\em n\-Pos}, float $\ast$ {\em pos})\hspace{0.3cm}{\tt [pure virtual]}}\label{classslsDetector_961e3976e3077803e2fc245873f81d81} -set positions for the acquisition \begin{Desc} +pure virtual function set positions for the acquisition \begin{Desc} \item[Parameters:] \begin{description} \item[{\em n\-Pos}]number of positions \item[{\em pos}]array with the encoder positions \end{description} \end{Desc} \begin{Desc} \item[Returns:]number of positions \end{Desc} +\begin{Desc} +\item[See also:]\doxyref{mythen\-Detector::set\-Positions}{p.}{classmythenDetector_1ffb0963f724e6d6d497685e6de62fd6} \end{Desc} -Reimplemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_1ffb0963f724e6d6d497685e6de62fd6}.\index{slsDetector@{sls\-Detector}!setRateCorrection@{setRateCorrection}} +Implemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_1ffb0963f724e6d6d497685e6de62fd6}.\index{slsDetector@{sls\-Detector}!setRateCorrection@{setRateCorrection}} \index{setRateCorrection@{setRateCorrection}!slsDetector@{sls\-Detector}} \subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::set\-Rate\-Correction (float {\em t} = {\tt 0})}\label{classslsDetector_c89f7fc9f9255e573e34f8d3dadf38af} @@ -1608,14 +1638,7 @@ set/get readout flags \begin{Desc} set roi -not yet implemented \index{slsDetector@{sls\-Detector}!setSetLength@{setSetLength}} -\index{setSetLength@{setSetLength}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::set\-Set\-Length (int {\em i})\hspace{0.3cm}{\tt [inline]}}\label{classslsDetector_f936cf5840bded81acb3f93b6b5fdd1c} - - -set length cycles - -not implemented (should be something more general like \char`\"{}set speed including also waitstates, set cycles etc.) \index{slsDetector@{sls\-Detector}!setSettings@{setSettings}} +not yet implemented \index{slsDetector@{sls\-Detector}!setSettings@{setSettings}} \index{setSettings@{setSettings}!slsDetector@{sls\-Detector}} \subsubsection{\setlength{\rightskip}{0pt plus 5cm}\bf{detector\-Settings} sls\-Detector::set\-Settings (\bf{detector\-Settings} {\em isettings}, int {\em imod} = {\tt -1})}\label{classslsDetector_765072d5c8aaff56ca79734072607188} @@ -1627,7 +1650,21 @@ set detector settings \begin{Desc} \end{Desc} \begin{Desc} \item[Returns:]current settings\end{Desc} -in this function trimbits and calibration files are searched in the trim\-Dir and cal\-Dir directories and the detector is initialized \index{slsDetector@{sls\-Detector}!setTCPSocket@{setTCPSocket}} +in this function trimbits and calibration files are searched in the trim\-Dir and cal\-Dir directories and the detector is initialized \index{slsDetector@{sls\-Detector}!setSpeed@{setSpeed}} +\index{setSpeed@{setSpeed}!slsDetector@{sls\-Detector}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::set\-Speed (\bf{speed\-Variable} {\em sp}, int {\em value} = {\tt -1})}\label{classslsDetector_8e35d9440a03e127ef5fe7a909702675} + + +sets/gets the value of important readout speed parameters \begin{Desc} +\item[Parameters:] +\begin{description} +\item[{\em sp}]is the parameter to be set/get \item[{\em value}]is the value to be set, if -1 get value \end{description} +\end{Desc} +\begin{Desc} +\item[Returns:]current value for the specified parameter \end{Desc} +\begin{Desc} +\item[See also:]\doxyref{speed\-Variable}{p.}{sls__detector__defs_8h_8c326f6a87754392b72098d3d0dec49d} \end{Desc} +\index{slsDetector@{sls\-Detector}!setTCPSocket@{setTCPSocket}} \index{setTCPSocket@{setTCPSocket}!slsDetector@{sls\-Detector}} \subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::set\-TCPSocket (string const {\em name} = {\tt \char`\"{}\char`\"{}}, int const {\em control\_\-port} = {\tt -1}, int const {\em stop\_\-port} = {\tt -1}, int const {\em data\_\-port} = {\tt -1})}\label{classslsDetector_019a01c4465c5ee572293cb6c00d9904} @@ -1704,7 +1741,7 @@ start readout (without exposure or interrupting exposure) \begin{Desc} \item[Returns:]OK/FAIL \end{Desc} \index{slsDetector@{sls\-Detector}!startThread@{startThread}} \index{startThread@{startThread}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}void sls\-Detector::start\-Thread ()\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_58199d3393aa7eaa606cbb7cbf83469d} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}void sls\-Detector::start\-Thread ()\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_58199d3393aa7eaa606cbb7cbf83469d} start data processing threas \index{slsDetector@{sls\-Detector}!stopAcquisition@{stopAcquisition}} @@ -1716,68 +1753,72 @@ stop detector acquisition \begin{Desc} \item[Returns:]OK/FAIL \end{Desc} \index{slsDetector@{sls\-Detector}!writeAngularConversion@{writeAngularConversion}} \index{writeAngularConversion@{writeAngularConversion}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::write\-Angular\-Conversion (string {\em fname} = {\tt \char`\"{}\char`\"{}})}\label{classslsDetector_921f212286be085d7e1b8d0d11110d9c} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}virtual int sls\-Detector::write\-Angular\-Conversion (string {\em fname} = {\tt \char`\"{}\char`\"{}})\hspace{0.3cm}{\tt [pure virtual]}}\label{classslsDetector_cace8f0d8706a175915289d86c1fd8d6} -writes an angular conversion file \begin{Desc} +Pure virtual function writes an angular conversion file \begin{Desc} \item[Parameters:] \begin{description} \item[{\em fname}]file to be written \end{description} \end{Desc} \begin{Desc} -\item[See also:]\doxyref{angle\-Conversion\-Constant}{p.}{structangleConversionConstant} \end{Desc} +\item[See also:]\doxyref{angle\-Conversion\-Constant}{p.}{structangleConversionConstant} \doxyref{mythen\-Detector::write\-Angular\-Conversion}{p.}{classmythenDetector_3c5f27709351c49dd715212adc5ba7d2} \end{Desc} -Reimplemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_3c5f27709351c49dd715212adc5ba7d2}.\index{slsDetector@{sls\-Detector}!writeCalibrationFile@{writeCalibrationFile}} +Implemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_3c5f27709351c49dd715212adc5ba7d2}.\index{slsDetector@{sls\-Detector}!writeCalibrationFile@{writeCalibrationFile}} \index{writeCalibrationFile@{writeCalibrationFile}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::write\-Calibration\-File (string {\em fname}, float {\em gain}, float {\em offset})}\label{classslsDetector_8eb676a1ab6ef35601ba5cae942ba380} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}virtual int sls\-Detector::write\-Calibration\-File (string {\em fname}, float {\em gain}, float {\em offset})\hspace{0.3cm}{\tt [pure virtual]}}\label{classslsDetector_d12edef440bf2b2f930e83f0ccceb01e} -writes a clibration file \begin{Desc} +Pure virtual function writes a calibration file \begin{Desc} \item[Parameters:] \begin{description} \item[{\em fname}]file to be written \item[{\em gain}]\item[{\em offset}]\end{description} \end{Desc} \begin{Desc} -\item[See also:]\doxyref{shared\-Sls\-Detector}{p.}{structslsDetector_1_1sharedSlsDetector} \end{Desc} +\item[See also:]\doxyref{shared\-Sls\-Detector}{p.}{structslsDetector_1_1sharedSlsDetector} \doxyref{mythen\-Detector::write\-Calibration\-File}{p.}{classmythenDetector_10e7213bb0e7138c07231687e9a6899a} \end{Desc} -Reimplemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_10e7213bb0e7138c07231687e9a6899a}, and \bf{eiger\-Detector} \doxyref{p.}{classeigerDetector_d5fbecfcc46cb151160c6011aa8e33b2}.\index{slsDetector@{sls\-Detector}!writeConfigurationFile@{writeConfigurationFile}} +Implemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_10e7213bb0e7138c07231687e9a6899a}, and \bf{eiger\-Detector} \doxyref{p.}{classeigerDetector_d5fbecfcc46cb151160c6011aa8e33b2}.\index{slsDetector@{sls\-Detector}!writeConfigurationFile@{writeConfigurationFile}} \index{writeConfigurationFile@{writeConfigurationFile}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::write\-Configuration\-File (string const {\em fname})}\label{classslsDetector_82628148e11f4890c9d935ec921c1121} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}virtual int sls\-Detector::write\-Configuration\-File (string const {\em fname})\hspace{0.3cm}{\tt [pure virtual]}}\label{classslsDetector_7801c6d43c72ce5ccaa72743a6f307d2} -Every detector should have a basic configuration file containing: type (mythen, pilatus etc.) hostname portnumber communication type (default TCP/IP) eventually secondary portnumber (e.g. mythen stop function) number of modules installed if different from the detector size (x,y) +Purely virtual function Should be implemented in the specific detector class /sa \doxyref{mythen\-Detector::write\-Configuration\-File}{p.}{classmythenDetector_6ad688e0c1a59001ecc61117c67e5434} -to be changed \index{slsDetector@{sls\-Detector}!writeDataFile@{writeDataFile}} +Implemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_6ad688e0c1a59001ecc61117c67e5434}.\index{slsDetector@{sls\-Detector}!writeDataFile@{writeDataFile}} \index{writeDataFile@{writeDataFile}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::write\-Data\-File (string {\em fname}, int $\ast$ {\em data})}\label{classslsDetector_3e1a8e49fbfb34a54381452abc8b5258} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}virtual int sls\-Detector::write\-Data\-File (string {\em fname}, int $\ast$ {\em data})\hspace{0.3cm}{\tt [pure virtual]}}\label{classslsDetector_efa98ca652306e2a026c9a5b2fbfe2dc} -writes a data file \begin{Desc} +Pure virtual function writes a data file \begin{Desc} \item[Parameters:] \begin{description} \item[{\em name}]of the file to be written \item[{\em data}]array of data values \end{description} \end{Desc} \begin{Desc} \item[Returns:]OK or FAIL if it could not write the file or data=NULL \end{Desc} +\begin{Desc} +\item[See also:]\doxyref{mythen\-Detector::write\-Data\-File}{p.}{classmythenDetector_42c1d320f594ebd87e2465cc986ee848} \end{Desc} -Reimplemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_9a49c84d7ad664f7891b00fba0ce829a}, and \bf{eiger\-Detector} \doxyref{p.}{classeigerDetector_68a740d5e43fcdb00c57f401666c0856}.\index{slsDetector@{sls\-Detector}!writeDataFile@{writeDataFile}} +Implemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_9a49c84d7ad664f7891b00fba0ce829a}, and \bf{eiger\-Detector} \doxyref{p.}{classeigerDetector_68a740d5e43fcdb00c57f401666c0856}.\index{slsDetector@{sls\-Detector}!writeDataFile@{writeDataFile}} \index{writeDataFile@{writeDataFile}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::write\-Data\-File (string {\em fname}, float $\ast$ {\em data}, float $\ast$ {\em err} = {\tt NULL}, float $\ast$ {\em ang} = {\tt NULL}, char {\em dataformat} = {\tt 'f'}, int {\em nch} = {\tt -1})}\label{classslsDetector_889c060afb5693830ca2be4fc6a5442c} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}virtual int sls\-Detector::write\-Data\-File (string {\em fname}, float $\ast$ {\em data}, float $\ast$ {\em err} = {\tt NULL}, float $\ast$ {\em ang} = {\tt NULL}, char {\em dataformat} = {\tt 'f'}, int {\em nch} = {\tt -1})\hspace{0.3cm}{\tt [pure virtual]}}\label{classslsDetector_08823d7078b5e6dd1a4cb7d8b3cfe0af} -writes a data file \begin{Desc} +Pure virtual function writes a data file \begin{Desc} \item[Parameters:] \begin{description} \item[{\em name}]of the file to be written \item[{\em data}]array of data values \item[{\em err}]array of arrors on the data. If NULL no errors will be written\item[{\em ang}]array of angular values. If NULL data will be in the form chan-val(-err) otherwise ang-val(-err) \item[{\em dataformat}]format of the data: can be 'i' integer or 'f' float (default) \item[{\em nch}]number of channels to be written to file. if -1 defaults to the number of installed channels of the detector \end{description} \end{Desc} \begin{Desc} \item[Returns:]OK or FAIL if it could not write the file or data=NULL \end{Desc} +\begin{Desc} +\item[See also:]\doxyref{mythen\-Detector::write\-Data\-File}{p.}{classmythenDetector_42c1d320f594ebd87e2465cc986ee848} \end{Desc} -Reimplemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_42c1d320f594ebd87e2465cc986ee848}, and \bf{eiger\-Detector} \doxyref{p.}{classeigerDetector_5ad2bf5b10d17e8c4ad7ae6e81e647e0}.\index{slsDetector@{sls\-Detector}!writeRegister@{writeRegister}} +Implemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_42c1d320f594ebd87e2465cc986ee848}, and \bf{eiger\-Detector} \doxyref{p.}{classeigerDetector_5ad2bf5b10d17e8c4ad7ae6e81e647e0}.\index{slsDetector@{sls\-Detector}!writeRegister@{writeRegister}} \index{writeRegister@{writeRegister}!slsDetector@{sls\-Detector}} \subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::write\-Register (int {\em addr}, int {\em val})}\label{classslsDetector_742c8c6b4e7f3cad4f7e60c8c7c0c18b} @@ -1791,10 +1832,10 @@ write register \begin{Desc} \item[Returns:]current register value \end{Desc} \index{slsDetector@{sls\-Detector}!writeTrimFile@{writeTrimFile}} \index{writeTrimFile@{writeTrimFile}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::write\-Trim\-File (string {\em fname}, int {\em imod})}\label{classslsDetector_afe675432bf8e5dcb47774da3cc81106} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}virtual int sls\-Detector::write\-Trim\-File (string {\em fname}, int {\em imod})\hspace{0.3cm}{\tt [pure virtual]}}\label{classslsDetector_cb27a987551e66093eb201523ac8d8b0} -writes a trim file for module number imod - the values will be read from the current detector structure \begin{Desc} +Pure virtual function writes a trim file for module number imod - the values will be read from the current detector structure \begin{Desc} \item[Parameters:] \begin{description} \item[{\em fname}]name of the file to be written \item[{\em imod}]module number \end{description} @@ -1802,15 +1843,15 @@ writes a trim file for module number imod - the values will be read from the cur \begin{Desc} \item[Returns:]OK or FAIL if the file could not be written \end{Desc} \begin{Desc} -\item[See also:]\doxyref{sls\_\-detector\_\-module}{p.}{structsls__detector__module} \doxyref{shared\-Sls\-Detector}{p.}{structslsDetector_1_1sharedSlsDetector} \end{Desc} +\item[See also:]\doxyref{sls\_\-detector\_\-module}{p.}{structsls__detector__module} \doxyref{shared\-Sls\-Detector}{p.}{structslsDetector_1_1sharedSlsDetector} \doxyref{mythen\-Detector::write\-Trim\-File(string, int)}{p.}{classmythenDetector_94179431a737bbceb20f27ca1fd30349} \end{Desc} -Reimplemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_94179431a737bbceb20f27ca1fd30349}, and \bf{eiger\-Detector} \doxyref{p.}{classeigerDetector_df3a0dff0fc3111e10af0363bdd15a6a}.\index{slsDetector@{sls\-Detector}!writeTrimFile@{writeTrimFile}} +Implemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_94179431a737bbceb20f27ca1fd30349}, and \bf{eiger\-Detector} \doxyref{p.}{classeigerDetector_df3a0dff0fc3111e10af0363bdd15a6a}.\index{slsDetector@{sls\-Detector}!writeTrimFile@{writeTrimFile}} \index{writeTrimFile@{writeTrimFile}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int sls\-Detector::write\-Trim\-File (string {\em fname}, \bf{sls\_\-detector\_\-module} {\em mod})}\label{classslsDetector_9cbb1f97b8e48bd4b108a2dfa992c6af} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}virtual int sls\-Detector::write\-Trim\-File (string {\em fname}, \bf{sls\_\-detector\_\-module} {\em mod})\hspace{0.3cm}{\tt [pure virtual]}}\label{classslsDetector_5b97351cfaffe067016dbcebbd0778a7} -writes a trim file \begin{Desc} +Pure virtual function writes a trim file \begin{Desc} \item[Parameters:] \begin{description} \item[{\em fname}]name of the file to be written \item[{\em mod}]module structure which has to be written to file \end{description} @@ -1818,134 +1859,134 @@ writes a trim file \begin{Desc} \begin{Desc} \item[Returns:]OK or FAIL if the file could not be written\end{Desc} \begin{Desc} -\item[See also:]\doxyref{sls\_\-detector\_\-module}{p.}{structsls__detector__module} \end{Desc} +\item[See also:]\doxyref{sls\_\-detector\_\-module}{p.}{structsls__detector__module} \doxyref{mythen\-Detector::write\-Trim\-File(string, sls\_\-detector\_\-module)}{p.}{classmythenDetector_0b137abd78bd3d03653cd21436eb6c4d} \end{Desc} -Reimplemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_0b137abd78bd3d03653cd21436eb6c4d}, and \bf{eiger\-Detector} \doxyref{p.}{classeigerDetector_8380366bf7112021c49be8e6f29f18d8}. +Implemented in \bf{mythen\-Detector} \doxyref{p.}{classmythenDetector_0b137abd78bd3d03653cd21436eb6c4d}, and \bf{eiger\-Detector} \doxyref{p.}{classeigerDetector_8380366bf7112021c49be8e6f29f18d8}. \subsection{Member Data Documentation} \index{slsDetector@{sls\-Detector}!adcs@{adcs}} \index{adcs@{adcs}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float$\ast$ \bf{sls\-Detector::adcs}\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_f370b8466441491d8496bb8130b8c5e7} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float$\ast$ \bf{sls\-Detector::adcs}\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_f370b8466441491d8496bb8130b8c5e7} pointer to adc valuse \index{slsDetector@{sls\-Detector}!badChannelMask@{badChannelMask}} \index{badChannelMask@{badChannelMask}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int$\ast$ \bf{sls\-Detector::bad\-Channel\-Mask}\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_614c98f77a8a3ec6cff57aa59e671123} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int$\ast$ \bf{sls\-Detector::bad\-Channel\-Mask}\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_614c98f77a8a3ec6cff57aa59e671123} pointer to bad channel mask 0 is channel is good 1 if it is bad\begin{Desc} \item[See also:]\doxyref{fill\-Bad\-Channel\-Mask()}{p.}{classslsDetector_6a0ebe013e27c065b2f67158a27f64ac} \end{Desc} \index{slsDetector@{sls\-Detector}!chanregs@{chanregs}} \index{chanregs@{chanregs}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int$\ast$ \bf{sls\-Detector::chanregs}\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_44335474559f7321f0309fbda304caf8} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int$\ast$ \bf{sls\-Detector::chanregs}\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_44335474559f7321f0309fbda304caf8} pointer to channal registers \index{slsDetector@{sls\-Detector}!chipregs@{chipregs}} \index{chipregs@{chipregs}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int$\ast$ \bf{sls\-Detector::chipregs}\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_0eb24981d044632eccba507bd15871a6} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int$\ast$ \bf{sls\-Detector::chipregs}\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_0eb24981d044632eccba507bd15871a6} pointer to chip registers \index{slsDetector@{sls\-Detector}!controlSocket@{controlSocket}} \index{controlSocket@{controlSocket}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}\bf{My\-Socket\-TCP}$\ast$ \bf{sls\-Detector::control\-Socket}\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_07f3943ab8a65f061bbe1c1e1d22b700} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}\bf{My\-Socket\-TCP}$\ast$ \bf{sls\-Detector::control\-Socket}\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_07f3943ab8a65f061bbe1c1e1d22b700} socket for control commands \index{slsDetector@{sls\-Detector}!currentI0@{currentI0}} \index{currentI0@{currentI0}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float \bf{sls\-Detector::current\-I0}\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_4bba77b0de9f911c87d48d12c15a632b} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float \bf{sls\-Detector::current\-I0}\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_4bba77b0de9f911c87d48d12c15a632b} I0 measured \index{slsDetector@{sls\-Detector}!currentPosition@{currentPosition}} \index{currentPosition@{currentPosition}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float \bf{sls\-Detector::current\-Position}\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_9f64e866250e916299048c9816c9ef28} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float \bf{sls\-Detector::current\-Position}\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_9f64e866250e916299048c9816c9ef28} current position of the detector \index{slsDetector@{sls\-Detector}!currentPositionIndex@{currentPositionIndex}} \index{currentPositionIndex@{currentPositionIndex}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float \bf{sls\-Detector::current\-Position\-Index}\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_9a6cd8787f618c147faacc1f3602bcf5} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float \bf{sls\-Detector::current\-Position\-Index}\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_9a6cd8787f618c147faacc1f3602bcf5} current position index of the detector \index{slsDetector@{sls\-Detector}!dacs@{dacs}} \index{dacs@{dacs}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float$\ast$ \bf{sls\-Detector::dacs}\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_dc1b3f867b97136fca83f86c83b7ae14} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float$\ast$ \bf{sls\-Detector::dacs}\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_dc1b3f867b97136fca83f86c83b7ae14} pointer to dac valuse \index{slsDetector@{sls\-Detector}!dataProcessingThread@{dataProcessingThread}} \index{dataProcessingThread@{dataProcessingThread}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}pthread\_\-t \bf{sls\-Detector::data\-Processing\-Thread}\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_8257cca09e23b601764e57f5a8bdaacd} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}pthread\_\-t \bf{sls\-Detector::data\-Processing\-Thread}\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_8257cca09e23b601764e57f5a8bdaacd} data processing thread??? \index{slsDetector@{sls\-Detector}!dataQueue@{dataQueue}} \index{dataQueue@{dataQueue}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}queue$<$int$\ast$$>$ \bf{sls\-Detector::data\-Queue}\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_52e9fe9baf37db001cdf58f982ab5dd6} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}queue$<$int$\ast$$>$ \bf{sls\-Detector::data\-Queue}\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_52e9fe9baf37db001cdf58f982ab5dd6} data queue \index{slsDetector@{sls\-Detector}!dataSocket@{dataSocket}} \index{dataSocket@{dataSocket}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}\bf{My\-Socket\-TCP}$\ast$ \bf{sls\-Detector::data\-Socket}\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_1629e3c46678ae201f6797e4d827cb32} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}\bf{My\-Socket\-TCP}$\ast$ \bf{sls\-Detector::data\-Socket}\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_1629e3c46678ae201f6797e4d827cb32} socket for data acquisition \index{slsDetector@{sls\-Detector}!detectorModules@{detectorModules}} \index{detectorModules@{detectorModules}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}\bf{sls\_\-detector\_\-module}$\ast$ \bf{sls\-Detector::detector\-Modules}\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_b78d6f2abc185b2bde2c550b31e0ff72} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}\bf{sls\_\-detector\_\-module}$\ast$ \bf{sls\-Detector::detector\-Modules}\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_b78d6f2abc185b2bde2c550b31e0ff72} pointer to detector module structures \index{slsDetector@{sls\-Detector}!detId@{detId}} \index{detId@{detId}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int \bf{sls\-Detector::det\-Id}\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_37f4af284283e7a18a28cec3f4e4532f} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int \bf{sls\-Detector::det\-Id}\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_37f4af284283e7a18a28cec3f4e4532f} detector ID \index{slsDetector@{sls\-Detector}!ffcoefficients@{ffcoefficients}} \index{ffcoefficients@{ffcoefficients}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float$\ast$ \bf{sls\-Detector::ffcoefficients}\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_a3c6e93198a2f8b072b7b84ba9af7c4b} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float$\ast$ \bf{sls\-Detector::ffcoefficients}\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_a3c6e93198a2f8b072b7b84ba9af7c4b} pointer to flat field coefficients \index{slsDetector@{sls\-Detector}!fferrors@{fferrors}} \index{fferrors@{fferrors}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float$\ast$ \bf{sls\-Detector::fferrors}\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_636168b92509e96418c9134d6d82ad4c} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float$\ast$ \bf{sls\-Detector::fferrors}\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_636168b92509e96418c9134d6d82ad4c} pointer to flat field coefficient errors \index{slsDetector@{sls\-Detector}!mergingBins@{mergingBins}} \index{mergingBins@{mergingBins}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float$\ast$ \bf{sls\-Detector::merging\-Bins}\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_81751fd6e87f9659a8b6afe13efec2cf} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float$\ast$ \bf{sls\-Detector::merging\-Bins}\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_81751fd6e87f9659a8b6afe13efec2cf} merging bins \index{slsDetector@{sls\-Detector}!mergingCounts@{mergingCounts}} \index{mergingCounts@{mergingCounts}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float$\ast$ \bf{sls\-Detector::merging\-Counts}\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_fc173dcaeda2bbd7bbd6a874b5b5726c} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float$\ast$ \bf{sls\-Detector::merging\-Counts}\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_fc173dcaeda2bbd7bbd6a874b5b5726c} merging counts \index{slsDetector@{sls\-Detector}!mergingErrors@{mergingErrors}} \index{mergingErrors@{mergingErrors}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float$\ast$ \bf{sls\-Detector::merging\-Errors}\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_f357d3b5961ead7ec263a47aa51c4c11} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}float$\ast$ \bf{sls\-Detector::merging\-Errors}\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_f357d3b5961ead7ec263a47aa51c4c11} merging errors \index{slsDetector@{sls\-Detector}!mergingMultiplicity@{mergingMultiplicity}} \index{mergingMultiplicity@{mergingMultiplicity}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int$\ast$ \bf{sls\-Detector::merging\-Multiplicity}\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_91c5e22042997d86c2c4d16ef1be9150} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int$\ast$ \bf{sls\-Detector::merging\-Multiplicity}\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_91c5e22042997d86c2c4d16ef1be9150} merging multiplicity \index{slsDetector@{sls\-Detector}!onlineFlag@{onlineFlag}} \index{onlineFlag@{onlineFlag}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int \bf{sls\-Detector::online\-Flag}\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_7572bba8e53f900d4126657827bec3cf} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int \bf{sls\-Detector::online\-Flag}\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_7572bba8e53f900d4126657827bec3cf} \begin{Desc} \item[See also:]\doxyref{set\-Online}{p.}{classslsDetector_f041f723f702c17de292061d6d609698} \end{Desc} \index{slsDetector@{sls\-Detector}!shmId@{shmId}} \index{shmId@{shmId}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int \bf{sls\-Detector::shm\-Id}\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_53a78c7fe99f93b9bba8d0c2cb32a181} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}int \bf{sls\-Detector::shm\-Id}\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_53a78c7fe99f93b9bba8d0c2cb32a181} shared memeory ID \index{slsDetector@{sls\-Detector}!stopSocket@{stopSocket}} \index{stopSocket@{stopSocket}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}\bf{My\-Socket\-TCP}$\ast$ \bf{sls\-Detector::stop\-Socket}\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_efee578cdd732339788a38707e5ce531} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}\bf{My\-Socket\-TCP}$\ast$ \bf{sls\-Detector::stop\-Socket}\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_efee578cdd732339788a38707e5ce531} socket for emergency stop \index{slsDetector@{sls\-Detector}!thisDetector@{thisDetector}} \index{thisDetector@{thisDetector}!slsDetector@{sls\-Detector}} -\subsubsection{\setlength{\rightskip}{0pt plus 5cm}\bf{shared\-Sls\-Detector}$\ast$ \bf{sls\-Detector::this\-Detector}\hspace{0.3cm}{\tt [private]}}\label{classslsDetector_fe0da5c1491ebf18f187f0a26c5ded11} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}\bf{shared\-Sls\-Detector}$\ast$ \bf{sls\-Detector::this\-Detector}\hspace{0.3cm}{\tt [protected]}}\label{classslsDetector_fe0da5c1491ebf18f187f0a26c5ded11} address of the detector structure in shared memory diff --git a/slsDetectorSoftware/docs/latex/doxygen.sty b/slsDetectorSoftware/docs/latex/doxygen.sty index aed2ed8e4..687c528aa 100644 --- a/slsDetectorSoftware/docs/latex/doxygen.sty +++ b/slsDetectorSoftware/docs/latex/doxygen.sty @@ -10,8 +10,8 @@ {\fancyplain{}{\bfseries\rightmark}} \rhead[\fancyplain{}{\bfseries\leftmark}] {\fancyplain{}{\bfseries\thepage}} -\rfoot[\fancyplain{}{\bfseries\scriptsize Generated on Fri Oct 9 16:01:04 2009 by Doxygen }]{} -\lfoot[]{\fancyplain{}{\bfseries\scriptsize Generated on Fri Oct 9 16:01:04 2009 by Doxygen }} +\rfoot[\fancyplain{}{\bfseries\scriptsize Generated on Tue Dec 1 10:56:45 2009 by Doxygen }]{} +\lfoot[]{\fancyplain{}{\bfseries\scriptsize Generated on Tue Dec 1 10:56:45 2009 by Doxygen }} \cfoot{} \newenvironment{Code} {\footnotesize} diff --git a/slsDetectorSoftware/docs/latex/index.tex b/slsDetectorSoftware/docs/latex/index.tex index 937b3c404..73bc3d522 100644 --- a/slsDetectorSoftware/docs/latex/index.tex +++ b/slsDetectorSoftware/docs/latex/index.tex @@ -5,7 +5,12 @@ The architecture of the acquisitions system is intended as follows: \begin{itemi \item A socket server running on the detector (or more than one in some special cases) \item C++ classes common to all detectors for client-server communication. These can be supplied to users as libraries and embedded also in acquisition systems which are not developed by the SLS\begin{Desc} \item[See also:]\doxyref{My\-Socket\-TCP}{p.}{classMySocketTCP} \doxyref{sls\-Detector}{p.}{classslsDetector} \end{Desc} \item the possibility of using a Qt-based graphical user interface (with eventually root analisys capabilities) \item the possibility of runnin alla commands from command line. In order to ensure a fast operation of this so called \char`\"{}text client\char`\"{} the detector parameters should not be re-initialized everytime. For this reason a shared memory block is allocated where the main detector flags and parameters are stored\begin{Desc} -\item[See also:]\doxyref{sls\-Detector::shared\-Sls\-Detector}{p.}{structslsDetector_1_1sharedSlsDetector}\end{Desc} +\item[See also:]\doxyref{sls\-Detector::shared\-Sls\-Detector}{p.}{structslsDetector_1_1sharedSlsDetector} \end{Desc} +\end{itemize} +\section{How to use it}\label{index_howto_sec} +The best way to operate the sls\-Detectors is to use the software (text client or GUI) developed by the sls detectors group. In case you need to embed the detector control in a previously existing software, compile these classes using \par + make package \par + and link the shared library created to your software bin/lib\-Sls\-Detector.so.1.0.1 Then in your software you should use the class related to the detector you want to control (\doxyref{mythen\-Detector}{p.}{classmythenDetector} or \doxyref{eiger\-Detector}{p.}{classeigerDetector}). + \begin{Desc} \item[Author:]Anna Bergamaschi \end{Desc} -\end{itemize} diff --git a/slsDetectorSoftware/docs/latex/mythenDetector_8h.tex b/slsDetectorSoftware/docs/latex/mythenDetector_8h.tex index cc3a0d908..19e38241c 100644 --- a/slsDetectorSoftware/docs/latex/mythenDetector_8h.tex +++ b/slsDetectorSoftware/docs/latex/mythenDetector_8h.tex @@ -5,4 +5,17 @@ \begin{CompactItemize} \item class \bf{mythen\-Detector} -\begin{CompactList}\small\item\em This calss contains all mythen specific functions. \item\end{CompactList}\end{CompactItemize} +\end{CompactItemize} +\subsection*{Defines} +\begin{CompactItemize} +\item +\#define \bf{default\-TDead}~\{170,90,750\} +\end{CompactItemize} + + +\subsection{Define Documentation} +\index{mythenDetector.h@{mythen\-Detector.h}!defaultTDead@{defaultTDead}} +\index{defaultTDead@{defaultTDead}!mythenDetector.h@{mythen\-Detector.h}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}\#define default\-TDead~\{170,90,750\}}\label{mythenDetector_8h_082faba3de8ce8379e160e3067333d14} + + diff --git a/slsDetectorSoftware/docs/latex/refman.tex b/slsDetectorSoftware/docs/latex/refman.tex index d8b5658a3..ea048c804 100644 --- a/slsDetectorSoftware/docs/latex/refman.tex +++ b/slsDetectorSoftware/docs/latex/refman.tex @@ -19,7 +19,7 @@ \vspace*{1cm} {\large Generated by Doxygen 1.4.7}\\ \vspace*{0.5cm} -{\small Fri Oct 9 16:01:04 2009}\\ +{\small Tue Dec 1 10:56:45 2009}\\ \end{center} \end{titlepage} \clearemptydoublepage diff --git a/slsDetectorSoftware/docs/latex/slsDetector_8h.tex b/slsDetectorSoftware/docs/latex/slsDetector_8h.tex index 3e9098bf3..5593318b2 100644 --- a/slsDetectorSoftware/docs/latex/slsDetector_8h.tex +++ b/slsDetectorSoftware/docs/latex/slsDetector_8h.tex @@ -74,7 +74,7 @@ struct \bf{sls\-Detector::shared\-Sls\-Detector} \subsubsection{\setlength{\rightskip}{0pt plus 5cm}\#define default\-TDead~\{170,90,750\}}\label{slsDetector_8h_082faba3de8ce8379e160e3067333d14} -\index{slsDetector.h@{sls\-Detector.h}!MAX_BADCHANS@{MAX\_\-BADCHANS}} +should be changed in order to have it separate for the different detector types \index{slsDetector.h@{sls\-Detector.h}!MAX_BADCHANS@{MAX\_\-BADCHANS}} \index{MAX_BADCHANS@{MAX\_\-BADCHANS}!slsDetector.h@{sls\-Detector.h}} \subsubsection{\setlength{\rightskip}{0pt plus 5cm}\#define MAX\_\-BADCHANS~2000}\label{slsDetector_8h_458ac030ac964822b06ae7659da870df} diff --git a/slsDetectorSoftware/docs/latex/sls__detector__defs_8h.tex b/slsDetectorSoftware/docs/latex/sls__detector__defs_8h.tex index 3fa906e5a..b889a566d 100644 --- a/slsDetectorSoftware/docs/latex/sls__detector__defs_8h.tex +++ b/slsDetectorSoftware/docs/latex/sls__detector__defs_8h.tex @@ -59,7 +59,8 @@ enum \bf{dimension} \{ \bf{X} = 0, \} \item enum \{ \bf{OK}, -\bf{FAIL} +\bf{FAIL}, +\bf{FINISHED} \} \item enum \{ \bf{DISABLED}, @@ -173,6 +174,11 @@ enum \bf{timer\-Index} \{ \par \bf{CYCLES\_\-NUMBER} \} \item +enum \bf{speed\-Variable} \{ \bf{CLOCK\_\-DIVIDER}, +\bf{WAIT\_\-STATES}, +\bf{SET\_\-SIGNAL\_\-LENGTH} + \} +\item enum \bf{read\-Out\-Flags} \{ \par \bf{GET\_\-READOUT\_\-FLAGS} = -1, \bf{NORMAL\_\-READOUT} = 0, @@ -256,7 +262,9 @@ enum \{ \par \par \bf{F\_\-SET\_\-READOUT\_\-FLAGS}, \bf{F\_\-SET\_\-ROI}, +\bf{F\_\-SET\_\-SPEED}, \bf{F\_\-EXECUTE\_\-TRIMMING}, +\par \bf{F\_\-EXIT\_\-SERVER} \} \end{CompactItemize} @@ -297,6 +305,8 @@ return values \begin{Desc} OK\label{sls__detector__defs_8h_df764cbdea00d65edcd07bb9953ad2b72bc49ec37d6a5715dd23e85f1ff5bb59} }]function succeeded \index{FAIL@{FAIL}!sls_detector_defs.h@{sls\_\-detector\_\-defs.h}}\index{sls_detector_defs.h@{sls\_\-detector\_\-defs.h}!FAIL@{FAIL}}\item[{\em FAIL\label{sls__detector__defs_8h_df764cbdea00d65edcd07bb9953ad2b7936c4a5547a9360243178f726f6b2715} +}]function failed \index{FINISHED@{FINISHED}!sls_detector_defs.h@{sls\_\-detector\_\-defs.h}}\index{sls_detector_defs.h@{sls\_\-detector\_\-defs.h}!FINISHED@{FINISHED}}\item[{\em +FINISHED\label{sls__detector__defs_8h_df764cbdea00d65edcd07bb9953ad2b7dbd1812bee789fbf3548cf79d3f2b400} }]function failed \end{description} \end{Desc} @@ -405,7 +415,9 @@ F\_\-SET\_\-DYNAMIC\_\-RANGE\label{sls__detector__defs_8h_bc6126af1d45847bc59afa F\_\-SET\_\-READOUT\_\-FLAGS\label{sls__detector__defs_8h_bc6126af1d45847bc59afa0aa3216b045cdaebc62f9748ce0f9822f381959307} }]set/get readout flags \index{F_SET_ROI@{F\_\-SET\_\-ROI}!sls_detector_defs.h@{sls\_\-detector\_\-defs.h}}\index{sls_detector_defs.h@{sls\_\-detector\_\-defs.h}!F_SET_ROI@{F\_\-SET\_\-ROI}}\item[{\em F\_\-SET\_\-ROI\label{sls__detector__defs_8h_bc6126af1d45847bc59afa0aa3216b04132603d9b086fb1178fbbd143d6aa126} -}]set/get region of interest \index{F_EXECUTE_TRIMMING@{F\_\-EXECUTE\_\-TRIMMING}!sls_detector_defs.h@{sls\_\-detector\_\-defs.h}}\index{sls_detector_defs.h@{sls\_\-detector\_\-defs.h}!F_EXECUTE_TRIMMING@{F\_\-EXECUTE\_\-TRIMMING}}\item[{\em +}]set/get region of interest \index{F_SET_SPEED@{F\_\-SET\_\-SPEED}!sls_detector_defs.h@{sls\_\-detector\_\-defs.h}}\index{sls_detector_defs.h@{sls\_\-detector\_\-defs.h}!F_SET_SPEED@{F\_\-SET\_\-SPEED}}\item[{\em +F\_\-SET\_\-SPEED\label{sls__detector__defs_8h_bc6126af1d45847bc59afa0aa3216b0457a41d958ac69f2c3d4ccf1b12cbd75f} +}]set/get readout speed parameters \index{F_EXECUTE_TRIMMING@{F\_\-EXECUTE\_\-TRIMMING}!sls_detector_defs.h@{sls\_\-detector\_\-defs.h}}\index{sls_detector_defs.h@{sls\_\-detector\_\-defs.h}!F_EXECUTE_TRIMMING@{F\_\-EXECUTE\_\-TRIMMING}}\item[{\em F\_\-EXECUTE\_\-TRIMMING\label{sls__detector__defs_8h_bc6126af1d45847bc59afa0aa3216b045be80176327f8e6afd6954cc8fd0ceaa} }]execute trimming \index{F_EXIT_SERVER@{F\_\-EXIT\_\-SERVER}!sls_detector_defs.h@{sls\_\-detector\_\-defs.h}}\index{sls_detector_defs.h@{sls\_\-detector\_\-defs.h}!F_EXIT_SERVER@{F\_\-EXIT\_\-SERVER}}\item[{\em F\_\-EXIT\_\-SERVER\label{sls__detector__defs_8h_bc6126af1d45847bc59afa0aa3216b04acb4344788e1f1e3716216aeffc50beb} @@ -782,6 +794,23 @@ BACKGROUND\_\-CORRECTIONS\label{sls__detector__defs_8h_6165e3e90182cc47b0003f328 }]background corrections \end{description} \end{Desc} +\index{sls_detector_defs.h@{sls\_\-detector\_\-defs.h}!speedVariable@{speedVariable}} +\index{speedVariable@{speedVariable}!sls_detector_defs.h@{sls\_\-detector\_\-defs.h}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}enum \bf{speed\-Variable}}\label{sls__detector__defs_8h_8c326f6a87754392b72098d3d0dec49d} + + +important speed parameters \begin{Desc} +\item[Enumerator: ]\par +\begin{description} +\index{CLOCK_DIVIDER@{CLOCK\_\-DIVIDER}!sls_detector_defs.h@{sls\_\-detector\_\-defs.h}}\index{sls_detector_defs.h@{sls\_\-detector\_\-defs.h}!CLOCK_DIVIDER@{CLOCK\_\-DIVIDER}}\item[{\em +CLOCK\_\-DIVIDER\label{sls__detector__defs_8h_8c326f6a87754392b72098d3d0dec49d3465852fc71156c546c9e211fb0babe8} +}]readout clock divider \index{WAIT_STATES@{WAIT\_\-STATES}!sls_detector_defs.h@{sls\_\-detector\_\-defs.h}}\index{sls_detector_defs.h@{sls\_\-detector\_\-defs.h}!WAIT_STATES@{WAIT\_\-STATES}}\item[{\em +WAIT\_\-STATES\label{sls__detector__defs_8h_8c326f6a87754392b72098d3d0dec49dce6f5250b9197568ebc442fcf3fa4ad6} +}]wait states for bus read \index{SET_SIGNAL_LENGTH@{SET\_\-SIGNAL\_\-LENGTH}!sls_detector_defs.h@{sls\_\-detector\_\-defs.h}}\index{sls_detector_defs.h@{sls\_\-detector\_\-defs.h}!SET_SIGNAL_LENGTH@{SET\_\-SIGNAL\_\-LENGTH}}\item[{\em +SET\_\-SIGNAL\_\-LENGTH\label{sls__detector__defs_8h_8c326f6a87754392b72098d3d0dec49d93f0483a6f279a444314846e3c4c2699} +}]set/clear signal length \end{description} +\end{Desc} + \index{sls_detector_defs.h@{sls\_\-detector\_\-defs.h}!timerIndex@{timerIndex}} \index{timerIndex@{timerIndex}!sls_detector_defs.h@{sls\_\-detector\_\-defs.h}} \subsubsection{\setlength{\rightskip}{0pt plus 5cm}enum \bf{timer\-Index}}\label{sls__detector__defs_8h_07c87ebf35dffccd06fe39859a3ca603} diff --git a/slsDetectorSoftware/docs/latex/structslsDetector_1_1sharedSlsDetector.tex b/slsDetectorSoftware/docs/latex/structslsDetector_1_1sharedSlsDetector.tex index 05f29644c..e51ecab00 100644 --- a/slsDetectorSoftware/docs/latex/structslsDetector_1_1sharedSlsDetector.tex +++ b/slsDetectorSoftware/docs/latex/structslsDetector_1_1sharedSlsDetector.tex @@ -60,12 +60,16 @@ float \bf{t\-Dead} \item int \bf{n\-Bad\-Chans} \item +char \bf{bad\-Chan\-File} [MAX\_\-STR\_\-LENGTH] +\item int \bf{bad\-Chans\-List} [MAX\_\-BADCHANS] \item int \bf{n\-Bad\-FF} \item int \bf{bad\-FFList} [MAX\_\-BADCHANS] \item +char \bf{ang\-Conv\-File} [MAX\_\-STR\_\-LENGTH] +\item \bf{angle\-Conversion\-Constant} \bf{ang\-Off} [MAXMODS] \item int \bf{ang\-Direction} @@ -126,7 +130,12 @@ memory offsets for the adc arrays \index{slsDetector::sharedSlsDetector@{sls\-De \subsubsection{\setlength{\rightskip}{0pt plus 5cm}int \bf{sls\-Detector::shared\-Sls\-Detector::already\-Existing}}\label{structslsDetector_1_1sharedSlsDetector_ee2e81699a79e6b9ddc698d120a13ef9} -already existing flag. If the detector does not yet exist (already\-Existing=0) the shared\-Memory will be created, otherwise it will simly be linked \index{slsDetector::sharedSlsDetector@{sls\-Detector::shared\-Sls\-Detector}!angDirection@{angDirection}} +already existing flag. If the detector does not yet exist (already\-Existing=0) the shared\-Memory will be created, otherwise it will simly be linked \index{slsDetector::sharedSlsDetector@{sls\-Detector::shared\-Sls\-Detector}!angConvFile@{angConvFile}} +\index{angConvFile@{angConvFile}!slsDetector::sharedSlsDetector@{sls\-Detector::shared\-Sls\-Detector}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}char \bf{sls\-Detector::shared\-Sls\-Detector::ang\-Conv\-File}[MAX\_\-STR\_\-LENGTH]}\label{structslsDetector_1_1sharedSlsDetector_42502564011f831f43733ffed7c2eafd} + + +file with the angular conversion factors \index{slsDetector::sharedSlsDetector@{sls\-Detector::shared\-Sls\-Detector}!angDirection@{angDirection}} \index{angDirection@{angDirection}!slsDetector::sharedSlsDetector@{sls\-Detector::shared\-Sls\-Detector}} \subsubsection{\setlength{\rightskip}{0pt plus 5cm}int \bf{sls\-Detector::shared\-Sls\-Detector::ang\-Direction}}\label{structslsDetector_1_1sharedSlsDetector_289a2fe819a4e02a93dfc54f9ba7ae16} @@ -138,7 +147,12 @@ angular direction (1 if it corresponds to the encoder direction i.e. channel 0 i array of angular conversion constants for each module\begin{Desc} \item[See also:]\doxyref{angle\-Conversion\-Constant}{p.}{structangleConversionConstant} \end{Desc} -\index{slsDetector::sharedSlsDetector@{sls\-Detector::shared\-Sls\-Detector}!badChansList@{badChansList}} +\index{slsDetector::sharedSlsDetector@{sls\-Detector::shared\-Sls\-Detector}!badChanFile@{badChanFile}} +\index{badChanFile@{badChanFile}!slsDetector::sharedSlsDetector@{sls\-Detector::shared\-Sls\-Detector}} +\subsubsection{\setlength{\rightskip}{0pt plus 5cm}char \bf{sls\-Detector::shared\-Sls\-Detector::bad\-Chan\-File}[MAX\_\-STR\_\-LENGTH]}\label{structslsDetector_1_1sharedSlsDetector_9ab536c77675cd30b26ab647efe5c3ca} + + +file with the bad channels \index{slsDetector::sharedSlsDetector@{sls\-Detector::shared\-Sls\-Detector}!badChansList@{badChansList}} \index{badChansList@{badChansList}!slsDetector::sharedSlsDetector@{sls\-Detector::shared\-Sls\-Detector}} \subsubsection{\setlength{\rightskip}{0pt plus 5cm}int \bf{sls\-Detector::shared\-Sls\-Detector::bad\-Chans\-List}[MAX\_\-BADCHANS]}\label{structslsDetector_1_1sharedSlsDetector_4e03ad7a759acf38d4543e0df9ab9710} diff --git a/slsDetectorSoftware/mythenDetector/mythenDetector.cpp b/slsDetectorSoftware/mythenDetector/mythenDetector.cpp index 644bb5f2d..03d62a778 100644 --- a/slsDetectorSoftware/mythenDetector/mythenDetector.cpp +++ b/slsDetectorSoftware/mythenDetector/mythenDetector.cpp @@ -1,8 +1,5 @@ #include "mythenDetector.h" #include "usersFunctions.h" -#include -#include -#include @@ -10,8 +7,1126 @@ using namespace std; -mythenDetector::mythenDetector(int id): slsDetector(MYTHEN,id) - { - ; + + /* detector configuration (no communication to server) */ + + /* + Every detector should have a basic configuration file containing: + type (mythen, pilatus etc.) + hostname + portnumber + communication type (default TCP/IP) + eventually secondary portnumber (e.g. mythen stop function) + number of modules installed if different from the detector size (x,y) + */ + +int mythenDetector::readConfigurationFile(string const fname){ + + char hostname[1000]=DEFAULT_HOSTNAME; + int cport=DEFAULT_PORTNO, sport=DEFAULT_PORTNO+1,dport=-1; + int nmx=-1, nmy=-1; + float angoff=0.; + + + int nnames=17; + string names[]={"Hostname", "NmodX", "NmodY", "Detector", "ControlPort", "StopPort", "DataPort", "TrimBitDir","TrimBitEnergies", "CalDir", "BadChanList", "AngCal", "AngDirection", "FineOffset","GlobalOffset", "ClkDiv","BinSize"}; + char line[500]; + string str; + ifstream infile; + string::size_type pos; + int iargval; + int interrupt=0; + + string sargname, sargval, dtype; + int iarg; + float farg; + int iline=0; + cout << "config file name "<< fname << endl; + infile.open(fname.c_str(), ios_base::in); + if (infile.is_open()) { + while (infile.good() and interrupt==0) { + sargname="none"; + sargval="0"; + getline(infile,str); + iline++; +#ifdef VERBOSE + cout << str << endl; +#endif + if (str.find('#')!=string::npos) { +#ifdef VERBOSE + cout << "Line is a comment " << endl; + cout << str << endl; +#endif + continue; + } else { + istringstream ssstr(str); + ssstr >> sargname; + if (!ssstr.good()) { +#ifdef VERBOSE + cout << "bad stream out" << endl; +#endif + interrupt=1; + break; + } else { + for (int iname=0; iname> sargval; + strcpy(hostname,sargval.c_str()); + break; + case 1: + ssstr>> nmx; + break; + case 2: + ssstr >> nmy; + break; + case 3: + ssstr >> dtype; + break; + case 4: + ssstr >> iargval; + cport=iargval; + break; + case 5: + ssstr >> iargval; + sport=iargval; + break; + case 6: + ssstr >> iargval; + dport=iargval; + break; + case 7: + ssstr>> sargval; + strcpy(thisDetector->trimDir,sargval.c_str()); + break; + case 8: + thisDetector->nTrimEn=0; + while (ssstr.good()) { + ssstr >> farg; + thisDetector->trimEnergies[thisDetector->nTrimEn]=farg; + thisDetector->nTrimEn++; + } + break; + case 9: + ssstr>> sargval; + strcpy(thisDetector->calDir,sargval.c_str()); + break; + case 10: + ssstr>> sargval; + strcpy(thisDetector->badChanFile,sargval.c_str()); + break; + case 11: + ssstr>> sargval; + strcpy(thisDetector->angConvFile,sargval.c_str()); + setAngularConversion(thisDetector->angConvFile); + break; + case 12: + ssstr>> iargval; + thisDetector->angDirection=iargval; + break; + case 13: + ssstr>> farg; + thisDetector->fineOffset=farg; + break; + case 14: + ssstr>> farg; + thisDetector->globalOffset=farg; +#ifdef VERBOSE + cout << "global offset is "<< farg << endl; +#endif + break; + case 15: + ssstr>> iargval; + thisDetector->clkDiv=iargval; +#ifdef VERBOSE + cout << "clock divider is "<< iargval << endl; +#endif + break; + case 16: + ssstr>> farg; + thisDetector->binSize=farg; +#ifdef VERBOSE + cout << "binsize is "<< farg << endl; +#endif + break; + default: + cout << "unknown!" << endl; + } + break; + } + } + } + } + } + infile.close(); + } + else + { + cout << "Error opening configuration file " << fname << " for reading" << endl; + return FAIL; + } + + setTCPSocket(hostname,cport,sport,dport); + setDetectorType(dtype); + setNumberOfModules(nmx,X); + setNumberOfModules(nmy,Y); +#ifdef VERBOSE + cout << "Finished reading configuration file " << endl; +#endif + return OK; +}; + + +int mythenDetector::writeConfigurationFile(string const fname){ + + + string names[]={"Hostname", "NmodX", "NmodY", "Detector", "ControlPort", "StopPort", "DataPort", "TrimBitDir", "TrimBitEnergies","CalDir", "BadChanList", "AngCal", "AngDirection", "AngOffset", "ClkDiv"}; + ofstream outfile; + char hostname[1000]=""; + + + outfile.open (fname.c_str(),ios_base::out); + if (outfile.is_open()) + { + while (outfile.good()) { + if (controlSocket) { + controlSocket->getHostname(hostname); + } + outfile << "Hostname " << hostname << endl; + outfile << "NModX " << setNumberOfModules(GET_FLAG, X) << endl; + outfile << "NModY " << setNumberOfModules(GET_FLAG, Y) << endl; + switch (thisDetector->myDetectorType) { + case MYTHEN: + outfile << "Detector Mythen" << endl; + break; + case PILATUS: + outfile << "Detector Pilatus" << endl; + break; + case EIGER: + outfile << "Detector EIGER" << endl; + break; + case GOTTHARD: + outfile << "Detector Gotthard" << endl; + break; + case AGIPD: + outfile << "Detector Agipd" << endl; + break; + default: + outfile << "Detector Generic" << endl; + break; + + } + if (controlSocket) + outfile << "ControlPort " << controlSocket->getPortNumber() << endl; + if (stopSocket) + outfile << "StopPort " << stopSocket->getPortNumber() << endl; + if (dataSocket) + outfile << "DataPort" << dataSocket->getPortNumber() << endl; + outfile << "TrimBitDir " << thisDetector->trimDir << endl; + outfile << "TrimBitEnergies" ; + for (int ien=0; ien< thisDetector->nTrimEn; ien++) + outfile << " " << thisDetector->trimEnergies[ien]<< endl; + outfile << endl; + outfile << "CalDir " << thisDetector->calDir << endl; + // outfile << "BadChanList " << thisDetector->badChanFile << endl; + //outfile << "AngCal " << thisDetector->angConvFile << endl; + outfile << "AngDirection " << thisDetector->angDirection << endl; + outfile << "FineOffset " << thisDetector->fineOffset<< endl; + outfile << "GlobalOffset " << thisDetector->globalOffset<< endl; + outfile << "ClkDiv " << thisDetector->clkDiv << endl; + } + outfile.close(); + } + else + { + cout << "Error opening configuration file " << fname << " for writing" << endl; + return FAIL; + } + return OK; +}; + /* + It should be possible to dump all the settings of the detector (including trimbits, threshold energy, gating/triggering, acquisition time etc. + in a file and retrieve it for repeating the measurement with identicals ettings, if necessary + */ +/* int mythenDetector::dumpDetectorSetup(string fname){}; + int mythenDetector::retrieveDetectorSetup(string fname){}; +*/ + + + + /* I/O */ + + + sls_detector_module* mythenDetector::readTrimFile(string fname, sls_detector_module *myMod){ + + int nflag=0; + + if (myMod==NULL) { + myMod=createModule(); + nflag=1; + } + string myfname; + string str; + ifstream infile; + ostringstream oss; + int isgood=1; + int iline=0; + string names[]={"Vtrim", "Vthresh", "Rgsh1", "Rgsh2", "Rgpr", "Vcal", "outBuffEnable"}; + string sargname; + int ival; + int ichan=0, ichip=0, idac=0; + + + +#ifdef VERBOSE + cout << "reading trimfile for module number "<< myMod->module << endl; +#endif + //im=myMod->module; + //myMod->module=im; + // myMod->serialnumber=getId(MODULE_SERIAL_NUMBER, im); + // if (im<0) + myfname=fname; + /* else { + // oss << fname << ".sn" << setfill('0') <serialnumber + oss << fname << ".sn" << setfill('0') <module; + myfname=oss.str(); + + }*/ +#ifdef VERBOSE + cout << "trim file name is "<< myfname << endl; +#endif + infile.open(myfname.c_str(), ios_base::in); + if (infile.is_open()) { + // while (infile.good() && isgood==1) { + for (int iarg=0; iargnDacs; iarg++) { + getline(infile,str); + iline++; +#ifdef VERBOSE + // cout << str << endl; +#endif + istringstream ssstr(str); + ssstr >> sargname >> ival; +#ifdef VERBOSE + cout << sargname << " dac nr. " << idac << " is " << ival << endl; +#endif + myMod->dacs[idac]=ival; + idac++; + } + for (ichip=0; ichipnChips; ichip++) { + getline(infile,str); + iline++; +#ifdef VERBOSE + // cout << str << endl; +#endif + istringstream ssstr(str); + ssstr >> sargname >> ival; +#ifdef VERBOSE + // cout << "chip " << ichip << " " << sargname << " is " << ival << endl; +#endif + + myMod->chipregs[ichip]=ival; + for (ichan=0; ichannChans; ichan++) { + getline(infile,str); +#ifdef VERBOSE + // cout << str << endl; +#endif + istringstream ssstr(str); + +#ifdef VERBOSE + // cout << "channel " << ichan+ichip*thisDetector->nChans <<" iline " << iline<< endl; +#endif + iline++; + myMod->chanregs[ichip*thisDetector->nChans+ichan]=0; + for (int iarg=0; iarg<6 ; iarg++) { + ssstr >> ival; + //if (ssstr.good()) { + switch (iarg) { + case 0: +#ifdef VERBOSE + // cout << "trimbits " << ival ; +#endif + myMod->chanregs[ichip*thisDetector->nChans+ichan]|=ival&0x3f; + break; + case 1: +#ifdef VERBOSE + //cout << " compen " << ival ; +#endif + myMod->chanregs[ichip*thisDetector->nChans+ichan]|=ival<<9; + break; + case 2: +#ifdef VERBOSE + //cout << " anen " << ival ; +#endif + myMod->chanregs[ichip*thisDetector->nChans+ichan]|=ival<<8; + break; + case 3: +#ifdef VERBOSE + //cout << " calen " << ival ; +#endif + myMod->chanregs[ichip*thisDetector->nChans+ichan]|=ival<<7; + break; + case 4: +#ifdef VERBOSE + //cout << " outcomp " << ival ; +#endif + myMod->chanregs[ichip*thisDetector->nChans+ichan]|=ival<<10; + break; + case 5: +#ifdef VERBOSE + //cout << " counts " << ival << endl; +#endif + myMod->chanregs[ichip*thisDetector->nChans+ichan]|=ival<<11; + break; + default: + cout << " too many columns" << endl; + break; + } + } + } + // } + } +#ifdef VERBOSE + cout << "read " << ichan*ichip << " channels" <nChans; ichan++) { + iv=mod.chanregs[ichip*thisDetector->nChans+ichan]; + iv1= (iv&0x3f); + outfile <>nb); + outfile << iv1 << " "; + nb=8; + iv1=((iv&(1<>nb); + outfile << iv1 << " "; + nb=7; + iv1=((iv&(1<>nb); + outfile <>nb); + outfile << iv1 << " "; + nb=11; + iv1= ((iv&0xfffff800)>>nb); + outfile << iv1 << endl; + } + } + outfile.close(); + return OK; + } else { + cout << "could not open file " << fname << endl; + return FAIL; + } + +}; + + + + +int mythenDetector::writeTrimFile(string fname, int imod){ + + return writeTrimFile(fname,detectorModules[imod]); + +}; + + +int mythenDetector::writeDataFile(string fname, float *data, float *err, float *ang, char dataformat, int nch){ + if (nch==-1) + nch=thisDetector->nChans*thisDetector->nChips*thisDetector->nMods; + + + ofstream outfile; + int idata; + if (data==NULL) + return FAIL; +#ifdef VERBOSE + cout << "writing data to file " << fname << endl; +#endif + // args|=0x10; // one line per channel! + + outfile.open (fname.c_str(),ios_base::out); + if (outfile.is_open()) + { +#ifdef VERBOSE + cout << "Writing to file " << fname << endl; +#endif + for (int ichan=0; ichannChans*thisDetector->nChips*thisDetector->nMods; ichan++) + outfile << ichan << " " << *(data+ichan) << endl; + outfile.close(); + return OK; + } else { + cout << "Could not open file " << fname << "for writing"<< endl; + return FAIL; + } +}; + + + + + +int mythenDetector::readDataFile(string fname, float *data, float *err, float *ang, char dataformat, int nch){ + + + ifstream infile; + int ichan, iline=0; + int interrupt=0; + float fdata, ferr, fang; + int maxchans; + int ich; + string str; + + if (nch==0) + maxchans=thisDetector->nChans*thisDetector->nChips*thisDetector->nMods; + else if (nch<0) + maxchans=0xfffffff; + else + maxchans=nch; + +#ifdef VERBOSE + cout << "Opening file "<< fname << endl; +#endif + infile.open(fname.c_str(), ios_base::in); + if (infile.is_open()) { + while (infile.good() and interrupt==0) { + getline(infile,str); +#ifdef VERBOSE + cout << str << endl; +#endif + istringstream ssstr(str); + if (ang==NULL) { + ssstr >> ichan >> fdata; + ich=ichan; + if (ich!=iline) + cout << "Channel number " << ichan << " does not match with line number " << iline << endl; + } else { + ssstr >> fang >> fdata; + ich=iline; + } + if (!ssstr.good()) { + interrupt=1; + break; + } + if (err) + ssstr >> ferr; + if (!ssstr.good()) { + interrupt=1; + break; + } + if (ich> ichan >> idata; + if (!ssstr.good()) { + interrupt=1; + break; + } + if (ichan!=iline) { + cout << " Expected channel "<< iline <<" but read channel "<< ichan << endl; + interrupt=1; + break; + } else { + if (ilinenChans*thisDetector->nChips*thisDetector->nMods) { + data[iline]=idata; + iline++; + } else { + interrupt=1; + break; + } + } + } + } else { + cout << "Could not read file " << fname << endl; + return -1; + } + return iline; +}; + + + + +int mythenDetector::readCalibrationFile(string fname, float &gain, float &offset){ + + char line[500]; + string str; + ifstream infile; +#ifdef VERBOSE + cout << "Opening file "<< fname << endl; +#endif + infile.open(fname.c_str(), ios_base::in); + if (infile.is_open()) { + getline(infile,str); +#ifdef VERBOSE + cout << str << endl; +#endif + istringstream ssstr(str); + ssstr >> offset >> gain; + } else { + cout << "Could not open calibration file "<< fname << endl; + gain=0.; + offset=0.; + return -1; + } + return 0; +}; +/* +int mythenDetector::writeCalibrationFile(string fname, float gain, float offset){}; +*/ + /* Communication to server */ + + + + // calibration functions +/* + really needed? + +int mythenDetector::setCalibration(int imod, detectorSettings isettings, float gain, float offset){ + cout << "function not yet implemented " << endl; + + + + return OK; + +} +int mythenDetector::getCalibration(int imod, detectorSettings isettings, float &gain, float &offset){ + + cout << "function not yet implemented " << endl; + + + +} +*/ + +/* + +int mythenDetector::setROI(int nroi, int *xmin, int *xmax, int *ymin, int *ymax){ + + +}; +*/ + +//Corrections + +int mythenDetector::setAngularConversion(string fname) { + if (fname=="") { + thisDetector->correctionMask&=~(1<< ANGULAR_CONVERSION); + } else { + if (fname=="default") + fname=thisDetector->angConvFile; + if (readAngularConversion(fname)>=0) { + thisDetector->correctionMask|=(1<< ANGULAR_CONVERSION); + strcpy(thisDetector->angConvFile,fname.c_str()); + } + } + return thisDetector->correctionMask&(1<< ANGULAR_CONVERSION); } +int mythenDetector::getAngularConversion(int &direction, angleConversionConstant *angconv) { + direction=thisDetector->angDirection; + if (angconv) { + for (int imod=0; imodnMods; imod++) { + (angconv+imod)->center=thisDetector->angOff[imod].center; + (angconv+imod)->r_conversion=thisDetector->angOff[imod].r_conversion; + (angconv+imod)->offset=thisDetector->angOff[imod].offset; + (angconv+imod)->ecenter=thisDetector->angOff[imod].ecenter; + (angconv+imod)->er_conversion=thisDetector->angOff[imod].er_conversion; + (angconv+imod)->eoffset=thisDetector->angOff[imod].eoffset; + } + } + if (thisDetector->correctionMask&(1<< ANGULAR_CONVERSION)) { + return 1; + } else { + return 0; + } + +} + + + +int mythenDetector::readAngularConversion(string fname) { + char line[500]; + string str; + ifstream infile; + int mod; + float center, ecenter; + float r_conv, er_conv; + float off, eoff; + string ss; + int interrupt=0; + + //" module %i center %E +- %E conversion %E +- %E offset %f +- %f \n" +#ifdef VERBOSE + cout << "Opening file "<< fname << endl; +#endif + infile.open(fname.c_str(), ios_base::in); + if (infile.is_open()) { + while (infile.good() and interrupt==0) { + getline(infile,str); +#ifdef VERBOSE + cout << str << endl; +#endif + istringstream ssstr(str); + ssstr >> ss >> mod; + ssstr >> ss >> center; + ssstr >> ss >> ecenter; + ssstr >> ss >> r_conv; + ssstr >> ss >> er_conv; + ssstr >> ss >> off; + ssstr >> ss >> eoff; + if (modnModsMax && mod>=0) { + thisDetector->angOff[mod].center=center; + thisDetector->angOff[mod].r_conversion=r_conv; + thisDetector->angOff[mod].offset=off; + thisDetector->angOff[mod].ecenter=ecenter; + thisDetector->angOff[mod].er_conversion=er_conv; + thisDetector->angOff[mod].eoffset=eoff; + } + } + } else { + cout << "Could not open calibration file "<< fname << endl; + return -1; + } + return 0; +} + + +int mythenDetector:: writeAngularConversion(string fname) { + ofstream outfile; + outfile.open (fname.c_str(),ios_base::out); + if (outfile.is_open()) + { + for (int imod=0; imodnMods; imod++) { + outfile << " module " << imod << " center "<< thisDetector->angOff[imod].center<<" +- "<< thisDetector->angOff[imod].ecenter<<" conversion "<< thisDetector->angOff[imod].r_conversion << " +- "<< thisDetector->angOff[imod].er_conversion << " offset "<< thisDetector->angOff[imod].offset << " +- "<< thisDetector->angOff[imod].eoffset << endl; + } + outfile.close(); + } else { + cout << "Could not open file " << fname << "for writing"<< endl; + return -1; + } + //" module %i center %E +- %E conversion %E +- %E offset %f +- %f \n" + return 0; +} + +int mythenDetector::resetMerging(float *mp, float *mv, float *me, int *mm) { + + float binsize; + if (thisDetector->binSize>0) + binsize=thisDetector->binSize; + else + return FAIL; + + for (int ibin=0; ibin<(360./binsize); ibin++) { + mp[ibin]=0; + mv[ibin]=0; + me[ibin]=0; + mm[ibin]=0; + } + return OK; +} + + +int mythenDetector::finalizeMerging(float *mp, float *mv, float *me, int *mm) { + float binsize; + int np=0; + + if (thisDetector->binSize>0) + binsize=thisDetector->binSize; + else + return FAIL; + + for (int ibin=0; ibin<(360./binsize); ibin++) { + if (mm[ibin]>0) { + mp[np]=mp[ibin]/mm[ibin]; + mv[np]=mv[ibin]/mm[ibin]; + me[np]=me[ibin]/mm[ibin]; + me[np]=sqrt(me[ibin]); + mm[np]=mm[ibin]; + np++; + } + } + return OK; +} + +int mythenDetector::addToMerging(float *p1, float *v1, float *e1, float *mp, float *mv,float *me, int *mm) { + + float binsize; + float binmi=-180., binma; + int ibin=0; + int imod; + float ang; + + if (thisDetector->binSize>0) + binsize=thisDetector->binSize; + else + return FAIL; + binmi=-180.; + binma=binmi+binsize; + + + if (thisDetector->angDirection>0) { + for (int ip=0; ipnChans*thisDetector->nChips*thisDetector->nMods; ip++) { + if (thisDetector->correctionMask&DISCARD_BAD_CHANNELS) { + if (badChannelMask[ip]) + continue; + } + imod=ip/(thisDetector->nChans*thisDetector->nChips); + if (p1) + ang=p1[ip]; + else + ang=angle(ip,currentPosition,thisDetector->fineOffset+thisDetector->globalOffset,thisDetector->angOff[imod].r_conversion,thisDetector->angOff[imod].center, thisDetector->angOff[imod].offset,thisDetector->angOff[imod].tilt,thisDetector->angDirection); + + + + while (binmanChans*thisDetector->nChips*thisDetector->nMods-1; ip>=0; ip--) { + if (thisDetector->correctionMask&(1<< DISCARD_BAD_CHANNELS)) { + if (badChannelMask[ip]) + continue; + } + + while (binmanumberOfPositions>0) + np=thisDetector->numberOfPositions; + + currentPositionIndex=0; + + for (int ip=0; ipnumberOfPositions>0) { + go_to_position (thisDetector->detPositions[ip]); + currentPositionIndex=ip+1; + } + //write header before? + startAndReadAll(); + if (thisDetector->correctionMask&(1<< I0_NORMALIZATION)) + currentI0=get_i0(); + //write header after? + if (thisDetector->correctionMask&(1<< ANGULAR_CONVERSION)) + currentPosition=get_position(); + + processData(); + } +} + + +void* mythenDetector::processData() { + + + int *myData; + float *fdata; + // float *dataout=new float[thisDetector->nChans*thisDetector->nChips*thisDetector->nMods]; + float *rcdata=NULL, *rcerr=NULL; + float *ffcdata=NULL, *ffcerr=NULL; + float *ang=NULL; + float bs=0.004; + int i=0; + int imod; + int nb; + int np; + while(1) { + + + if( !dataQueue.empty() ) { + + /** Pop data queue */ + myData=dataQueue.front(); // get the data from the queue + dataQueue.pop(); //remove the data from the queue + if (myData) { + //process data + + /** decode data */ + fdata=decodeData(myData); + + delete [] myData; + myData=NULL; + /** write raw data file */ + writeDataFile (createFileName().append(".raw"), fdata, NULL, NULL, 'i'); + + /** rate correction */ + if (thisDetector->correctionMask&(1<nChans*thisDetector->nChips*thisDetector->nMods]; + rcerr=new float[thisDetector->nChans*thisDetector->nChips*thisDetector->nMods]; + rateCorrect(fdata,NULL,rcdata,rcerr); + delete [] fdata; + } else { + rcdata=fdata; + fdata=NULL; + } + + /** flat field correction */ + if (thisDetector->correctionMask&(1<nChans*thisDetector->nChips*thisDetector->nMods]; + ffcerr=new float[thisDetector->nChans*thisDetector->nChips*thisDetector->nMods]; + flatFieldCorrect(rcdata,rcerr,ffcdata,ffcerr); + delete [] rcdata; + delete [] rcerr; + } else { + ffcdata=rcdata; + ffcerr=rcerr; + rcdata=NULL; + rcerr=NULL; + } + + if (thisDetector->correctionMask&(1<< ANGULAR_CONVERSION)) { + + /** angular conversion */ + /** data merging */ + // if (thisDetector->numberOfPositions) { + + if (currentPositionIndex<=1) { + if (thisDetector->binSize>0) + bs=thisDetector->binSize; + else if (thisDetector->angOff[0].r_conversion>0) { + bs=180./PI*atan(thisDetector->angOff[0].r_conversion); + thisDetector->binSize=bs; + } else + thisDetector->binSize=bs; + + + nb=360./bs; + + mergingBins=new float[nb]; + mergingCounts=new float[nb]; + mergingErrors=new float[nb]; + mergingMultiplicity=new int[nb]; + + resetMerging(mergingBins, mergingCounts,mergingErrors, mergingMultiplicity); + } + addToMerging(ang, ffcdata, ffcerr, mergingBins, mergingCounts,mergingErrors, mergingMultiplicity); + + ang=new float[thisDetector->nChans*thisDetector->nChips*thisDetector->nMods]; + for (int ip=0; ipnChans*thisDetector->nChips*thisDetector->nMods; ip++) { + imod=ip/(thisDetector->nChans*thisDetector->nChips); + ang[ip]=angle(ip,currentPosition,thisDetector->fineOffset+thisDetector->globalOffset,thisDetector->angOff[imod].r_conversion,thisDetector->angOff[imod].center, thisDetector->angOff[imod].offset,thisDetector->angOff[imod].tilt,thisDetector->angDirection); + } + writeDataFile (createFileName().append(".dat"), ffcdata, ffcerr,ang); + if (currentPositionIndex==thisDetector->numberOfPositions || (currentPositionIndex==0) { + + np=finalizeMerging(mergingBins, mergingCounts,mergingErrors, mergingMultiplicity); + + /** file writing */ + currentPositionIndex++; + writeDataFile (createFileName().append(".dat"),mergingCounts, mergingErrors, mergingBins,'f',np); + + delete [] mergingBins; + delete [] mergingCounts; + delete [] mergingErrors; + delete [] mergingMultiplicity; + thisDetector->fileIndex++; + + } + //} + + } else { + writeDataFile (createFileName().append(".dat"), ffcdata, ffcerr); + thisDetector->fileIndex++; + } + + if (ffcdata) + delete [] ffcdata; + if (ffcerr) + delete [] ffcerr; + if (ang) + delete [] ang; + + } + } + } +} + + +/* +void mythenDetector::startThread() { + pthread_attr_t tattr, mattr; + int ret; + int newprio; + sched_param param, mparam; + void *arg; + int policy= SCHED_OTHER; + + ret = pthread_attr_init(&tattr); + + // set the priority; others are unchanged + //newprio = 30; + mparam.sched_priority = 30; + // scheduling parameters of main thread + ret = pthread_setschedparam(pthread_self(), policy, &mparam); + + + printf("current priority is %d\n",param.sched_priority); + ret = pthread_create(&dataProcessingThread, NULL,startProcessData, (void*)this); + + + param.sched_priority = 1; + // scheduling parameters of target thread + ret = pthread_setschedparam(dataProcessingThread, policy, ¶m); + + +} + +void* startProcessData(void *n) { + + //void* processData(void *n) { + void *w; + mythenDetector *myDet=(mythenDetector*)n; + myDet->processData(0); +} +*/ diff --git a/slsDetectorSoftware/mythenDetector/mythenDetector.h b/slsDetectorSoftware/mythenDetector/mythenDetector.h index a1c4281f4..0ddfb9324 100644 --- a/slsDetectorSoftware/mythenDetector/mythenDetector.h +++ b/slsDetectorSoftware/mythenDetector/mythenDetector.h @@ -4,43 +4,70 @@ #ifndef MYTHEN_DETECTOR_H #define MYTHEN_DETECTOR_H -using namespace std; - - - -/** - * - * -@libdoc The mythenDetector class contains the functions specific to the mythen detector - * - * @short This calss contains all mythen specific functions - * @author Anna Bergamaschi - * @version 0.1alpha (any string) - - - */ #include "slsDetector.h" +#define defaultTDead {170,90,750} + +using namespace std; +/** + \mainpage C++ class with MYTHEN specific functions + * + + + @author Anna Bergamaschi + +*/ + + + class mythenDetector : public slsDetector{ public: - - - -/** (default) constructor - - \param id is the detector index which is needed to define the shared memory id. Different physical detectors should have different IDs in order to work independently - - +/** + (default) constructor */ - mythenDetector(int id=0); + mythenDetector(int id=0) : slsDetector(MYTHEN, id); //slsDetector(string const fname); + // ~slsDetector(){while(dataQueue.size()>0){}}; /** destructor */ ~mythenDetector(){}; + int readConfigurationFile(string const fname); + /** + Every detector should have a basic configuration file containing: + type (mythen, pilatus etc.) + hostname + portnumber + communication type (default TCP/IP) + eventually secondary portnumber (e.g. mythen stop function) + number of modules installed if different from the detector size (x,y) + + to be changed + */ + int writeConfigurationFile(string const fname); + + + /* + It should be possible to dump all the settings of the detector (including trimbits, threshold energy, gating/triggering, acquisition time etc. + in a file and retrieve it for repeating the measurement with identicals ettings, if necessary + */ + /** + not yet implemented + + should dump to a file all the current detector parameters + */ + int dumpDetectorSetup(string const fname); + /** + not yet implemented + + should retrieve from a file all the current detector parameters + */ + int retrieveDetectorSetup(string const fname); + + /** reads a trim file @@ -70,7 +97,6 @@ class mythenDetector : public slsDetector{ */ int writeTrimFile(string fname, int imod); - /** writes a data file \param name of the file to be written @@ -117,20 +143,15 @@ class mythenDetector : public slsDetector{ */ int readDataFile(string fname, int *data); - /** - returns the location of the calibration files - \sa sharedSlsDetector - */ /** - int readCalibrationFile(string fname, float &gain, float &offset); + reads a calibration file \param fname file to be read \param gain reference to the gain variable \offset reference to the offset variable \sa sharedSlsDetector */ int readCalibrationFile(string fname, float &gain, float &offset); - /** writes a clibration file \param fname file to be written @@ -153,12 +174,12 @@ class mythenDetector : public slsDetector{ \sa angleConversionConstant */ int writeAngularConversion(string fname=""); - - /* Communication to server */ - // Tests and identification + + //Corrections + /** set angular conversion @@ -175,6 +196,10 @@ class mythenDetector : public slsDetector{ */ int getAngularConversion(int &direction, angleConversionConstant *angconv=NULL); + + /** returns the angular conversion file */ + char *getAngularConversion() {return thisDetector->angConvFile;}; + /** set detector global offset */ @@ -216,21 +241,16 @@ class mythenDetector : public slsDetector{ - - - - /** - decode data from the detector converting them to an array of floats, one for each channle - \param datain data from the detector - \returns pointer to a float array with a data per channel + + /** sets the arrays of the merged data to 0. NB The array should be created with size >= 360./getBinSize(); + \param mp already merged postions + \param mv already merged data + \param me already merged errors (squared sum) + \param mm multiplicity of merged arrays + \returns OK or FAIL */ - float* decodeData(int *datain); - - - int resetMerging(float *mp, float *mv,float *me, int *mm); - /** not yet implemented - merge dataset + /** merge dataset \param p1 angular positions of dataset \param v1 data \param e1 errors @@ -251,10 +271,22 @@ class mythenDetector : public slsDetector{ */ int finalizeMerging(float *mp, float *mv,float *me, int *mm); - - private: - + /** + function for processing data + */ + void* processData(); // thread function + + /** performs the complete acquisition and data processing + moves the detector to next position
    + starts and reads the detector
    + reads the IC (if required)
    + reads the encoder (iof required for angualr conversion)
    + processes the data (flat field, rate, angular conversion and merging ::processData()) + */ + + void acquire(); + }; diff --git a/slsDetectorSoftware/mythenDetectorServer/Makefile b/slsDetectorSoftware/mythenDetectorServer/Makefile index 63658adc5..94e7ef09d 100755 --- a/slsDetectorSoftware/mythenDetectorServer/Makefile +++ b/slsDetectorSoftware/mythenDetectorServer/Makefile @@ -13,8 +13,8 @@ INSTMODE= 0777 SRCS= server.c server_funcs.c communication_funcs.c firmware_funcs.c mcb_funcs.c trimming_funcs.c sharedmemory.c OBJS= $(SRCS:%.c=%.o) -CFLAGS+= -Wall -DC_ONLY -DMCB_FUNCS -# -DVERBOSE +CFLAGS+= -Wall -DC_ONLY -DMCB_FUNCS -DVERBOSE +# -DVERYVERBOSE #-Werror LDLIBS+= -lm @@ -25,7 +25,7 @@ boot: $(OBJS) $(PROGS): $(OBJS) echo $(OBJS) - $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@ + $(CC) $(LDFLAGS) $^ $(LDLIBS) $(CFLAGS) -o $@ install: $(PROGS) $(INSTALL) -d $(INSTDIR) diff --git a/slsDetectorSoftware/mythenDetectorServer/firmware_funcs.c b/slsDetectorSoftware/mythenDetectorServer/firmware_funcs.c index 40c8f706b..2a44ef11e 100755 --- a/slsDetectorSoftware/mythenDetectorServer/firmware_funcs.c +++ b/slsDetectorSoftware/mythenDetectorServer/firmware_funcs.c @@ -179,7 +179,7 @@ u_int32_t setWaitStates(int d1) { u_int32_t c; int d=d1-2; char cmd[100]; - sprintf(cmd,"bus -a 0xb0000000 -w 0xd000%1x",d1); + sprintf(cmd,"bus -a 0xb0000000 -w 0x%x0008",d1); c=bus_r(SPEED_REG); bus_w(SPEED_REG,(d<>ichan)&0xf; dataout[ichan]=(iptr>>(ipos))&0x1; ichan++; } @@ -709,7 +727,6 @@ u_int32_t* decode_data(int *datain) for (ibyte=0; ibyte>ichan)&0xf; dataout[ichan]=(iptr>>(ipos*4))&0xf; ichan++; } @@ -731,7 +748,7 @@ u_int32_t* decode_data(int *datain) break; default: for (ichan=0; ichan0) { if (dr<=1) { dynamicRange=1; @@ -850,20 +861,31 @@ int setStoreInRAM(int b) { int allocateRAM() { size_t size; - + u_int32_t nt, nf; + nt=setTrains(-1); + nf=setFrames(-1); + if (nt==0) nt=1; + if (nf==0) nf=1; // ret=clearRAM(); if (storeInRAM) { - size=dataBytes*setFrames(-1); -#ifdef VERBOSE - // printf("nmodx=%d nmody=%d dynamicRange=%d dataBytes=%d nFrames=%d size=%d\n",nModX,nModY,dynamicRange,dataBytes,setFrameNumber(-1),size ); -#endif + size=dataBytes*nf*nt; if (sizemodule=imod; (detectorModules+imod)->gain=0; (detectorModules+imod)->offset=0; + (detectorModules+imod)->reg=0; /* initialize registers, dacs, retrieve sn, adc values etc */ } thisSettings=UNINITIALIZED; @@ -89,7 +92,9 @@ int initDetector() { putout("0000000000000000",ALLMOD); /* initialize dynamic range etc. */ - nModX=n; + nModX=n; + dataBytes=nModX*NCHIP*NCHAN*4; + dynamicRange=32; initChip(0, 1,ALLMOD); // allocateRAM(); @@ -135,13 +140,24 @@ int copyModule(sls_detector_module *destMod, sls_detector_module *srcMod) { int ichip, idac, ichan, iadc; - int ret=FAIL; - if (srcMod->module>=0) - destMod->module=srcMod->module; + int ret=OK; - if (srcMod->serialnumber>=0) +#ifdef VERBOSE + printf("Copying module %x to module %x\n",srcMod,destMod); +#endif + + if (srcMod->module>=0) { +#ifdef VERBOSE + printf("Copying module number %d to module number %d\n",srcMod->module,destMod->module); +#endif + destMod->module=srcMod->module; + } + if (srcMod->serialnumber>=0){ +/* #ifdef VERBOSE */ +/* printf("Copying module serial number %x to module serial number %x\n",srcMod->serialnumber,destMod->serialnumber); */ +/* #endif */ destMod->serialnumber=srcMod->serialnumber; - + } if ((srcMod->nchip)>(destMod->nchip)) { printf("Number of chip of source is larger than number of chips of destination\n"); return FAIL; @@ -158,13 +174,26 @@ int copyModule(sls_detector_module *destMod, sls_detector_module *srcMod) { printf("Number of dacs of source is larger than number of dacs of destination\n"); return FAIL; } + +#ifdef VERBOSE + printf("DACs: src %d, dest %d\n",srcMod->ndac,destMod->ndac); + printf("ADCs: src %d, dest %d\n",srcMod->nadc,destMod->nadc); + printf("Chips: src %d, dest %d\n",srcMod->nchip,destMod->nchip); + printf("Chans: src %d, dest %d\n",srcMod->nchan,destMod->nchan); + +#endif + + + destMod->ndac=srcMod->ndac; destMod->nadc=srcMod->nadc; destMod->nchip=srcMod->nchip; destMod->nchan=srcMod->nchan; if (srcMod->reg>=0) destMod->reg=srcMod->reg; - +#ifdef VERBOSE + printf("Copying register %x (%x)\n",destMod->reg,srcMod->reg ); +#endif if (srcMod->gain>=0) destMod->gain=srcMod->gain; if (srcMod->offset>=0) @@ -188,7 +217,6 @@ int copyModule(sls_detector_module *destMod, sls_detector_module *srcMod) { if (*((srcMod->adcs)+iadc)>=0) *((destMod->adcs)+iadc)=*((srcMod->adcs)+iadc); } - return ret; } @@ -440,13 +468,13 @@ int program_one_dac(int addr, int value, int imod) { // myMod=detectorModules+imod; //(detectorModules+imod)->dacs[idac]=v; #ifdef VERBOSE - printf("module=%d index=%d, val=%d\n",imod, idac, v); + printf("module=%d index=%d, val=%d addr=%x\n",imod, idac, v, detectorDacs+idac+NDAC*imod); #endif detectorDacs[idac+NDAC*imod]=v; } else if (imod==ALLMOD) { for (im=0; imdacs[idac]=v; @@ -642,10 +670,12 @@ int setThresholdEnergy(int ethr) { float getDACbyIndexDACU(int ind, int imod) { - if (detectorDacs) - return (detectorDacs[ind+imod*NDAC]); - else - return FAIL; + if (detectorDacs) { + if (imodndac) + return (detectorDacs[ind+imod*NDAC]); + } + return FAIL; } @@ -725,9 +755,9 @@ int setSettings(int i) { v[RGPR]=rgpr[i]; v[RGSH1]=rgsh1[i]; v[RGSH2]=rgsh2[i]; - break; initDACs(v,ALLMOD); thisSettings=i; + break; default: break; } @@ -743,13 +773,19 @@ int setSettings(int i) { isett=is; } } - for (imod=1; imodchip; ichan=myChan->chan; - if (detectorChans) - myChan->reg=detectorChans[imod*NCHAN*NCHIP+ichip*NCHAN+ichan]; - else - return FAIL; - return OK; + if (detectorChans) { + if (imodnchip && ichan<(detectorModules+imod)->nchan/(detectorModules+imod)->nchip) + myChan->reg=detectorChans[imod*NCHAN*NCHIP+ichip*NCHAN+ichan]; + return OK; + } + } + return FAIL; } + int getTrimbit(int imod, int ichip, int ichan) { - if (detectorChans) - return (detectorChans[imod*NCHAN*NCHIP+ichip*NCHAN+ichan] & TRIM_DR); - else + if (detectorChans) { + if (imodnchip && ichan<(detectorModules+imod)->nchan/(detectorModules+imod)->nchip) + return (detectorChans[imod*NCHAN*NCHIP+ichip*NCHAN+ichan] & TRIM_DR); + } else return -1; } @@ -875,10 +917,12 @@ int initChannel(int ft,int cae, int ae, int coe, int ocoe, int counts, int imod) for (im=modmi; imchip; if (detectorChips) { - myChip->reg=detectorChips[ichip+imod*NCHIP]; - myChip->nchan=NCHAN; - myChip->chanregs=detectorChans+imod*NCHAN*NCHIP+ichip*NCHIP; + if (imodnchip) { + myChip->reg=detectorChips[ichip+imod*NCHIP]; + myChip->nchan=NCHAN; + myChip->chanregs=detectorChans+imod*NCHAN*NCHIP+ichip*NCHIP; + return OK; + } } - return OK; + return FAIL; } @@ -1208,9 +1256,9 @@ int initChip(int obe, int ow,int imod){ for (ichip=chipmi; ichip-2) { - sprintf(mess,"no data and run stopped: %d frames left\n",getFrames()+2); - } else { - strcpy(mess,"acquisition successfully finished\n"); - } + dataret=FAIL; + sprintf(mess,"no data and run stopped: %d frames left\n",getFrames()+2); #ifdef VERBOSE - printf(mess); + printf("%s\n",mess); #endif - sendDataOnly(mess,sizeof(mess)); -#ifdef VERBOSE + } else { + dataret=FINISHED; + sprintf(mess,"acquisition successfully finished\n"); + } +#ifdef VERYVERBOSE + printf("%d %d %x %s\n",strlen(mess)+1,strlen(mess), mess,mess); +#endif + sendDataOnly(&dataret,sizeof(dataret)); + sendDataOnly(mess,strlen(mess)+1);//sizeof(mess)); +#ifdef VERYVERBOSE printf("message sent\n",mess); #endif return dataret; @@ -1663,20 +1671,24 @@ int read_frame(int fnum) { #endif for (iframes=0; iframes-2) + if (getFrames()>-2) { + dataret=FAIL; sprintf(mess,"no data and run stopped: %d frames left\n",getFrames()+2); - else + } else { + dataret=FINISHED; sprintf(mess,"acquisition successfully finished\n"); - + } #ifdef VERBOSE printf("Frames left %d\n",getFrames()); #endif - dataret=FAIL; sendDataOnly(&dataret,sizeof(dataret)); - sendDataOnly(mess,sizeof(mess)); + sendDataOnly(mess,strlen(mess)+1); return dataret; } @@ -1719,7 +1731,7 @@ int start_and_read_all(int fnum) { if (ret!=OK) { sprintf(mess,"could not start state machine\n"); sendDataOnly(&ret,sizeof(ret)); - sendDataOnly(mess,sizeof(mess)); + sendDataOnly(mess,strlen(mess)+1); #ifdef VERBOSE printf("could not start state machine\n"); @@ -1747,7 +1759,6 @@ int set_timer(int fnum) { sprintf(mess,"can't set timer\n"); - n = receiveDataOnly(&ind,sizeof(ind)); if (n < 0) { sprintf(mess,"Error reading from socket\n"); @@ -1760,6 +1771,9 @@ int set_timer(int fnum) { ret=FAIL; } + if (ret!=OK) { + printf(mess); + } #ifdef VERBOSE printf("setting timer %d to %lld ns\n",ind,tns); @@ -1792,15 +1806,18 @@ int set_timer(int fnum) { sprintf(mess,"timer index unknown %d\n",ind); } } - - if (tns>=0 && retval!=tns && (retval+1)!=tns) { - printf("wrote %lld, read %lld\n",tns,retval); - ret=FAIL; - } if (ret!=OK) { + printf(mess); + } + //if (tns>=0 && retval!=tns && (retval+1)!=tns) { + // printf("wrote %lld, read %lld\n",tns,retval); + // ret=FAIL; + // } + if (ret!=OK) { + printf(mess); printf("set timer failed\n"); sprintf(mess, "set timer %d failed\n", ind); - } else if (ind==FRAME_NUMBER){ + } else if (ind==FRAME_NUMBER) { ret=allocateRAM(); if (ret!=OK) sprintf(mess, "could not allocate RAM for %lld frames\n", tns); @@ -1812,7 +1829,7 @@ int set_timer(int fnum) { printf("returning error\n"); #endif - n = sendDataOnly(mess,sizeof(mess)); + n = sendDataOnly(mess,strlen(mess)+1); } else { #ifdef VERBOSE printf("returning ok %d\n",sizeof(retval)); @@ -1888,7 +1905,7 @@ int get_time_left(int fnum) { n = sendDataOnly(&ret,sizeof(ret)); if (ret!=OK) { - n += sendDataOnly(mess,sizeof(mess)); + n += sendDataOnly(mess,strlen(mess)+1); } else { n = sendDataOnly(&retval,sizeof(retval)); } @@ -1963,7 +1980,7 @@ int set_dynamic_range(int fnum) { n = sendDataOnly(&ret,sizeof(ret)); if (ret!=OK) { - n = sendDataOnly(mess,sizeof(mess)); + n = sendDataOnly(mess,strlen(mess)+1); } else { n = sendDataOnly(&retval,sizeof(retval)); } @@ -2004,8 +2021,8 @@ int set_readout_flags(int fnum) { printf("setting readout flags to %d\n",arg); #endif - ret=setStoreInRAM(0); - initChipWithProbes(0,0,0, ALLMOD); + //ret=setStoreInRAM(0); + // initChipWithProbes(0,0,0, ALLMOD); switch(arg) { case STORE_IN_RAM: ret=setStoreInRAM(1); @@ -2013,10 +2030,9 @@ int set_readout_flags(int fnum) { case PUMP_PROBE_MODE: //set number of probes initChipWithProbes(0,0,2, ALLMOD); - // setExtSignal(0,GATE_IN_ACTIVE_HIGH); - // setExtSignal(0,TRIGGER_IN_RISING_EDGE); break; default: + ret=setStoreInRAM(0); ret=OK; } if (storeInRAM) @@ -2032,7 +2048,7 @@ int set_readout_flags(int fnum) { } n = sendDataOnly(&ret,sizeof(ret)); if (ret!=OK) { - n = sendDataOnly(mess,sizeof(mess)); + n = sendDataOnly(mess,strlen(mess)+1); } else { n = sendDataOnly(&retval,sizeof(retval)); } @@ -2115,7 +2131,7 @@ int execute_trimming(int fnum) { } n = sendDataOnly(&ret,sizeof(ret)); if (ret!=OK) { - n = sendDataOnly(mess,sizeof(mess)); + n = sendDataOnly(mess,strlen(mess)+1); } return ret; diff --git a/slsDetectorSoftware/mythenDetectorServer/trimming_funcs.c b/slsDetectorSoftware/mythenDetectorServer/trimming_funcs.c index 5af595352..e9d6f31e2 100755 --- a/slsDetectorSoftware/mythenDetectorServer/trimming_funcs.c +++ b/slsDetectorSoftware/mythenDetectorServer/trimming_funcs.c @@ -164,7 +164,7 @@ int choose_vthresh_and_vtrim(int countlim, int nsigma, int im) { int *trim; int ich, imod, ichan; int nvalid=0; - int *scan; + u_int32_t *scan; int ithr; @@ -307,7 +307,8 @@ int choose_vthresh_and_vtrim(int countlim, int nsigma, int im) { int trim_with_level(int countlim, int im) { int ich, itrim, ichan, ichip, imod; - int *scan, *inttrim; + u_int32_t *scan; + int *inttrim; int modma, modmi, nm; int retval=OK; @@ -349,12 +350,15 @@ int trim_with_level(int countlim, int im) { for (imod=modmi; imodcountlim){ - if (inttrim[ich]==-1) { + if (inttrim[ich]==-1) { + if (scan[ich]>countlim){ inttrim[ich]=itrim; + if (scan[ich]>2*countlim || itrim==0) { #ifdef VERBOSE printf("Channel %d trimbit %d counted %d countlim %d\n",ich,itrim,scan[ich],countlim); #endif + inttrim[ich]=itrim-1; + } } } #ifdef VERBOSE @@ -375,10 +379,14 @@ int trim_with_level(int countlim, int im) { nextStrip(imod); ich=ichan+imod*nChans*nChips+ichip*nChans; if (*(inttrim+ich)==-1) { - *(inttrim+ich)=itrim-1; + *(inttrim+ich)=TRIM_DR; printf("could not trim channel %d chip %d module %d - set to %d\n", ichan, ichip, imod, *(inttrim+ich) ); retval=FAIL; } +#ifdef VERBOSE + else + printf("channel %d trimbit %d\n",ich,*(inttrim+ich) ); +#endif initChannel(inttrim[ich],0,0,1,0,0,imod); } nextChip(imod); @@ -435,7 +443,8 @@ int choose_vthresh() { int retval=OK; #ifdef MCB_FUNCS int imod, ichan; - int *scan, olddiff[nModX], direction[nModX]; + u_int32_t *scan; + int olddiff[nModX], direction[nModX]; int med[nModX], diff, media; int change_flag=1; int iteration=0; @@ -554,7 +563,8 @@ int trim_with_median(int stop, int im) { #ifdef MCB_FUNCS int ichan, imod, ichip, ich; - int *scan, *olddiff, *direction; + u_int32_t *scan; + int *olddiff, *direction; int med, diff; int change_flag=1; int iteration=0; @@ -576,7 +586,16 @@ int trim_with_median(int stop, int im) { olddiff=malloc(4*nModX*nChips*nChans); direction=malloc(4*nModX*nChips*nChans); - + for (imod=modmi; imod0) + if (diff>0) { direction[ichan]=1; - else + } else { direction[ichan]=-1; - } + } + } if ( direction[ichan]!=-3) { if (abs(diff)>abs(olddiff[ichan])) { - printf("%d old diff %d < new diff %d %d\n",ichan, olddiff[ichan], diff, direction[ichan]); trim=getTrimbit(imod,ichip,ich)+direction[ichan]; + printf("%d old diff %d < new diff %d %d - trimbit %d\n",ichan, olddiff[ichan], diff, direction[ichan], trim); direction[ichan]=-3; } else { trim=getTrimbit(imod,ichip,ich)-direction[ichan]; @@ -638,12 +668,12 @@ int trim_with_median(int stop, int im) { } if (trim>TRIM_DR) { trim=63; - printf("can't trim channel %d chip %d module %d\n",ich, ichip, imod); + printf("can't trim channel %d chip %d module %d to trim %d\n",ich, ichip, imod, trim); retval=FAIL; } if (trim<0) { + printf("can't trim channel %d chip %d module %d to trim %d\n",ich, ichip, imod, trim); trim=0; - printf("can't trim channel %d chip %d module %d\n",ich, ichip, imod); retval=FAIL; } initChannel(trim,0,0,1,0,0,imod); diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 9972f76e4..0c993dcd7 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -156,7 +156,10 @@ int slsDetector::initializeDetectorSize(detectorType type) { thisDetector->nMod[Y]=thisDetector->nModMax[Y]; thisDetector->nMods=thisDetector->nModsMax; /** calculates the expected data size */ - thisDetector->dataBytes=thisDetector->nMod[X]*thisDetector->nMod[Y]*thisDetector->nChips*thisDetector->nChans*thisDetector->dynamicRange/8; + if (thisDetector->dynamicRange==24) + thisDetector->dataBytes=thisDetector->nMod[X]*thisDetector->nMod[Y]*thisDetector->nChips*thisDetector->nChans*4; + else + thisDetector->dataBytes=thisDetector->nMod[X]*thisDetector->nMod[Y]*thisDetector->nChips*thisDetector->nChans*thisDetector->dynamicRange/8; /** set trimDsdir, calDir and filePath to default to home directory*/ strcpy(thisDetector->trimDir,getenv("HOME")); strcpy(thisDetector->calDir,getenv("HOME")); @@ -172,6 +175,8 @@ int slsDetector::initializeDetectorSize(detectorType type) { thisDetector->correctionMask=0; /** set deat time*/ thisDetector->tDead=0; + /** sets bad channel list file to none */ + strcpy(thisDetector->badChanFile,"none"); /** set number of bad chans to 0*/ thisDetector->nBadChans=0; /** set number of bad flat field chans to 0*/ @@ -194,6 +199,8 @@ int slsDetector::initializeDetectorSize(detectorType type) { thisDetector->clkDiv=1; /** set number of positions to 0*/ thisDetector->numberOfPositions=0; + /** sets angular conversion file to none */ + strcpy(thisDetector->angConvFile,"none"); /** set binsize*/ thisDetector->binSize=0; @@ -284,7 +291,7 @@ int slsDetector::initializeDetectorStructure() { } } -slsDetector::sls_detector_module* slsDetector::createModule() { +sls_detector_module* slsDetector::createModule() { sls_detector_module *myMod=(sls_detector_module*)malloc(sizeof(sls_detector_module)); float *dacs=new float[thisDetector->nDacs]; @@ -399,245 +406,6 @@ int slsDetector::setOnline(int off) { - - - - - - - - - /* detector configuration (no communication to server) */ - - /* - Every detector should have a basic configuration file containing: - type (mythen, pilatus etc.) - hostname - portnumber - communication type (default TCP/IP) - eventually secondary portnumber (e.g. mythen stop function) - number of modules installed if different from the detector size (x,y) - */ - -int slsDetector::readConfigurationFile(string const fname){ - - char hostname[1000]=DEFAULT_HOSTNAME; - int cport=DEFAULT_PORTNO, sport=DEFAULT_PORTNO+1,dport=-1; - int nmx=-1, nmy=-1; - float angoff=0.; - - - int nnames=14; - string names[]={"Hostname", "NmodX", "NmodY", "Detector", "ControlPort", "StopPort", "DataPort", "TrimBitDir","TrimBitEnergies", "CalDir", "BadChanList", "AngCal", "AngDirection", "FineOffset","GlobalOffset", "ClkDiv"}; - char line[500]; - string str; - ifstream infile; - string::size_type pos; - int iargval; - int interrupt=0; - - string sargname, sargval, dtype; - int iarg; - float farg; - int iline=0; - cout << "config file name "<< fname << endl; - infile.open(fname.c_str(), ios_base::in); - if (infile.is_open()) { - while (infile.good() and interrupt==0) { - sargname="none"; - sargval="0"; - getline(infile,str); - iline++; -#ifdef VERBOSE - // cout << str << endl; -#endif - if (str.find('#')!=string::npos) { - cout << "Line is a comment " << endl; - cout << str << endl; - continue; - } else { - istringstream ssstr(str); - ssstr >> sargname; - if (!ssstr.good()) { -#ifdef VERBOSE - // cout << "bad stream out" << endl; -#endif - interrupt=1; - break; - } else { - for (int iname=0; iname> sargval; - strcpy(hostname,sargval.c_str()); - break; - case 1: - ssstr>> nmx; - break; - case 2: - ssstr >> nmy; - break; - case 3: - ssstr >> dtype; - break; - case 4: - ssstr >> iargval; - cport=iargval; - break; - case 5: - ssstr >> iargval; - sport=iargval; - break; - case 6: - ssstr >> iargval; - dport=iargval; - break; - case 7: - ssstr>> sargval; - strcpy(thisDetector->trimDir,sargval.c_str()); - break; - case 8: - thisDetector->nTrimEn=0; - while (ssstr.good()) { - ssstr >> farg; - thisDetector->trimEnergies[thisDetector->nTrimEn]=farg; -#ifdef VERBOSE - cout << "trimbits acquired at energy " << farg << endl; -#endif - thisDetector->nTrimEn++; - } -#ifdef VERBOSE - cout << "total " << thisDetector->nTrimEn << " trimbitfiles" << endl; -#endif - case 9: - ssstr>> sargval; - strcpy(thisDetector->calDir,sargval.c_str()); - break; - case 10: - ssstr>> sargval; - // strcpy(thisDetector->badChanFile,sargval.c_str()); - break; - case 11: - ssstr>> sargval; - //strcpy(thisDetector->angConvFile,sargval.c_str()); - break; - case 12: - ssstr>> iargval; - thisDetector->angDirection=iargval; - break; - case 13: - ssstr>> farg; - thisDetector->fineOffset=farg; - break; - case 14: - ssstr>> farg; - thisDetector->globalOffset=farg; - break; - case 15: - ssstr>> iargval; - thisDetector->clkDiv=iargval; - break; - default: - cout << "unknown!" << endl; - } - break; - } - } - } - } - } - infile.close(); - } - else - { - cout << "Error opening configuration file " << fname << " for reading" << endl; - return FAIL; - } - - setTCPSocket(hostname,cport,sport,dport); - setDetectorType(dtype); - setNumberOfModules(nmx,X); - setNumberOfModules(nmy,Y); - - return OK; -}; - - -int slsDetector::writeConfigurationFile(string const fname){ - - - string names[]={"Hostname", "NmodX", "NmodY", "Detector", "ControlPort", "StopPort", "DataPort", "TrimBitDir", "TrimBitEnergies","CalDir", "BadChanList", "AngCal", "AngDirection", "AngOffset", "ClkDiv"}; - ofstream outfile; - char hostname[1000]=""; - - - outfile.open (fname.c_str(),ios_base::out); - if (outfile.is_open()) - { - while (outfile.good()) { - if (controlSocket) { - controlSocket->getHostname(hostname); - } - outfile << "Hostname " << hostname << endl; - outfile << "NModX " << setNumberOfModules(GET_FLAG, X) << endl; - outfile << "NModY " << setNumberOfModules(GET_FLAG, Y) << endl; - switch (thisDetector->myDetectorType) { - case MYTHEN: - outfile << "Detector Mythen" << endl; - break; - case PILATUS: - outfile << "Detector Pilatus" << endl; - break; - case EIGER: - outfile << "Detector EIGER" << endl; - break; - case GOTTHARD: - outfile << "Detector Gotthard" << endl; - break; - case AGIPD: - outfile << "Detector Agipd" << endl; - break; - default: - outfile << "Detector Generic" << endl; - break; - - } - if (controlSocket) - outfile << "ControlPort " << controlSocket->getPortNumber() << endl; - if (stopSocket) - outfile << "StopPort " << stopSocket->getPortNumber() << endl; - if (dataSocket) - outfile << "DataPort" << dataSocket->getPortNumber() << endl; - outfile << "TrimBitDir " << thisDetector->trimDir << endl; - outfile << "TrimBitEnergies" ; - for (int ien=0; ien< thisDetector->nTrimEn; ien++) - outfile << " " << thisDetector->trimEnergies[ien]<< endl; - outfile << endl; - outfile << "CalDir " << thisDetector->calDir << endl; - // outfile << "BadChanList " << thisDetector->badChanFile << endl; - //outfile << "AngCal " << thisDetector->angConvFile << endl; - outfile << "AngDirection " << thisDetector->angDirection << endl; - outfile << "FineOffset " << thisDetector->fineOffset<< endl; - outfile << "GlobalOffset " << thisDetector->globalOffset<< endl; - outfile << "ClkDiv " << thisDetector->clkDiv << endl; - } - outfile.close(); - } - else - { - cout << "Error opening configuration file " << fname << " for writing" << endl; - return FAIL; - } - return OK; -}; - /* - It should be possible to dump all the settings of the detector (including trimbits, threshold energy, gating/triggering, acquisition time etc. - in a file and retrieve it for repeating the measurement with identicals ettings, if necessary - */ -/* int slsDetector::dumpDetectorSetup(string fname){}; - int slsDetector::retrieveDetectorSetup(string fname){}; -*/ /* configure the socket communication and check that the server exists enum communicationProtocol{ @@ -801,207 +569,6 @@ int slsDetector::setTCPSocket(string const name, int const control_port, int con /* I/O */ - - slsDetector::sls_detector_module* slsDetector::readTrimFile(string fname, slsDetector::sls_detector_module *myMod){ - - int nflag=0; - - if (myMod==NULL) { - myMod=createModule(); - nflag=1; - } - string myfname; - string str; - ifstream infile; - ostringstream oss; - int isgood=1; - int iline=0; - string names[]={"Vtrim", "Vthresh", "Rgsh1", "Rgsh2", "Rgpr", "Vcal", "outBuffEnable"}; - string sargname; - int ival; - int ichan=0, ichip=0, idac=0; - - - -#ifdef VERBOSE - cout << "reading trimfile for module number "<< myMod->module << endl; -#endif - //im=myMod->module; - //myMod->module=im; - // myMod->serialnumber=getId(MODULE_SERIAL_NUMBER, im); - // if (im<0) - myfname=fname; - /* else { - // oss << fname << ".sn" << setfill('0') <serialnumber - oss << fname << ".sn" << setfill('0') <module; - myfname=oss.str(); - - }*/ -#ifdef VERBOSE - cout << "trim file name is "<< myfname << endl; -#endif - infile.open(myfname.c_str(), ios_base::in); - if (infile.is_open()) { - // while (infile.good() && isgood==1) { - for (int iarg=0; iargnDacs; iarg++) { - getline(infile,str); - iline++; -#ifdef VERBOSE - // cout << str << endl; -#endif - istringstream ssstr(str); - ssstr >> sargname >> ival; -#ifdef VERBOSE - cout << sargname << " dac nr. " << idac << " is " << ival << endl; -#endif - myMod->dacs[idac]=ival; - idac++; - } - for (ichip=0; ichipnChips; ichip++) { - getline(infile,str); - iline++; -#ifdef VERBOSE - // cout << str << endl; -#endif - istringstream ssstr(str); - ssstr >> sargname >> ival; -#ifdef VERBOSE - // cout << "chip " << ichip << " " << sargname << " is " << ival << endl; -#endif - - myMod->chipregs[ichip]=ival; - for (ichan=0; ichannChans; ichan++) { - getline(infile,str); -#ifdef VERBOSE - // cout << str << endl; -#endif - istringstream ssstr(str); - -#ifdef VERBOSE - // cout << "channel " << ichan+ichip*thisDetector->nChans <<" iline " << iline<< endl; -#endif - iline++; - myMod->chanregs[ichip*thisDetector->nChans+ichan]=0; - for (int iarg=0; iarg<6 ; iarg++) { - ssstr >> ival; - //if (ssstr.good()) { - switch (iarg) { - case 0: -#ifdef VERBOSE - // cout << "trimbits " << ival ; -#endif - myMod->chanregs[ichip*thisDetector->nChans+ichan]|=ival&0x3f; - break; - case 1: -#ifdef VERBOSE - //cout << " compen " << ival ; -#endif - myMod->chanregs[ichip*thisDetector->nChans+ichan]|=ival<<9; - break; - case 2: -#ifdef VERBOSE - //cout << " anen " << ival ; -#endif - myMod->chanregs[ichip*thisDetector->nChans+ichan]|=ival<<8; - break; - case 3: -#ifdef VERBOSE - //cout << " calen " << ival ; -#endif - myMod->chanregs[ichip*thisDetector->nChans+ichan]|=ival<<7; - break; - case 4: -#ifdef VERBOSE - //cout << " outcomp " << ival ; -#endif - myMod->chanregs[ichip*thisDetector->nChans+ichan]|=ival<<10; - break; - case 5: -#ifdef VERBOSE - //cout << " counts " << ival << endl; -#endif - myMod->chanregs[ichip*thisDetector->nChans+ichan]|=ival<<11; - break; - default: - cout << " too many columns" << endl; - break; - } - } - } - // } - } -#ifdef VERBOSE - cout << "read " << ichan*ichip << " channels" <nChans; ichan++) { - iv=mod.chanregs[ichip*thisDetector->nChans+ichan]; - iv1= (iv&0x3f); - outfile <>nb); - outfile << iv1 << " "; - nb=8; - iv1=((iv&(1<>nb); - outfile << iv1 << " "; - nb=7; - iv1=((iv&(1<>nb); - outfile <>nb); - outfile << iv1 << " "; - nb=11; - iv1= ((iv&0xfffff800)>>nb); - outfile << iv1 << endl; - } - } - outfile.close(); - return OK; - } else { - cout << "could not open file " << fname << endl; - return FAIL; - } - -}; - - - - -int slsDetector::writeTrimFile(string fname, int imod){ - - return writeTrimFile(fname,detectorModules[imod]); - -}; - /* generates file name without extension*/ string slsDetector::createFileName() { @@ -1020,238 +587,7 @@ string slsDetector::createFileName() { } -int slsDetector::writeDataFile(string fname, float *data, float *err, float *ang, char dataformat, int nch){ - if (nch==-1) - nch=thisDetector->nChans*thisDetector->nChips*thisDetector->nMods; - - ofstream outfile; - int idata; - if (data==NULL) - return FAIL; -#ifdef VERBOSE - cout << "writing data to file " << fname << endl; -#endif - // args|=0x10; // one line per channel! - - outfile.open (fname.c_str(),ios_base::out); - if (outfile.is_open()) - { -#ifdef VERBOSE - cout << "Writing to file " << fname << endl; -#endif - for (int ichan=0; ichannChans*thisDetector->nChips*thisDetector->nMods; ichan++) - outfile << ichan << " " << *(data+ichan) << endl; - outfile.close(); - return OK; - } else { - cout << "Could not open file " << fname << "for writing"<< endl; - return FAIL; - } -}; - - - - - -int slsDetector::readDataFile(string fname, float *data, float *err, float *ang, char dataformat, int nch){ - - - ifstream infile; - int ichan, iline=0; - int interrupt=0; - float fdata, ferr, fang; - int maxchans; - int ich; - string str; - - if (nch==0) - maxchans=thisDetector->nChans*thisDetector->nChips*thisDetector->nMods; - else if (nch<0) - maxchans=0xfffffff; - else - maxchans=nch; - -#ifdef VERBOSE - cout << "Opening file "<< fname << endl; -#endif - infile.open(fname.c_str(), ios_base::in); - if (infile.is_open()) { - while (infile.good() and interrupt==0) { - getline(infile,str); -#ifdef VERBOSE - cout << str << endl; -#endif - istringstream ssstr(str); - if (ang==NULL) { - ssstr >> ichan >> fdata; - ich=ichan; - if (ich!=iline) - cout << "Channel number " << ichan << " does not match with line number " << iline << endl; - } else { - ssstr >> fang >> fdata; - ich=iline; - } - if (!ssstr.good()) { - interrupt=1; - break; - } - if (err) - ssstr >> ferr; - if (!ssstr.good()) { - interrupt=1; - break; - } - if (ich> ichan >> idata; - if (!ssstr.good()) { - interrupt=1; - break; - } - if (ichan!=iline) { - cout << " Expected channel "<< iline <<" but read channel "<< ichan << endl; - interrupt=1; - break; - } else { - if (ilinenChans*thisDetector->nChips*thisDetector->nMods) { - data[iline]=idata; - iline++; - } else { - interrupt=1; - break; - } - } - } - } else { - cout << "Could not read file " << fname << endl; - return -1; - } - return iline; -}; - - - - -int slsDetector::readCalibrationFile(string fname, float &gain, float &offset){ - - char line[500]; - string str; - ifstream infile; -#ifdef VERBOSE - cout << "Opening file "<< fname << endl; -#endif - infile.open(fname.c_str(), ios_base::in); - if (infile.is_open()) { - getline(infile,str); -#ifdef VERBOSE - cout << str << endl; -#endif - istringstream ssstr(str); - ssstr >> offset >> gain; - } else { - cout << "Could not open calibration file "<< fname << endl; - gain=0.; - offset=0.; - return -1; - } - return 0; -}; -/* -int slsDetector::writeCalibrationFile(string fname, float gain, float offset){}; -*/ /* Communication to server */ // General purpose functions @@ -1463,7 +799,15 @@ int slsDetector::setNumberOfModules(int n, dimension d){ } else { thisDetector->nMod[d]=retval; thisDetector->nMods=thisDetector->nMod[X]*thisDetector->nMod[Y]; - thisDetector->dataBytes=thisDetector->nMod[X]*thisDetector->nMod[Y]*thisDetector->nChips*thisDetector->nChans*thisDetector->dynamicRange/8; + int dr=thisDetector->dynamicRange; + if (dr==24) + dr=32; + + thisDetector->dataBytes=thisDetector->nMod[X]*thisDetector->nMod[Y]*thisDetector->nChips*thisDetector->nChans*dr/8; +#ifdef VERBOSE + cout << "Data size is " << thisDetector->dataBytes << endl; + cout << "nModX " << thisDetector->nMod[X] << " nModY " << thisDetector->nMod[Y] << " nChips " << thisDetector->nChips << " nChans " << thisDetector->nChans<< " dr " << dr << endl; +#endif } return thisDetector->nMod[d]; }; @@ -1533,7 +877,7 @@ enum externalSignalFlag { }{}; */ - slsDetector::externalSignalFlag slsDetector::setExternalSignalFlags( slsDetector::externalSignalFlag pol, int signalindex){ + externalSignalFlag slsDetector::setExternalSignalFlags(externalSignalFlag pol, int signalindex){ @@ -1597,7 +941,7 @@ enum externalSignalFlag { */ - slsDetector::externalCommunicationMode slsDetector::setExternalCommunicationMode( slsDetector::externalCommunicationMode pol){ + externalCommunicationMode slsDetector::setExternalCommunicationMode( externalCommunicationMode pol){ @@ -1616,7 +960,8 @@ enum externalSignalFlag { cout << endl; cout << "Setting communication to mode " << pol << endl; #endif - if (onlineFlag==ONLINE_FLAG) { if (controlSocket) { + if (onlineFlag==ONLINE_FLAG) { + if (controlSocket) { if (controlSocket->Connect()>=0) { controlSocket->SendDataOnly(&fnum,sizeof(fnum)); controlSocket->SendDataOnly(&arg,sizeof(arg)); @@ -1663,7 +1008,7 @@ enum externalSignalFlag { -int64_t slsDetector::getId( slsDetector::idMode mode, int imod){ +int64_t slsDetector::getId( idMode mode, int imod){ int64_t retval; @@ -1723,7 +1068,7 @@ int64_t slsDetector::getId( slsDetector::idMode mode, int imod){ returns ok or error mask */ -int slsDetector::digitalTest( slsDetector::digitalTestMode mode, int imod){ +int slsDetector::digitalTest( digitalTestMode mode, int imod){ int retval; @@ -2086,6 +1431,7 @@ int slsDetector::setChannel(sls_detector_channel chan){ int im=chan.module; if (onlineFlag==ONLINE_FLAG) { + if (controlSocket) { if (controlSocket->Connect()>=0) { controlSocket->SendDataOnly(&fnum,sizeof(fnum)); sendChannel(&chan); @@ -2099,6 +1445,7 @@ int slsDetector::setChannel(sls_detector_channel chan){ } controlSocket->Disconnect(); } + } } @@ -2114,7 +1461,7 @@ int slsDetector::setChannel(sls_detector_channel chan){ } - slsDetector::sls_detector_channel slsDetector::getChannel(int ichan, int ichip, int imod){ + sls_detector_channel slsDetector::getChannel(int ichan, int ichip, int imod){ int fnum=F_GET_CHANNEL; @@ -2126,6 +1473,7 @@ int slsDetector::setChannel(sls_detector_channel chan){ arg[1]=ichip; arg[2]=imod; if (onlineFlag==ONLINE_FLAG) { + if (controlSocket) { if (controlSocket->Connect()>=0) { controlSocket->SendDataOnly(&fnum,sizeof(fnum)); controlSocket->SendDataOnly(arg,sizeof(arg)); @@ -2139,6 +1487,7 @@ int slsDetector::setChannel(sls_detector_channel chan){ } controlSocket->Disconnect(); } + } } @@ -2162,7 +1511,7 @@ int slsDetector::setChannel(sls_detector_channel chan){ }{}; */ int slsDetector::setChip(int reg, int ichip, int imod){ - slsDetector::sls_detector_chip myChip; + sls_detector_chip myChip; #ifdef VERBOSE cout << "Setting chip "<< ichip << " " << imod << " to " << reg << endl; @@ -2201,7 +1550,7 @@ int slsDetector::setChip(int reg, int ichip, int imod){ return ret; } -int slsDetector::setChip( slsDetector::sls_detector_chip chip){ +int slsDetector::setChip(sls_detector_chip chip){ int fnum=F_SET_CHIP; int retval; @@ -2216,6 +1565,7 @@ int slsDetector::setChip( slsDetector::sls_detector_chip chip){ if (onlineFlag==ONLINE_FLAG) { + if (controlSocket) { if (controlSocket->Connect()>=0) { controlSocket->SendDataOnly(&fnum,sizeof(fnum)); sendChip(&chip); @@ -2228,6 +1578,7 @@ int slsDetector::setChip( slsDetector::sls_detector_chip chip){ } controlSocket->Disconnect(); } + } } @@ -2243,7 +1594,7 @@ int slsDetector::setChip( slsDetector::sls_detector_chip chip){ }; - slsDetector::sls_detector_chip slsDetector::getChip(int ichip, int imod){ + sls_detector_chip slsDetector::getChip(int ichip, int imod){ int fnum=F_GET_CHIP; sls_detector_chip myChip; @@ -2266,6 +1617,7 @@ int slsDetector::setChip( slsDetector::sls_detector_chip chip){ if (onlineFlag==ONLINE_FLAG) { + if (controlSocket) { if (controlSocket->Connect()>=0) { controlSocket->SendDataOnly(&fnum,sizeof(fnum)); controlSocket->SendDataOnly(arg,sizeof(arg)); @@ -2279,6 +1631,7 @@ int slsDetector::setChip( slsDetector::sls_detector_chip chip){ } controlSocket->Disconnect(); } + } } @@ -2396,6 +1749,7 @@ int slsDetector::setModule(sls_detector_module module){ if (onlineFlag==ONLINE_FLAG) { + if (controlSocket) { if (controlSocket->Connect()>=0) { controlSocket->SendDataOnly(&fnum,sizeof(fnum)); sendModule(&module); @@ -2408,6 +1762,7 @@ int slsDetector::setModule(sls_detector_module module){ } controlSocket->Disconnect(); } + } } @@ -2426,7 +1781,7 @@ int slsDetector::setModule(sls_detector_module module){ }; -slsDetector::sls_detector_module *slsDetector::getModule(int imod){ +sls_detector_module *slsDetector::getModule(int imod){ int fnum=F_GET_MODULE; @@ -2463,6 +1818,7 @@ slsDetector::sls_detector_module *slsDetector::getModule(int imod){ if (onlineFlag==ONLINE_FLAG) { + if (controlSocket) { if (controlSocket->Connect()>=0) { controlSocket->SendDataOnly(&fnum,sizeof(fnum)); controlSocket->SendDataOnly(&imod,sizeof(imod)); @@ -2476,6 +1832,7 @@ slsDetector::sls_detector_module *slsDetector::getModule(int imod){ } controlSocket->Disconnect(); } + } } @@ -2562,18 +1919,23 @@ int slsDetector::getThresholdEnergy(int imod){ #ifdef VERBOSE cout << "Getting threshold energy "<< endl; #endif - if (controlSocket->Connect()>=0) { - controlSocket->SendDataOnly(&fnum,sizeof(fnum)); - controlSocket->SendDataOnly(&imod,sizeof(imod)); - controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret!=OK) { - cout << "Detector returned error: "<< endl; - controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - cout << mess << endl; - } else { - controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); + + if (onlineFlag==ONLINE_FLAG) { + if (controlSocket) { + if (controlSocket->Connect()>=0) { + controlSocket->SendDataOnly(&fnum,sizeof(fnum)); + controlSocket->SendDataOnly(&imod,sizeof(imod)); + controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); + if (ret!=OK) { + cout << "Detector returned error: "<< endl; + controlSocket->ReceiveDataOnly(mess,sizeof(mess)); + cout << mess << endl; + } else { + controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); + } + controlSocket->Disconnect(); + } } - controlSocket->Disconnect(); } return retval; }; @@ -2587,23 +1949,27 @@ int slsDetector::setThresholdEnergy(int e_eV, int imod, detectorSettings isetti #ifdef VERBOSE cout << "Getting threshold energy "<< endl; #endif - if (controlSocket->Connect()>=0) { - controlSocket->SendDataOnly(&fnum,sizeof(fnum)); - controlSocket->SendDataOnly(&e_eV,sizeof(e_eV)); - controlSocket->SendDataOnly(&imod,sizeof(imod)); - controlSocket->SendDataOnly(&isettings,sizeof(isettings)); - controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret!=OK) { - cout << "Detector returned error: "<< endl; - controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - cout << mess << endl; - } else { + if (onlineFlag==ONLINE_FLAG) { + if (controlSocket) { + if (controlSocket->Connect()>=0) { + controlSocket->SendDataOnly(&fnum,sizeof(fnum)); + controlSocket->SendDataOnly(&e_eV,sizeof(e_eV)); + controlSocket->SendDataOnly(&imod,sizeof(imod)); + controlSocket->SendDataOnly(&isettings,sizeof(isettings)); + controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); + if (ret!=OK) { + cout << "Detector returned error: "<< endl; + controlSocket->ReceiveDataOnly(mess,sizeof(mess)); + cout << mess << endl; + } else { #ifdef VERBOSE - cout << "Detector returned OK "<< endl; + cout << "Detector returned OK "<< endl; #endif - controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); + controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); + } + controlSocket->Disconnect(); + } } - controlSocket->Disconnect(); } return retval; }; @@ -2611,7 +1977,7 @@ int slsDetector::setThresholdEnergy(int e_eV, int imod, detectorSettings isetti /* select detector settings */ - slsDetector::detectorSettings slsDetector::getSettings(int imod){ + detectorSettings slsDetector::getSettings(int imod){ int fnum=F_SET_SETTINGS; @@ -2624,28 +1990,31 @@ int slsDetector::setThresholdEnergy(int e_eV, int imod, detectorSettings isetti #ifdef VERBOSE cout << "Getting settings "<< endl; #endif - if (controlSocket->Connect()>=0) { - controlSocket->SendDataOnly(&fnum,sizeof(fnum)); - controlSocket->SendDataOnly(arg,sizeof(arg)); - controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret!=OK) { - controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - cout << "Detector returned error: " << mess << endl; - } else{ - controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); - + if (onlineFlag==ONLINE_FLAG) { + if (controlSocket) { + if (controlSocket->Connect()>=0) { + controlSocket->SendDataOnly(&fnum,sizeof(fnum)); + controlSocket->SendDataOnly(arg,sizeof(arg)); + controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); + if (ret!=OK) { + controlSocket->ReceiveDataOnly(mess,sizeof(mess)); + cout << "Detector returned error: " << mess << endl; + } else{ + controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); + thisDetector->currentSettings=(detectorSettings)retval; #ifdef VERBOSE - cout << "Settings are "<< retval << endl; + cout << "Settings are "<< retval << endl; #endif } - controlSocket->Disconnect(); + controlSocket->Disconnect(); + } + } } - thisDetector->currentSettings=(detectorSettings)retval; return thisDetector->currentSettings; }; - slsDetector::detectorSettings slsDetector::setSettings( slsDetector::detectorSettings isettings, int imod){ + detectorSettings slsDetector::setSettings( detectorSettings isettings, int imod){ sls_detector_module *myMod=createModule(); int modmi=imod, modma=imod+1, im=imod; string trimfname, calfname; @@ -2723,6 +2092,8 @@ int slsDetector::startAcquisition(){ #ifdef VERBOSE cout << "Starting acquisition "<< endl; #endif + if (onlineFlag==ONLINE_FLAG) { + if (controlSocket) { if (controlSocket->Connect()>=0) { controlSocket->SendDataOnly(&fnum,sizeof(fnum)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); @@ -2731,6 +2102,8 @@ int slsDetector::startAcquisition(){ cout << "Detector returned error: " << mess << endl; } controlSocket->Disconnect(); + } + } } return ret; @@ -2747,6 +2120,8 @@ int slsDetector::stopAcquisition(){ #ifdef VERBOSE cout << "Stopping acquisition "<< endl; #endif + if (onlineFlag==ONLINE_FLAG) { + if (stopSocket) { if (stopSocket->Connect()>=0) { stopSocket->SendDataOnly(&fnum,sizeof(fnum)); stopSocket->ReceiveDataOnly(&ret,sizeof(ret)); @@ -2755,6 +2130,8 @@ int slsDetector::stopAcquisition(){ cout << "Detector returned error: " << mess << endl; } stopSocket->Disconnect(); + } + } } return ret; @@ -2770,6 +2147,8 @@ int slsDetector::startReadOut(){ #ifdef VERBOSE cout << "Starting readout "<< endl; #endif + if (onlineFlag==ONLINE_FLAG) { + if (controlSocket) { if (controlSocket->Connect()>=0) { controlSocket->SendDataOnly(&fnum,sizeof(fnum)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); @@ -2778,6 +2157,8 @@ int slsDetector::startReadOut(){ cout << "Detector returned error: " << mess << endl; } controlSocket->Disconnect(); + } + } } return ret; }; @@ -2792,6 +2173,8 @@ int slsDetector::getRunStatus(){ #ifdef VERBOSE cout << "Getting status "<< endl; #endif + if (onlineFlag==ONLINE_FLAG) { + if (controlSocket) { if (controlSocket->Connect()>=0) { controlSocket->SendDataOnly(&fnum,sizeof(fnum)); controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); @@ -2801,6 +2184,8 @@ int slsDetector::getRunStatus(){ } else controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); controlSocket->Disconnect(); + } + } } return retval; @@ -2810,19 +2195,19 @@ int slsDetector::getRunStatus(){ int* slsDetector::readFrame(){ int fnum=F_READ_FRAME, n; - int nel=thisDetector->dataBytes/sizeof(int); - int* retval=new int[nel]; - int ret=FAIL; - char mess[100]; - int i; + int* retval; #ifdef VERBOSE cout << "slsDetector: Reading frame "<< endl; #endif + if (onlineFlag==ONLINE_FLAG) { + if (controlSocket) { if (controlSocket->Connect()>=0) { controlSocket->SendDataOnly(&fnum,sizeof(fnum)); retval=getDataFromDetector(); controlSocket->Disconnect(); + } + } } return retval; }; @@ -2839,21 +2224,24 @@ int* slsDetector::getDataFromDetector(){ #endif #ifdef VERBOSE - // cout << "getting data "<< endl; + // cout << "getting data "<< endl; #endif controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); if (ret!=OK) { - controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - cout << "Detector returned: " << mess << endl; + n= controlSocket->ReceiveDataOnly(mess,sizeof(mess)); +#ifndef VERBOSE + if (ret==FAIL) +#endif + cout << "Detector returned: " << mess << " " << n << endl; delete [] retval; retval=NULL; } else { n=controlSocket->ReceiveDataOnly(retval,thisDetector->dataBytes); #ifdef VERBOSE - // cout << "Received "<< n << " data bytes" << endl; + cout << "Received "<< n << " data bytes" << endl; #endif - if (ndataBytes) { + if (n!=thisDetector->dataBytes) { cout << "wrong data size received: received " << n << " but expected " << thisDetector->dataBytes << endl; ret=FAIL; delete [] retval; @@ -2877,6 +2265,8 @@ int* slsDetector::readAll(){ #ifdef VERBOSE cout << "Reading all frames "<< endl; #endif + if (onlineFlag==ONLINE_FLAG) { + if (controlSocket) { if (controlSocket->Connect()>=0) { controlSocket->SendDataOnly(&fnum,sizeof(fnum)); while (retval=getDataFromDetector()){ @@ -2888,9 +2278,11 @@ int* slsDetector::readAll(){ } controlSocket->Disconnect(); } - //#ifdef VERBOSE - cout << "recieved "<< i<< " frames" << endl; - //#endif + } + } +#ifdef VERBOSE + cout << "received "<< i<< " frames" << endl; +#endif return dataQueue.front(); // check what we return! }; @@ -2937,17 +2329,24 @@ int slsDetector::startAndReadAllNoWait(){ #ifdef VERBOSE cout << "Starting and reading all frames "<< endl; #endif + if (onlineFlag==ONLINE_FLAG) { + if (controlSocket) { if (controlSocket->Connect()>=0) { controlSocket->SendDataOnly(&fnum,sizeof(fnum)); return OK; + } + } } return FAIL; }; int* slsDetector::getDataFromDetectorNoWait() { int *retval=getDataFromDetector(); - if (retval==NULL){ - controlSocket->Disconnect(); + if (onlineFlag==ONLINE_FLAG) { + if (controlSocket) { + if (retval==NULL){ + controlSocket->Disconnect(); + #ifdef VERBOSE cout << "Run finished "<< endl; #endif @@ -2955,6 +2354,8 @@ int* slsDetector::getDataFromDetectorNoWait() { #ifdef VERBOSE cout << "Frame received "<< endl; #endif + } + } } return retval; // check what we return! }; @@ -2989,7 +2390,7 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t){ int fnum=F_SET_TIMER; int64_t retval; - uint64_t ut, uretval; + uint64_t ut; char mess[100]; int ret=OK; int n=0; @@ -2997,6 +2398,8 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t){ cout << "Setting timer "<< index << " to " << t << "ns" << endl; #endif ut=t; + if (onlineFlag==ONLINE_FLAG) { + if (controlSocket) { if (controlSocket->Connect()>=0) { controlSocket->SendDataOnly(&fnum,sizeof(fnum)); controlSocket->SendDataOnly(&index,sizeof(index)); @@ -3013,6 +2416,8 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t){ } controlSocket->Disconnect(); } + } + } #ifdef VERBOSE cout << "Timer set to "<< retval << "ns" << endl; #endif @@ -3022,6 +2427,69 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t){ }; +/* + important speed parameters + +enum speedVariable { + CLOCK_DIVIDER, + WAIT_STATES, + SET_SIGNAL_LENGTH +}; +*/ + +int slsDetector::setSpeed(speedVariable sp, int value) { + + + int fnum=F_SET_SPEED; + int retval; + char mess[100]; + int ret=OK; + int n=0; +#ifdef VERBOSE + cout << "Setting speed variable"<< sp << " to " << value << endl; +#endif + if (onlineFlag==ONLINE_FLAG) { + if (controlSocket) { + if (controlSocket->Connect()>=0) { + controlSocket->SendDataOnly(&fnum,sizeof(fnum)); + controlSocket->SendDataOnly(&sp,sizeof(sp)); + n=controlSocket->SendDataOnly(&value,sizeof(value)); +#ifdef VERBOSE + cout << "Sent "<< n << " bytes " << endl; +#endif + controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); + if (ret!=OK) { + controlSocket->ReceiveDataOnly(mess,sizeof(mess)); + cout << "Detector returned error: " << mess << endl; + } else { + controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); + } + controlSocket->Disconnect(); + } + } + } +#ifdef VERBOSE + cout << "Speed set to "<< retval << endl; +#endif + return retval; + +} + + + + + + + + + + + + + + + + int64_t slsDetector::getTimeLeft(timerIndex index){ @@ -3033,6 +2501,8 @@ int64_t slsDetector::getTimeLeft(timerIndex index){ #ifdef VERBOSE cout << "Getting timer "<< index << endl; #endif + if (onlineFlag==ONLINE_FLAG) { + if (controlSocket) { if (controlSocket->Connect()>=0) { controlSocket->SendDataOnly(&fnum,sizeof(fnum)); controlSocket->SendDataOnly(&index,sizeof(index)); @@ -3046,7 +2516,8 @@ int64_t slsDetector::getTimeLeft(timerIndex index){ } controlSocket->Disconnect(); } - + } + } #ifdef VERBOSE cout << "Time left is "<< retval << endl; #endif @@ -3068,6 +2539,8 @@ int slsDetector::setDynamicRange(int n){ #endif if (n==24) n=32; + if (onlineFlag==ONLINE_FLAG) { + if (controlSocket) { if (controlSocket->Connect()>=0) { controlSocket->SendDataOnly(&fnum,sizeof(fnum)); controlSocket->SendDataOnly(&n,sizeof(n)); @@ -3079,6 +2552,8 @@ int slsDetector::setDynamicRange(int n){ controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); } controlSocket->Disconnect(); + } + } } if (ret==OK) { thisDetector->dataBytes=thisDetector->nMod[X]*thisDetector->nMod[Y]*thisDetector->nChips*thisDetector->nChans*retval/8; @@ -3129,6 +2604,8 @@ int slsDetector::setReadOutFlags(readOutFlags flag){ cout << "Setting readout flags to "<< flag << endl; #endif + if (onlineFlag==ONLINE_FLAG) { + if (controlSocket) { if (controlSocket->Connect()>=0) { controlSocket->SendDataOnly(&fnum,sizeof(fnum)); controlSocket->SendDataOnly(&flag,sizeof(flag)); @@ -3142,6 +2619,8 @@ int slsDetector::setReadOutFlags(readOutFlags flag){ } controlSocket->Disconnect(); } + } + } #ifdef VERBOSE cout << "Readout flag set to "<< retval << endl; #endif @@ -3174,6 +2653,8 @@ int slsDetector::executeTrimming(trimMode mode, int par1, int par2, int imod){ cout << "Trimming module " << imod << " with mode "<< mode << " parameters " << par1 << " " << par2 << endl; #endif + if (onlineFlag==ONLINE_FLAG) { + if (controlSocket) { if (controlSocket->Connect()>=0) { controlSocket->SendDataOnly(&fnum,sizeof(fnum)); cout << "sending mode bytes= "<< controlSocket->SendDataOnly(&mode,sizeof(mode)) << endl; @@ -3193,6 +2674,8 @@ int slsDetector::executeTrimming(trimMode mode, int par1, int par2, int imod){ retval=ret; } controlSocket->Disconnect(); + } + } } return retval; @@ -3212,6 +2695,17 @@ float* slsDetector::decodeData(int *datain) { int nch, boff=0; switch (nbits) { + case 1: + for (ibyte=0; ibytedataBytes; ibyte++) { + iptr=ptr[ibyte]&0x1; + for (ipos=0; ipos<8; ipos++) { + // dataout[ibyte*2+ichan]=((iptr&((0xf)<>ichan)&0xf; + ival=(iptr>>(ipos))&0x1; + dataout[ichan]=ival; + ichan++; + } + } + break; case 4: for (ibyte=0; ibytedataBytes; ibyte++) { iptr=ptr[ibyte]&0xff; @@ -3301,8 +2795,14 @@ int slsDetector::setFlatFieldCorrection(string fname){ thisDetector->nBadFF=0; if (fname=="") { +#ifdef VERBOSE + cout << "disabling flat field corrections" << endl; +#endif thisDetector->correctionMask&=~(1<0) { for (int ichan=0; ichancorrectionMask&(1<nMod[X]*thisDetector->nMod[Y]*thisDetector->nChans*thisDetector->nChips; ichan++) { corr[ichan]=ffcoefficients[ichan]; @@ -3371,6 +2874,9 @@ int slsDetector::getFlatFieldCorrections(float *corr, float *ecorr) { } return 1; } else { +#ifdef VERBOSE + cout << "Flat field correction is disabled" << endl; +#endif if (corr) for (int ichan=0; ichannMod[X]*thisDetector->nMod[Y]*thisDetector->nChans*thisDetector->nChips; ichan++) { corr[ichan]=1; @@ -3381,6 +2887,8 @@ int slsDetector::getFlatFieldCorrections(float *corr, float *ecorr) { } } + + int slsDetector::flatFieldCorrect(float datain, float errin, float &dataout, float &errout, float ffcoefficient, float fferr){ float e; @@ -3400,6 +2908,9 @@ int slsDetector::flatFieldCorrect(float datain, float errin, float &dataout, flo }; int slsDetector::flatFieldCorrect(float* datain, float *errin, float* dataout, float *errout){ +#ifdef VERBOSE + cout << "Flat field correcting data" << endl; +#endif float e, eo; if (thisDetector->correctionMask&(1<nMod[X]*thisDetector->nMod[Y]*thisDetector->nChans*thisDetector->nChips; ichan++) { @@ -3420,9 +2931,12 @@ int slsDetector::flatFieldCorrect(float* datain, float *errin, float* dataout, f int slsDetector::setRateCorrection(float t){ float tdead[]=defaultTDead; - if (t==0) + if (t==0) { +#ifdef VERBOSE + cout << "unsetting rate corrections" << endl; +#endif thisDetector->correctionMask&=~(1<correctionMask|=(1<0) thisDetector->tDead=t; @@ -3430,6 +2944,9 @@ int slsDetector::setRateCorrection(float t){ if (thisDetector->currentSettings<3 && thisDetector->currentSettings>-1) thisDetector->tDead=tdead[thisDetector->currentSettings]; } +#ifdef VERBOSE + cout << "Setting rate corrections with dead time "<< thisDetector->tDead << endl; +#endif } return thisDetector->correctionMask&(1<correctionMask&(1<tDead << endl; +#endif t=thisDetector->tDead; return 1; } else +#ifdef VERBOSE + cout << "Rate correction is disabled " << endl; +#endif return 0; }; @@ -3481,6 +3004,9 @@ int slsDetector::rateCorrect(float* datain, float *errin, float* dataout, float float data; float e; if (thisDetector->correctionMask&(1<nMod[X]*thisDetector->nMod[Y]*thisDetector->nChans*thisDetector->nChips; ichan++) { if (errin==NULL) { @@ -3587,121 +3113,20 @@ int slsDetector::fillBadChannelMask() { } - -int slsDetector::setAngularConversion(string fname) { - if (fname=="") { - thisDetector->correctionMask&=~(1<< ANGULAR_CONVERSION); - } else { - if (readAngularConversion(fname)>=0) - thisDetector->correctionMask|=(1<< ANGULAR_CONVERSION); - } - return thisDetector->correctionMask&(1<< ANGULAR_CONVERSION); -} - -int slsDetector::getAngularConversion(int &direction, angleConversionConstant *angconv) { - if (thisDetector->correctionMask&(1<< ANGULAR_CONVERSION)) { - direction=thisDetector->angDirection; - if (angconv) { - for (int imod=0; imodnMods; imod++) { - (angconv+imod)->center=thisDetector->angOff[imod].center; - (angconv+imod)->r_conversion=thisDetector->angOff[imod].r_conversion; - (angconv+imod)->offset=thisDetector->angOff[imod].offset; - (angconv+imod)->ecenter=thisDetector->angOff[imod].ecenter; - (angconv+imod)->er_conversion=thisDetector->angOff[imod].er_conversion; - (angconv+imod)->eoffset=thisDetector->angOff[imod].eoffset; - } - } - return 1; - } else - return 0; - - -} - - - -int slsDetector::readAngularConversion(string fname) { - char line[500]; - string str; - ifstream infile; - int mod; - float center, ecenter; - float r_conv, er_conv; - float off, eoff; - string ss; - int interrupt=0; - - //" module %i center %E +- %E conversion %E +- %E offset %f +- %f \n" -#ifdef VERBOSE - cout << "Opening file "<< fname << endl; -#endif - infile.open(fname.c_str(), ios_base::in); - if (infile.is_open()) { - while (infile.good() and interrupt==0) { - getline(infile,str); -#ifdef VERBOSE - cout << str << endl; -#endif - istringstream ssstr(str); - ssstr >> ss >> mod; - ssstr >> ss >> center; - ssstr >> ss >> ecenter; - ssstr >> ss >> r_conv; - ssstr >> ss >> er_conv; - ssstr >> ss >> off; - ssstr >> ss >> eoff; - if (modnModsMax && mod>=0) { - thisDetector->angOff[mod].center=center; - thisDetector->angOff[mod].r_conversion=r_conv; - thisDetector->angOff[mod].offset=off; - thisDetector->angOff[mod].ecenter=ecenter; - thisDetector->angOff[mod].er_conversion=er_conv; - thisDetector->angOff[mod].eoffset=eoff; - } - } - } else { - cout << "Could not open calibration file "<< fname << endl; - return -1; - } - return 0; -} - - -int slsDetector:: writeAngularConversion(string fname) { - ofstream outfile; - outfile.open (fname.c_str(),ios_base::out); - if (outfile.is_open()) - { - for (int imod=0; imodnMods; imod++) { - outfile << " module " << imod << " center "<< thisDetector->angOff[imod].center<<" +- "<< thisDetector->angOff[imod].ecenter<<" conversion "<< thisDetector->angOff[imod].r_conversion << " +- "<< thisDetector->angOff[imod].er_conversion << " offset "<< thisDetector->angOff[imod].offset << " +- "<< thisDetector->angOff[imod].eoffset << endl; - } - outfile.close(); - } else { - cout << "Could not open file " << fname << "for writing"<< endl; - return -1; - } - //" module %i center %E +- %E conversion %E +- %E offset %f +- %f \n" - return 0; -} - - - - - - - int slsDetector::exitServer(){ int retval; int fnum=F_EXIT_SERVER; + if (onlineFlag==ONLINE_FLAG) { if (controlSocket) { controlSocket->Connect(); controlSocket->SendDataOnly(&fnum,sizeof(fnum)); controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); controlSocket->Disconnect(); } + } if (retval==OK) { cout << endl; cout << "Shutting down the server" << endl; @@ -3710,295 +3135,6 @@ int slsDetector::exitServer(){ return retval; }; -int slsDetector::resetMerging(float *mp, float *mv, float *me, int *mm) { - - float binsize; - if (thisDetector->binSize>0) - binsize=thisDetector->binSize; - else - return FAIL; - - for (int ibin=0; ibin<(360./binsize); ibin++) { - mp[ibin]=0; - mv[ibin]=0; - me[ibin]=0; - mm[ibin]=0; - } - return OK; -} - - -int slsDetector::finalizeMerging(float *mp, float *mv, float *me, int *mm) { - float binsize; - int np=0; - - if (thisDetector->binSize>0) - binsize=thisDetector->binSize; - else - return FAIL; - - for (int ibin=0; ibin<(360./binsize); ibin++) { - if (mm[ibin]>0) { - mp[np]=mp[ibin]/mm[ibin]; - mv[np]=mv[ibin]/mm[ibin]; - me[np]=me[ibin]/mm[ibin]; - me[np]=sqrt(me[ibin]); - mm[np]=mm[ibin]; - np++; - } - } - return OK; -} - -int slsDetector::addToMerging(float *p1, float *v1, float *e1, float *mp, float *mv,float *me, int *mm) { - - float binsize; - float binmi=-180., binma; - int ibin=0; - int imod; - float ang; - - if (thisDetector->binSize>0) - binsize=thisDetector->binSize; - else - return FAIL; - binmi=-180.; - binma=binmi+binsize; - - - if (thisDetector->angDirection>0) { - for (int ip=0; ipnChans*thisDetector->nChips*thisDetector->nMods; ip++) { - if (thisDetector->correctionMask&DISCARD_BAD_CHANNELS) { - if (badChannelMask[ip]) - continue; - } - imod=ip/(thisDetector->nChans*thisDetector->nChips); - if (p1) - ang=p1[ip]; - else - ang=angle(ip,currentPosition,thisDetector->fineOffset+thisDetector->globalOffset,thisDetector->angOff[imod].r_conversion,thisDetector->angOff[imod].center, thisDetector->angOff[imod].offset,thisDetector->angOff[imod].tilt,thisDetector->angDirection); - - - - while (binmanChans*thisDetector->nChips*thisDetector->nMods-1; ip>=0; ip--) { - if (thisDetector->correctionMask&(1<< DISCARD_BAD_CHANNELS)) { - if (badChannelMask[ip]) - continue; - } - - while (binmanumberOfPositions>0) - np=thisDetector->numberOfPositions; - - currentPositionIndex=0; - - for (int ip=0; ipnumberOfPositions>0) { - go_to_position (thisDetector->detPositions[ip]); - currentPositionIndex=ip+1; - } - //write header before? - - - startAndReadAll(); - - if (thisDetector->correctionMask&(1<< I0_NORMALIZATION)) - currentI0=get_i0(); - - //write header after? - - - if (thisDetector->correctionMask&(1<< ANGULAR_CONVERSION)) - currentPosition=get_position(); - - processData(); - - - - } -} - - -void* slsDetector::processData() { - - - int *myData; - float *fdata; - // float *dataout=new float[thisDetector->nChans*thisDetector->nChips*thisDetector->nMods]; - float *rcdata=NULL, *rcerr=NULL; - float *ffcdata=NULL, *ffcerr=NULL; - float *ang=NULL; - float bs=0.004; - int i=0; - int imod; - int nb; - while(1) { - - - if( !dataQueue.empty() ) { - - /** Pop data queue */ - myData=dataQueue.front(); // get the data from the queue - dataQueue.pop(); //remove the data from the queue - if (myData) { - //process data - - /** decode data */ - fdata=decodeData(myData); - - delete [] myData; - myData=NULL; - /** write raw data file */ - writeDataFile (createFileName().append(".raw"), fdata, NULL, NULL, 'i'); - - /** rate correction */ - if (thisDetector->correctionMask&(1<nChans*thisDetector->nChips*thisDetector->nMods]; - rcerr=new float[thisDetector->nChans*thisDetector->nChips*thisDetector->nMods]; - rateCorrect(fdata,NULL,rcdata,rcerr); - delete [] fdata; - } else { - rcdata=fdata; - fdata=NULL; - } - - /** flat field correction */ - if (thisDetector->correctionMask&(1<nChans*thisDetector->nChips*thisDetector->nMods]; - ffcerr=new float[thisDetector->nChans*thisDetector->nChips*thisDetector->nMods]; - flatFieldCorrect(rcdata,rcerr,ffcdata,ffcerr); - delete [] rcdata; - delete [] rcerr; - } else { - ffcdata=rcdata; - ffcerr=rcerr; - rcdata=NULL; - rcerr=NULL; - } - - if (thisDetector->correctionMask&(1<< ANGULAR_CONVERSION)) { - - /** angular conversion */ - /** data merging */ - if (thisDetector->numberOfPositions) { - - if (currentPositionIndex==1) { - if (thisDetector->binSize>0) - bs=thisDetector->binSize; - else if (thisDetector->angOff[0].r_conversion>0) { - bs=180./PI*atan(thisDetector->angOff[0].r_conversion); - thisDetector->binSize=bs; - } else - thisDetector->binSize=bs; - - - nb=360./bs; - - mergingBins=new float[nb]; - mergingCounts=new float[nb]; - mergingErrors=new float[nb]; - mergingMultiplicity=new int[nb]; - - resetMerging(mergingBins, mergingCounts,mergingErrors, mergingMultiplicity); - } - addToMerging(ang, ffcdata, ffcerr, mergingBins, mergingCounts,mergingErrors, mergingMultiplicity); - if (currentPositionIndex==thisDetector->numberOfPositions) { - - - - - int np=finalizeMerging(mergingBins, mergingCounts,mergingErrors, mergingMultiplicity); - - - /** file writing */ - currentPositionIndex++; - writeDataFile (createFileName().append(".dat"),mergingCounts, mergingErrors, mergingBins,'f',np); - - delete [] mergingBins; - delete [] mergingCounts; - delete [] mergingErrors; - delete [] mergingMultiplicity; - - } - } else { - - ang=new float[thisDetector->nChans*thisDetector->nChips*thisDetector->nMods]; - for (int ip=0; ipnChans*thisDetector->nChips*thisDetector->nMods; ip++) { - imod==ip/(thisDetector->nChans*thisDetector->nChips); - ang[ip]=angle(ip,currentPosition,thisDetector->fineOffset+thisDetector->globalOffset,thisDetector->angOff[imod].r_conversion,thisDetector->angOff[imod].center, thisDetector->angOff[imod].offset,thisDetector->angOff[imod].tilt,thisDetector->angDirection); - } - writeDataFile (createFileName().append(".dat"), ffcdata, ffcerr,ang); - } - } else - writeDataFile (createFileName().append(".dat"), ffcdata, ffcerr); - - - - - - - - - - - - - if (ffcdata) - delete [] ffcdata; - if (ffcerr) - delete [] ffcerr; - if (ang) - delete [] ang; - - - - - - } - } - } -} /* diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index 298a9faf1..177e9f537 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -22,6 +22,8 @@ extern "C" { #include +#include "sls_detector_defs.h" + #define MAX_TIMERS 10 #define MAX_ROIS 100 #define MAX_BADCHANS 2000 @@ -37,15 +39,13 @@ extern "C" { #define DEFAULT_HOSTNAME "localhost" #define DEFAULT_SHM_KEY 5678 -#define defaultTDead {170,90,750} +#define defaultTDead {170,90,750} /**< should be changed in order to have it separate for the different detector types */ using namespace std; /** \mainpage Common C++ library for SLS detectors data acquisition * * \section intro_sec Introduction - - * \subsection mot_sec Motivation Although the SLS detectors group delvelops several types of detectors (1/2D, counting/integrating etc.) it is common interest of the group to use a common platfor for data acquisition @@ -55,7 +55,13 @@ using namespace std; \li C++ classes common to all detectors for client-server communication. These can be supplied to users as libraries and embedded also in acquisition systems which are not developed by the SLS \sa MySocketTCP slsDetector \li the possibility of using a Qt-based graphical user interface (with eventually root analisys capabilities) \li the possibility of runnin alla commands from command line. In order to ensure a fast operation of this so called "text client" the detector parameters should not be re-initialized everytime. For this reason a shared memory block is allocated where the main detector flags and parameters are stored \sa slsDetector::sharedSlsDetector - + \section howto_sec How to use it + The best way to operate the slsDetectors is to use the software (text client or GUI) developed by the sls detectors group. +In case you need to embed the detector control in a previously existing software, compile these classes using
    +make package +
    +and link the shared library created to your software bin/libSlsDetector.so.1.0.1 +Then in your software you should use the class related to the detector you want to control (mythenDetector or eigerDetector). @author Anna Bergamaschi @@ -70,7 +76,7 @@ using namespace std; * * @short This is the base class for all SLS detector functionalities * @author Anna Bergamaschi - * @version 0.1alpha (any string) + * @version 0.1alpha */ @@ -89,8 +95,6 @@ class slsDetector { }; -#include "sls_detector_defs.h" - /** @short Structure allocated in shared memory to store detector settings and be accessed in parallel by several applications (take care of possible conflicts!) @@ -159,6 +163,8 @@ typedef struct sharedSlsDetector { float tDead; /** number of bad channels from bad channel list */ int nBadChans; + /** file with the bad channels */ + char badChanFile[MAX_STR_LENGTH]; /** list of bad channels */ int badChansList[MAX_BADCHANS]; /** number of bad channels from flat field i.e. channels which read 0 in the flat field file */ @@ -166,6 +172,8 @@ typedef struct sharedSlsDetector { /** list of bad channels from flat field i.e. channels which read 0 in the flat field file */ int badFFList[MAX_BADCHANS]; + /** file with the angular conversion factors */ + char angConvFile[MAX_STR_LENGTH]; /** array of angular conversion constants for each module \see ::angleConversionConstant */ angleConversionConstant angOff[MAXMODS]; /** angular direction (1 if it corresponds to the encoder direction i.e. channel 0 is 0, maxchan is positive high angle, 0 otherwise */ @@ -240,30 +248,18 @@ typedef struct sharedSlsDetector { int exists() {return thisDetector->alreadyExisting;}; /** - Every detector should have a basic configuration file containing: - type (mythen, pilatus etc.) - hostname - portnumber - communication type (default TCP/IP) - eventually secondary portnumber (e.g. mythen stop function) - number of modules installed if different from the detector size (x,y) - - to be changed + Purely virtual function + Should be implemented in the specific detector class + /sa mythenDetector::readConfigurationFile */ - int readConfigurationFile(string const fname); - /** - Every detector should have a basic configuration file containing: - type (mythen, pilatus etc.) - hostname - portnumber - communication type (default TCP/IP) - eventually secondary portnumber (e.g. mythen stop function) - number of modules installed if different from the detector size (x,y) - - to be changed + virtual int readConfigurationFile(string const fname)=0; + /** + Purely virtual function + Should be implemented in the specific detector class + /sa mythenDetector::writeConfigurationFile */ - int writeConfigurationFile(string const fname); + virtual int writeConfigurationFile(string const fname)=0; /* @@ -271,17 +267,18 @@ typedef struct sharedSlsDetector { in a file and retrieve it for repeating the measurement with identicals ettings, if necessary */ /** - not yet implemented - - should dump to a file all the current detector parameters + + Purely virtual function + Should be implemented in the specific detector class + /sa mythenDetector::dumpDetectorSetup */ - int dumpDetectorSetup(string const fname); + virtual int dumpDetectorSetup(string const fname)=0; /** - not yet implemented - - should retrieve from a file all the current detector parameters + Purely virtual function + Should be implemented in the specific detector class + /sa mythenDetector::retrieveDetectorSetup */ - int retrieveDetectorSetup(string const fname); + virtual int retrieveDetectorSetup(string const fname)=0; /** configure the socket communication and initializes the socket instances @@ -316,35 +313,39 @@ typedef struct sharedSlsDetector { \sa sharedSlsDetector */ - int getTrimEn(int *en) {for (int ien=0; iennTrimEn; ien++) en[ien]=thisDetector->trimEnergies[ien]; return (thisDetector->nTrimEn);}; + int getTrimEn(int *en=NULL) {if (en) {for (int ien=0; iennTrimEn; ien++) en[ien]=thisDetector->trimEnergies[ien];} return (thisDetector->nTrimEn);}; /** + Pure virtual function reads a trim file \param fname name of the file to be read \param myMod pointer to the module structure which has to be set.
    If it is NULL a new module structure will be created \returns the pointer to myMod or NULL if reading the file failed + \sa mythenDetector::readTrimFile */ - sls_detector_module* readTrimFile(string fname, sls_detector_module* myMod=NULL); + virtual sls_detector_module* readTrimFile(string fname, sls_detector_module* myMod=NULL)=0; /** + Pure virtual function writes a trim file \param fname name of the file to be written \param mod module structure which has to be written to file \returns OK or FAIL if the file could not be written - \sa ::sls_detector_module + \sa ::sls_detector_module mythenDetector::writeTrimFile(string, sls_detector_module) */ - int writeTrimFile(string fname, sls_detector_module mod); + virtual int writeTrimFile(string fname, sls_detector_module mod)=0; /** + Pure virtual function writes a trim file for module number imod - the values will be read from the current detector structure \param fname name of the file to be written \param imod module number \returns OK or FAIL if the file could not be written - \sa ::sls_detector_module sharedSlsDetector + \sa ::sls_detector_module sharedSlsDetector mythenDetector::writeTrimFile(string, int) */ - int writeTrimFile(string fname, int imod); + virtual int writeTrimFile(string fname, int imod)=0; /** sets the default output files path @@ -396,6 +397,7 @@ typedef struct sharedSlsDetector { string createFileName(); /** + Pure virtual function writes a data file \param name of the file to be written \param data array of data values @@ -405,20 +407,23 @@ typedef struct sharedSlsDetector { \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); + virtual int writeDataFile(string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int nch=-1)=0; /** + Pure virtual function 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 + \returns OK or FAIL if it could not write the file or data=NULL + \sa mythenDetector::writeDataFile */ - int writeDataFile(string fname, int *data); + virtual int writeDataFile(string fname, int *data)=0; /** + Pure virtual function reads a data file \param name of the file to be read \param data array of data values to be filled @@ -429,64 +434,71 @@ typedef struct sharedSlsDetector { \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', int nch=0); + virtual int readDataFile(string fname, float *data, float *err=NULL, float *ang=NULL, char dataformat='f', int nch=0)=0; /** + Pure virtual function 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); + virtual int readDataFile(string fname, int *data)=0; /** returns the location of the calibration files \sa sharedSlsDetector */ - char* getCalDir() {return thisDetector->calDir;}; + char* getCalDir() {cout << "cal dir is " << thisDetector->calDir; return thisDetector->calDir;}; + + /** sets the location of the calibration files \sa sharedSlsDetector */ char* setCalDir(string s) {sprintf(thisDetector->calDir, s.c_str()); return thisDetector->calDir;}; /** + Pure virtual function reads a calibration file \param fname file to be read \param gain reference to the gain variable \offset reference to the offset variable - \sa sharedSlsDetector + \sa sharedSlsDetector mythenDetector::readCalibrationFile */ - int readCalibrationFile(string fname, float &gain, float &offset); + virtual int readCalibrationFile(string fname, float &gain, float &offset)=0; /** - writes a clibration file + Pure virtual function + writes a calibration file \param fname file to be written \param gain \param offset - \sa sharedSlsDetector + \sa sharedSlsDetector mythenDetector::writeCalibrationFile */ - int writeCalibrationFile(string fname, float gain, float offset); + virtual int writeCalibrationFile(string fname, float gain, float offset)=0; /** + Pure virtual function reads an angular conversion file \param fname file to be read - \sa angleConversionConstant + \sa angleConversionConstant mythenDetector::readAngularConversion */ - int readAngularConversion(string fname=""); + virtual int readAngularConversion(string fname="")=0; /** + Pure virtual function writes an angular conversion file \param fname file to be written - \sa angleConversionConstant + \sa angleConversionConstant mythenDetector::writeAngularConversion */ - int writeAngularConversion(string fname=""); + virtual int writeAngularConversion(string fname="")=0; /* Communication to server */ - // General purpose functions /** executes a system command on the server @@ -521,6 +533,14 @@ typedef struct sharedSlsDetector { void getDetectorType(char *type); + // Detector configuration functions + /** + set/get the size of the detector + \param n number of modules + \param d dimension + \returns current number of modules in direction d + */ + // Detector configuration functions /** set/get the size of the detector @@ -863,37 +883,16 @@ typedef struct sharedSlsDetector { */ int64_t getTimeLeft(timerIndex index); - /** - set clock divider - - not implemented (should be something more general like "set speed including also waitstates, set cycles etc.) - - */ - int setClockDivider(int i) {cout << "not implemented any longer!"<< endl; thisDetector->clkDiv=i;return thisDetector->clkDiv;}; - /** - get clock divider - - not implemented (should be something more general like "set speed including also waitstates, set cycles etc.) - - */ - int getClockDivider() {return thisDetector->clkDiv;}; - /** - set length cycles - - not implemented (should be something more general like "set speed including also waitstates, set cycles etc.) - - */ - int setSetLength(int i) {cout << "not implemented any longer!"<< endl; thisDetector->clkDiv=i;return 3;}; - /** - get length cycles - - not implemented (should be something more general like "set speed including also waitstates, set cycles etc.) - */ - int getSetLength() {return 3;}; - + /** sets/gets the value of important readout speed parameters + \param sp is the parameter to be set/get + \param value is the value to be set, if -1 get value + \returns current value for the specified parameter + \sa speedVariable + */ + int setSpeed(speedVariable sp, int value=-1); // Flags /** @@ -983,60 +982,95 @@ typedef struct sharedSlsDetector { */ int getBadChannelCorrections(int *bad=NULL); + /** returns the bad channel list file */ + char *getBadChannelCorrectionFile() {return thisDetector->badChanFile;}; + /** + pure virtual function set angular conversion \param fname file with angular conversion constants ("" disable) \returns 0 if angular conversion disabled, >0 otherwise + \sa mythenDetector::setAngularConversion */ - int setAngularConversion(string fname=""); + virtual int setAngularConversion(string fname="")=0; /** + pure virtual function get angular conversion \param reference to diffractometer direction \param angconv array that will be filled with the angular conversion constants \returns 0 if angular conversion disabled, >0 otherwise + \sa mythenDetector::getAngularConversion */ - int getAngularConversion(int &direction, angleConversionConstant *angconv=NULL); + virtual int getAngularConversion(int &direction, angleConversionConstant *angconv=NULL)=0; + + + /** + pure virtual function + returns the angular conversion file + \sa mythenDetector::getAngularConversion */ + virtual char *getAngularConversion()=0; /** + pure virtual function set detector global offset + \sa mythenDetector::setGlobalOffset */ - float setGlobalOffset(float f){thisDetector->globalOffset=f; return thisDetector->globalOffset;}; + virtual float setGlobalOffset(float f)=0; /** + pure virtual function set detector fine offset + \sa mythenDetector::setFineOffset */ - float setFineOffset(float f){thisDetector->fineOffset=f; return thisDetector->fineOffset;}; + virtual float setFineOffset(float f)=0; /** + pure virtual function get detector fine offset + \sa mythenDetector::getFineOffset */ - float getFineOffset(){return thisDetector->fineOffset;}; + virtual float getFineOffset()=0; /** + pure virtual function get detector global offset + \sa mythenDetector::getGlobalOffset */ - float getGlobalOffset(){return thisDetector->globalOffset;}; + virtual float getGlobalOffset()=0; /** + pure virtual function set positions for the acquisition \param nPos number of positions \param pos array with the encoder positions \returns number of positions + \sa mythenDetector::setPositions */ - int setPositions(int nPos, float *pos){thisDetector->numberOfPositions=nPos; for (int ip=0; ipdetPositions[ip]=pos[ip]; return thisDetector->numberOfPositions;}; + virtual int setPositions(int nPos, float *pos)=0; /** + pure virtual function get positions for the acquisition \param pos array which will contain the encoder positions \returns number of positions + \sa mythenDetector::getPositions */ - int getPositions(float *pos=NULL){ if (pos ) {for (int ip=0; ipnumberOfPositions; ip++) pos[ip]=thisDetector->detPositions[ip];} return thisDetector->numberOfPositions;}; + virtual int getPositions(float *pos=NULL)=0; - /** set detector bin size used for merging (approx angular resolution)*/ - float setBinSize(float bs) {thisDetector->binSize=bs; return thisDetector->binSize;} - /** return detector bin size used for merging (approx angular resolution)*/ - float getBinSize() {return thisDetector->binSize;} + /** pure virtual function + set detector bin size used for merging (approx angular resolution) + \param bs bin size in degrees + \returns current bin size + \sa mythenDetector::setBinSize +*/ + virtual float setBinSize(float bs)=0; + + /** pure virtual function + return detector bin size used for merging (approx angular resolution) + \sa mythenDetector::getBinSize + */ + virtual float getBinSize()=0; @@ -1100,16 +1134,20 @@ typedef struct sharedSlsDetector { int rateCorrect(float* datain, float *errin, float* dataout, float *errout); - /** sets the arrays of the merged data to 0. NB The array should be created with size >= 360./getBinSize(); + /** + pure virtual function + sets the arrays of the merged data to 0. NB The array should be created with size >= 360./getBinSize(); \param mp already merged postions \param mv already merged data \param me already merged errors (squared sum) \param mm multiplicity of merged arrays \returns OK or FAIL + \sa mythenDetector::resetMerging */ - int resetMerging(float *mp, float *mv,float *me, int *mm); - /** not yet implemented - merge dataset + virtual int resetMerging(float *mp, float *mv,float *me, int *mm)=0; + /** + pure virtual function + merge dataset \param p1 angular positions of dataset \param v1 data \param e1 errors @@ -1117,28 +1155,31 @@ typedef struct sharedSlsDetector { \param mv already merged data \param me already merged errors (squared sum) \param mm multiplicity of merged arrays + \sa mythenDetector::addToMerging */ - int addToMerging(float *p1, float *v1, float *e1, float *mp, float *mv,float *me, int *mm); + virtual int addToMerging(float *p1, float *v1, float *e1, float *mp, float *mv,float *me, int *mm)=0; - /** + /** pure virtual function calculates the "final" positions, data value and errors for the emrged data \param mp already merged postions \param mv already merged data \param me already merged errors (squared sum) \param mm multiplicity of merged arrays - \returns FAIL or the + \returns FAIL or the number of non empty bins (i.e. points belonging to the pattern) + \sa mythenDetector::finalizeMerging */ int finalizeMerging(float *mp, float *mv,float *me, int *mm); /** - turns of server + turns off server */ int exitServer(); - /** + /** pure virtual function function for processing data + \sa mythenDetector::processData */ - void* processData(); // thread function + virtual void* processData()=0; // thread function /** Allocates the memory for a sls_detector_module structure and initializes it \returns myMod the pointer to the allocate dmemory location @@ -1152,7 +1193,17 @@ typedef struct sharedSlsDetector { void deleteModule(sls_detector_module *myMod); - void acquire(); + /** pure virtual function + performs the complete acquisition and data processing + moves the detector to next position
    + starts and reads the detector
    + reads the IC (if required)
    + reads the encoder (iof required for angualr conversion)
    + processes the data (flat field, rate, angular conversion and merging ::processData()) + \sa mythenDetector::acquire() + */ + + virtual void acquire()=0; protected: