mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2026-08-11 07:30:30 +02:00
Merge branch 'developer' into dev/matterhorn_server_funcs
This commit is contained in:
@@ -80,7 +80,7 @@ _sd() {
|
||||
local IS_PATH=0
|
||||
|
||||
|
||||
local SLS_COMMANDS=" acquire activate adcclk adcenable adcenable10g adcindex adcinvert adclist adcname adcphase adcpipeline adcreg adcvpp apulse asamples autocompdisable badchannels blockingtrigger burstmode burstperiod bursts burstsl bustest cdsgain chipversion clearbit clearbusy clientversion clkdiv clkfreq clkphase collectionmode column compdisabletime confadc config configtransceiver counters currentsource dac dacindex daclist dacname dacvalues datastream dbitclk dbitphase dbitpipeline defaultdac defaultpattern define_bit define_reg definelist_bit definelist_reg delay delayl detectorserverversion detsize diodelay dpulse dr drlist dsamples execcommand exptime exptime1 exptime2 exptime3 extrastoragecells extsampling extsamplingsrc extsig fformat filtercells filterresistor findex firmwaretest firmwareversion fliprows flowcontrol10g fmaster fname foverwrite fpath framecounter frames framesl frametime free fwrite gaincaps gainmode gappixels gatedelay gatedelay1 gatedelay2 gatedelay3 gates getbit hardwareversion highvoltage hostname im_a im_b im_c im_d im_io imagetest include initialchecks inj_ch interpolation interruptsubframe kernelversion lastclient led lock master maxadcphaseshift maxclkphaseshift maxdbitphaseshift measuredperiod measuredsubperiod moduleid nextframenumber nmod numinterfaces overflow packageversion parallel parameters partialreset patfname patioctrl patlimits patloop patloop0 patloop1 patloop2 patmask patnloop patnloop0 patnloop1 patnloop2 patsetbit pattern patternstart patwait patwait0 patwait1 patwait2 patwaittime patwaittime0 patwaittime1 patwaittime2 patword pedestalmode period periodl polarity port power powerchip powerdac powerindex powerlist powername powervalues programfpga pulse pulsechip pulsenmove pumpprobe quad ratecorr readnrows readout readoutspeed readoutspeedlist rebootcontroller reg resetdacs resetfpga romode row runclk runtime rx_arping rx_clearroi rx_dbitlist rx_dbitoffset rx_dbitreorder rx_discardpolicy rx_fifodepth rx_frameindex rx_framescaught rx_framesperfile rx_hostname rx_jsonaddheader rx_jsonpara rx_lastclient rx_lock rx_missingpackets rx_padding rx_printconfig rx_realudpsocksize rx_roi rx_silent rx_start rx_status rx_stop rx_streamdummyheader rx_tcpport rx_threads rx_udpsocksize rx_version rx_zmqfreq rx_zmqhwm rx_zmqip rx_zmqport rx_zmqstartfnum rx_zmqstream samples savepattern scan scanerrmsg selinterface serialnumber setbit settings settingslist settingspath signalindex signallist signalname sleep slowadc slowadcindex slowadclist slowadcname slowadcvalues start status stop stopport storagecell_delay storagecell_start subdeadtime subexptime sync syncclk temp_10ge temp_adc temp_control temp_dcdc temp_event temp_fpga temp_fpgaext temp_fpgafl temp_fpgafr temp_slowadc temp_sodl temp_sodr temp_threshold templist tempvalues tengiga threshold thresholdnotb timing timing_info_decoder timinglist timingsource top transceiverenable trigger triggers triggersl trimbits trimen trimval tsamples txdelay txdelay_frame txdelay_left txdelay_right type udp_cleardst udp_dstip udp_dstip2 udp_dstlist udp_dstmac udp_dstmac2 udp_dstport udp_dstport2 udp_firstdst udp_numdst udp_reconfigure udp_srcip udp_srcip2 udp_srcmac udp_srcmac2 udp_validate update updatedetectorserver updatekernel updatemode user v_limit vchip_comp_adc vchip_comp_fe vchip_cs vchip_opa_1st vchip_opa_fd vchip_ref_comp_fe versions veto vetoalg vetofile vetophoton vetoref vetostream virtual vm_a vm_b vm_c vm_d vm_io zmqhwm zmqip zmqport "
|
||||
local SLS_COMMANDS=" acquire activate adcclk adcenable adcenable10g adcindex adcinvert adclist adcname adcphase adcpipeline adcreg adcvpp apulse asamples autocompdisable badchannels blockingtrigger burstmode burstperiod bursts burstsl bustest cdsgain chipversion clearbit clearbusy clientversion clkdiv clkfreq clkphase collectionmode column compdisabletime confadc config configtransceiver counters currentsource dac dacindex daclist dacname dacvalues dbitclk dbitphase dbitpipeline defaultdac defaultpattern define_bit define_reg definelist_bit definelist_reg delay delayl detectorserverversion detsize diodelay dpulse dr drlist dsamples execcommand exptime exptime1 exptime2 exptime3 extrastoragecells extsampling extsamplingsrc extsig fformat filtercells filterresistor findex firmwaretest firmwareversion fliprows flowcontrol10g fmaster fname foverwrite fpath framecounter frames framesl frametime free fwrite gaincaps gainmode gappixels gatedelay gatedelay1 gatedelay2 gatedelay3 gates getbit hardwareversion highvoltage hostname im_a im_b im_c im_d im_io imagetest include initialchecks inj_ch interpolation interruptsubframe kernelversion lastclient led lock master maxadcphaseshift maxclkphaseshift maxdbitphaseshift measuredperiod measuredsubperiod moduleid nextframenumber nmod numinterfaces overflow packageversion parallel parameters partialreset patfname patioctrl patlimits patloop patloop0 patloop1 patloop2 patmask patnloop patnloop0 patnloop1 patnloop2 patsetbit pattern patternstart patwait patwait0 patwait1 patwait2 patwaittime patwaittime0 patwaittime1 patwaittime2 patword pedestalmode period periodl polarity port power powerchip powerdac powerindex powerlist powername powervalues programfpga pulse pulsechip pulsenmove pumpprobe quad ratecorr readnrows readout readoutspeed readoutspeedlist rebootcontroller reg resetdacs resetfpga romode row runclk runtime rx_arping rx_clearroi rx_dbitlist rx_dbitoffset rx_dbitreorder rx_discardpolicy rx_fifodepth rx_frameindex rx_framescaught rx_framesperfile rx_hostname rx_jsonaddheader rx_jsonpara rx_lastclient rx_lock rx_missingpackets rx_padding rx_printconfig rx_realudpsocksize rx_roi rx_silent rx_start rx_status rx_stop rx_streamdummyheader rx_tcpport rx_threads rx_udpsocksize rx_version rx_zmqfreq rx_zmqhwm rx_zmqip rx_zmqport rx_zmqstartfnum rx_zmqstream samples savepattern scan scanerrmsg selinterface serialnumber setbit settings settingslist settingspath signalindex signallist signalname sleep slowadc slowadcindex slowadclist slowadcname slowadcvalues start status stop stopport storagecell_delay storagecell_start subdeadtime subexptime sync syncclk temp_10ge temp_adc temp_control temp_dcdc temp_event temp_fpga temp_fpgaext temp_fpgafl temp_fpgafr temp_slowadc temp_sodl temp_sodr temp_threshold templist tempvalues tengiga threshold thresholdnotb timing timing_info_decoder timinglist timingsource top transceiverenable trigger triggers triggersl trimbits trimen trimval tsamples txdelay txdelay_frame txdelay_left txdelay_right type udp_cleardst udp_datastream udp_dstip udp_dstip2 udp_dstlist udp_dstmac udp_dstmac2 udp_dstport udp_dstport2 udp_firstdst udp_numdst udp_reconfigure udp_srcip udp_srcip2 udp_srcmac udp_srcmac2 udp_validate update updatedetectorserver updatekernel updatemode user v_limit vchip_comp_adc vchip_comp_fe vchip_cs vchip_opa_1st vchip_opa_fd vchip_ref_comp_fe versions veto vetoalg vetofile vetophoton vetoref vetostream virtual vm_a vm_b vm_c vm_d vm_io zmqhwm zmqip zmqport "
|
||||
__acquire() {
|
||||
FCN_RETURN=""
|
||||
return 0
|
||||
@@ -600,23 +600,6 @@ fi
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
__datastream() {
|
||||
FCN_RETURN=""
|
||||
if [[ ${IS_GET} -eq 1 ]]; then
|
||||
if [[ "${cword}" == "2" ]]; then
|
||||
FCN_RETURN="bottom left right top"
|
||||
fi
|
||||
fi
|
||||
if [[ ${IS_GET} -eq 0 ]]; then
|
||||
if [[ "${cword}" == "2" ]]; then
|
||||
FCN_RETURN="bottom left right top"
|
||||
fi
|
||||
if [[ "${cword}" == "3" ]]; then
|
||||
FCN_RETURN="0 1"
|
||||
fi
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
__dbitclk() {
|
||||
FCN_RETURN=""
|
||||
if [[ ${IS_GET} -eq 1 ]]; then
|
||||
@@ -2993,6 +2976,23 @@ __udp_cleardst() {
|
||||
FCN_RETURN=""
|
||||
return 0
|
||||
}
|
||||
__udp_datastream() {
|
||||
FCN_RETURN=""
|
||||
if [[ ${IS_GET} -eq 1 ]]; then
|
||||
if [[ "${cword}" == "2" ]]; then
|
||||
FCN_RETURN="bottom left right top"
|
||||
fi
|
||||
fi
|
||||
if [[ ${IS_GET} -eq 0 ]]; then
|
||||
if [[ "${cword}" == "2" ]]; then
|
||||
FCN_RETURN="bottom left right top"
|
||||
fi
|
||||
if [[ "${cword}" == "3" ]]; then
|
||||
FCN_RETURN="0 1"
|
||||
fi
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
__udp_dstip() {
|
||||
FCN_RETURN=""
|
||||
if [[ ${IS_GET} -eq 0 ]]; then
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -4,7 +4,7 @@
|
||||
_sd() {
|
||||
|
||||
|
||||
local SLS_COMMANDS=" acquire activate adcclk adcenable adcenable10g adcindex adcinvert adclist adcname adcphase adcpipeline adcreg adcvpp apulse asamples autocompdisable badchannels blockingtrigger burstmode burstperiod bursts burstsl bustest cdsgain chipversion clearbit clearbusy clientversion clkdiv clkfreq clkphase collectionmode column compdisabletime confadc config configtransceiver counters currentsource dac dacindex daclist dacname dacvalues datastream dbitclk dbitphase dbitpipeline defaultdac defaultpattern define_bit define_reg definelist_bit definelist_reg delay delayl detectorserverversion detsize diodelay dpulse dr drlist dsamples execcommand exptime exptime1 exptime2 exptime3 extrastoragecells extsampling extsamplingsrc extsig fformat filtercells filterresistor findex firmwaretest firmwareversion fliprows flowcontrol10g fmaster fname foverwrite fpath framecounter frames framesl frametime free fwrite gaincaps gainmode gappixels gatedelay gatedelay1 gatedelay2 gatedelay3 gates getbit hardwareversion highvoltage hostname im_a im_b im_c im_d im_io imagetest include initialchecks inj_ch interpolation interruptsubframe kernelversion lastclient led lock master maxadcphaseshift maxclkphaseshift maxdbitphaseshift measuredperiod measuredsubperiod moduleid nextframenumber nmod numinterfaces overflow packageversion parallel parameters partialreset patfname patioctrl patlimits patloop patloop0 patloop1 patloop2 patmask patnloop patnloop0 patnloop1 patnloop2 patsetbit pattern patternstart patwait patwait0 patwait1 patwait2 patwaittime patwaittime0 patwaittime1 patwaittime2 patword pedestalmode period periodl polarity port power powerchip powerdac powerindex powerlist powername powervalues programfpga pulse pulsechip pulsenmove pumpprobe quad ratecorr readnrows readout readoutspeed readoutspeedlist rebootcontroller reg resetdacs resetfpga romode row runclk runtime rx_arping rx_clearroi rx_dbitlist rx_dbitoffset rx_dbitreorder rx_discardpolicy rx_fifodepth rx_frameindex rx_framescaught rx_framesperfile rx_hostname rx_jsonaddheader rx_jsonpara rx_lastclient rx_lock rx_missingpackets rx_padding rx_printconfig rx_realudpsocksize rx_roi rx_silent rx_start rx_status rx_stop rx_streamdummyheader rx_tcpport rx_threads rx_udpsocksize rx_version rx_zmqfreq rx_zmqhwm rx_zmqip rx_zmqport rx_zmqstartfnum rx_zmqstream samples savepattern scan scanerrmsg selinterface serialnumber setbit settings settingslist settingspath signalindex signallist signalname sleep slowadc slowadcindex slowadclist slowadcname slowadcvalues start status stop stopport storagecell_delay storagecell_start subdeadtime subexptime sync syncclk temp_10ge temp_adc temp_control temp_dcdc temp_event temp_fpga temp_fpgaext temp_fpgafl temp_fpgafr temp_slowadc temp_sodl temp_sodr temp_threshold templist tempvalues tengiga threshold thresholdnotb timing timing_info_decoder timinglist timingsource top transceiverenable trigger triggers triggersl trimbits trimen trimval tsamples txdelay txdelay_frame txdelay_left txdelay_right type udp_cleardst udp_dstip udp_dstip2 udp_dstlist udp_dstmac udp_dstmac2 udp_dstport udp_dstport2 udp_firstdst udp_numdst udp_reconfigure udp_srcip udp_srcip2 udp_srcmac udp_srcmac2 udp_validate update updatedetectorserver updatekernel updatemode user v_limit vchip_comp_adc vchip_comp_fe vchip_cs vchip_opa_1st vchip_opa_fd vchip_ref_comp_fe versions veto vetoalg vetofile vetophoton vetoref vetostream virtual vm_a vm_b vm_c vm_d vm_io zmqhwm zmqip zmqport "
|
||||
local SLS_COMMANDS=" acquire activate adcclk adcenable adcenable10g adcindex adcinvert adclist adcname adcphase adcpipeline adcreg adcvpp apulse asamples autocompdisable badchannels blockingtrigger burstmode burstperiod bursts burstsl bustest cdsgain chipversion clearbit clearbusy clientversion clkdiv clkfreq clkphase collectionmode column compdisabletime confadc config configtransceiver counters currentsource dac dacindex daclist dacname dacvalues dbitclk dbitphase dbitpipeline defaultdac defaultpattern define_bit define_reg definelist_bit definelist_reg delay delayl detectorserverversion detsize diodelay dpulse dr drlist dsamples execcommand exptime exptime1 exptime2 exptime3 extrastoragecells extsampling extsamplingsrc extsig fformat filtercells filterresistor findex firmwaretest firmwareversion fliprows flowcontrol10g fmaster fname foverwrite fpath framecounter frames framesl frametime free fwrite gaincaps gainmode gappixels gatedelay gatedelay1 gatedelay2 gatedelay3 gates getbit hardwareversion highvoltage hostname im_a im_b im_c im_d im_io imagetest include initialchecks inj_ch interpolation interruptsubframe kernelversion lastclient led lock master maxadcphaseshift maxclkphaseshift maxdbitphaseshift measuredperiod measuredsubperiod moduleid nextframenumber nmod numinterfaces overflow packageversion parallel parameters partialreset patfname patioctrl patlimits patloop patloop0 patloop1 patloop2 patmask patnloop patnloop0 patnloop1 patnloop2 patsetbit pattern patternstart patwait patwait0 patwait1 patwait2 patwaittime patwaittime0 patwaittime1 patwaittime2 patword pedestalmode period periodl polarity port power powerchip powerdac powerindex powerlist powername powervalues programfpga pulse pulsechip pulsenmove pumpprobe quad ratecorr readnrows readout readoutspeed readoutspeedlist rebootcontroller reg resetdacs resetfpga romode row runclk runtime rx_arping rx_clearroi rx_dbitlist rx_dbitoffset rx_dbitreorder rx_discardpolicy rx_fifodepth rx_frameindex rx_framescaught rx_framesperfile rx_hostname rx_jsonaddheader rx_jsonpara rx_lastclient rx_lock rx_missingpackets rx_padding rx_printconfig rx_realudpsocksize rx_roi rx_silent rx_start rx_status rx_stop rx_streamdummyheader rx_tcpport rx_threads rx_udpsocksize rx_version rx_zmqfreq rx_zmqhwm rx_zmqip rx_zmqport rx_zmqstartfnum rx_zmqstream samples savepattern scan scanerrmsg selinterface serialnumber setbit settings settingslist settingspath signalindex signallist signalname sleep slowadc slowadcindex slowadclist slowadcname slowadcvalues start status stop stopport storagecell_delay storagecell_start subdeadtime subexptime sync syncclk temp_10ge temp_adc temp_control temp_dcdc temp_event temp_fpga temp_fpgaext temp_fpgafl temp_fpgafr temp_slowadc temp_sodl temp_sodr temp_threshold templist tempvalues tengiga threshold thresholdnotb timing timing_info_decoder timinglist timingsource top transceiverenable trigger triggers triggersl trimbits trimen trimval tsamples txdelay txdelay_frame txdelay_left txdelay_right type udp_cleardst udp_datastream udp_dstip udp_dstip2 udp_dstlist udp_dstmac udp_dstmac2 udp_dstport udp_dstport2 udp_firstdst udp_numdst udp_reconfigure udp_srcip udp_srcip2 udp_srcmac udp_srcmac2 udp_validate update updatedetectorserver updatekernel updatemode user v_limit vchip_comp_adc vchip_comp_fe vchip_cs vchip_opa_1st vchip_opa_fd vchip_ref_comp_fe versions veto vetoalg vetofile vetophoton vetoref vetostream virtual vm_a vm_b vm_c vm_d vm_io zmqhwm zmqip zmqport "
|
||||
__acquire() {
|
||||
FCN_RETURN=""
|
||||
return 0
|
||||
@@ -524,23 +524,6 @@ fi
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
__datastream() {
|
||||
FCN_RETURN=""
|
||||
if [[ ${IS_GET} -eq 1 ]]; then
|
||||
if [[ "${cword}" == "2" ]]; then
|
||||
FCN_RETURN="bottom left right top"
|
||||
fi
|
||||
fi
|
||||
if [[ ${IS_GET} -eq 0 ]]; then
|
||||
if [[ "${cword}" == "2" ]]; then
|
||||
FCN_RETURN="bottom left right top"
|
||||
fi
|
||||
if [[ "${cword}" == "3" ]]; then
|
||||
FCN_RETURN="0 1"
|
||||
fi
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
__dbitclk() {
|
||||
FCN_RETURN=""
|
||||
if [[ ${IS_GET} -eq 1 ]]; then
|
||||
@@ -2917,6 +2900,23 @@ __udp_cleardst() {
|
||||
FCN_RETURN=""
|
||||
return 0
|
||||
}
|
||||
__udp_datastream() {
|
||||
FCN_RETURN=""
|
||||
if [[ ${IS_GET} -eq 1 ]]; then
|
||||
if [[ "${cword}" == "2" ]]; then
|
||||
FCN_RETURN="bottom left right top"
|
||||
fi
|
||||
fi
|
||||
if [[ ${IS_GET} -eq 0 ]]; then
|
||||
if [[ "${cword}" == "2" ]]; then
|
||||
FCN_RETURN="bottom left right top"
|
||||
fi
|
||||
if [[ "${cword}" == "3" ]]; then
|
||||
FCN_RETURN="0 1"
|
||||
fi
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
__udp_dstip() {
|
||||
FCN_RETURN=""
|
||||
if [[ ${IS_GET} -eq 0 ]]; then
|
||||
|
||||
@@ -826,15 +826,6 @@ nextframenumber:
|
||||
function: setNextFrameNumber
|
||||
input_types: [ uint64_t ]
|
||||
|
||||
numinterfaces:
|
||||
help: "[1, 2]\n\t[Jungfrau][Moench] Number of udp interfaces to stream data from detector. Default: 1.\n\tAlso enables second interface in receiver for listening (Writes a file per interface if writing enabled).\n\tAlso restarts client and receiver zmq sockets if zmq streaming enabled.\n\t[Eiger] Only gets with result 2."
|
||||
inherit_actions: INTEGER_COMMAND_VEC_ID
|
||||
actions:
|
||||
GET:
|
||||
function: getNumberofUDPInterfaces
|
||||
PUT:
|
||||
function: setNumberofUDPInterfaces
|
||||
|
||||
selinterface:
|
||||
help: "[0, 1]\n\t[Jungfrau][Moench] The udp interface to stream data from detector. Effective only when number of interfaces is 1. Default: 0 (outer)"
|
||||
inherit_actions: INTEGER_COMMAND_VEC_ID
|
||||
@@ -1521,6 +1512,15 @@ zmqport:
|
||||
function: setClientZmqPort
|
||||
|
||||
################# INTEGER_COMMAND_SET_NOID_GET_ID ############
|
||||
numinterfaces:
|
||||
help: "[1, 2]\n\t[Jungfrau][Moench] Number of udp interfaces to stream data from detector. Default: 1.\n\tAlso enables second interface in receiver for listening (Writes a file per interface if writing enabled).\n\tAlso restarts client and receiver zmq sockets if zmq streaming enabled.\n\t[Eiger] Only gets with result 2."
|
||||
inherit_actions: INTEGER_COMMAND_SET_NOID_GET_ID
|
||||
actions:
|
||||
GET:
|
||||
function: getNumberofUDPInterfaces
|
||||
PUT:
|
||||
function: setNumberofUDPInterfaces
|
||||
|
||||
sync:
|
||||
inherit_actions: INTEGER_COMMAND_SET_NOID_GET_ID
|
||||
help: "[0, 1]\n\t[Jungfrau][Moench] Enables or disables synchronization between modules. Sync mode requires at least one master configured. Also requires flatband cabling between master and slave with termination board."
|
||||
@@ -3617,13 +3617,13 @@ quad:
|
||||
cast_input: [ true ]
|
||||
output: [ args.front() ]
|
||||
|
||||
datastream:
|
||||
help: "[left|right] [0, 1]\n\t[Eiger] Enables or disables data streaming from left or/and right side of detector for 10 GbE mode. 1 (enabled) by default."
|
||||
udp_datastream:
|
||||
help: "[left|right|top|bottom] [0, 1]\n\tEnables or disables UDP data streaming from left or right of 10GbE UDP port of the detector. Options: left, right. Both ports are enabled (1) by default.\n\tEnables or disables UDP data streaming from the top or bottom of receiver. This option is available only when numinterfaces is set to 2. Options: top, bottom. Both interfaces are enabled (1) by default."
|
||||
actions:
|
||||
GET:
|
||||
argc: 1
|
||||
require_det_id: true
|
||||
function: getDataStream
|
||||
function: getUDPDataStream
|
||||
input: [ 'args[0]' ]
|
||||
input_types: [ defs::portPosition ]
|
||||
cast_input: [ true ]
|
||||
@@ -3631,7 +3631,7 @@ datastream:
|
||||
PUT:
|
||||
argc: 2
|
||||
require_det_id: true
|
||||
function: setDataStream
|
||||
function: setUDPDataStream
|
||||
input: [ 'args[0]', 'args[1]' ]
|
||||
input_types: [ defs::portPosition, bool ]
|
||||
cast_input: [ true, true ]
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
#configuration
|
||||
detectorversion: firmwareversion
|
||||
softwareversion: detectorserverversion
|
||||
receiverversion: rx_version
|
||||
@@ -8,8 +7,6 @@ detsizechan: detsize
|
||||
trimdir: settingspath
|
||||
settingsdir: settingspath
|
||||
flippeddatax: fliprows
|
||||
|
||||
#acquisition parameters
|
||||
cycles: triggers
|
||||
cyclesl: triggersl
|
||||
clkdivider: readoutspeed
|
||||
@@ -18,10 +15,6 @@ vhighvoltage: highvoltage
|
||||
digitest: imagetest
|
||||
filter: filterresistor
|
||||
readnlines: readnrows
|
||||
|
||||
# temperature
|
||||
|
||||
# super old dacs
|
||||
vtr: vtrim
|
||||
vrf: vrpreamp
|
||||
vrs: vrshaper
|
||||
@@ -33,8 +26,6 @@ vshaperneg: vrshaper_n
|
||||
viinsh: vishaper
|
||||
vpl: vcal_n
|
||||
vph: vcal_p
|
||||
|
||||
# dacs
|
||||
vthreshold: dac
|
||||
vsvp: dac
|
||||
vsvn: dac
|
||||
@@ -93,17 +84,11 @@ vb_sda: dac
|
||||
vcasc_sfp: dac
|
||||
vipre_cds: dac
|
||||
ibias_sfp: dac
|
||||
|
||||
|
||||
defaultdacs: resetdacs
|
||||
|
||||
#acquisition
|
||||
busy: clearbusy
|
||||
receiver: rx_status
|
||||
framescaught: rx_framescaught
|
||||
startingfnum: nextframenumber
|
||||
|
||||
#Network Configuration (Detector<->Receiver)
|
||||
detectorip: udp_srcip
|
||||
detectorip2: udp_srcip2
|
||||
detectormac: udp_srcmac
|
||||
@@ -118,15 +103,11 @@ flowcontrol_10g: flowcontrol10g
|
||||
txndelay_frame: txdelay_frame
|
||||
txndelay_left: txdelay_left
|
||||
txndelay_right: txdelay_right
|
||||
|
||||
#Receiver Config
|
||||
r_silent: rx_silent
|
||||
r_discardpolicy: rx_discardpolicy
|
||||
r_padding: rx_padding
|
||||
r_lock: rx_lock
|
||||
r_lastclient: rx_lastclient
|
||||
|
||||
#File
|
||||
fileformat: fformat
|
||||
outdir: fpath
|
||||
index: findex
|
||||
@@ -134,23 +115,13 @@ enablefwrite: fwrite
|
||||
masterfile: fmaster
|
||||
overwrite: foverwrite
|
||||
r_framesperfile: rx_framesperfile
|
||||
|
||||
#ZMQ Streaming Parameters (Receiver<->Client)
|
||||
r_readfreq: rx_zmqfreq
|
||||
rx_readfreq: rx_zmqfreq
|
||||
rx_datastream: rx_zmqstream
|
||||
|
||||
#Eiger Specific
|
||||
resmat: partialreset
|
||||
|
||||
#Jungfrau Specific
|
||||
storagecells: extrastoragecells
|
||||
auto_comp_disable: autocompdisable
|
||||
comp_disable_time: compdisabletime
|
||||
|
||||
#Gotthard2 Specific
|
||||
#Mythen3 Specific
|
||||
#CTB Specific
|
||||
adc: slowadc
|
||||
flags: romode
|
||||
i_a: im_a
|
||||
@@ -158,16 +129,10 @@ i_b: im_b
|
||||
i_c: im_c
|
||||
i_d: im_d
|
||||
i_io: im_io
|
||||
|
||||
#Pattern
|
||||
patternX: pattern
|
||||
#Moench
|
||||
|
||||
#Advanced
|
||||
copydetectorserver: updatedetectorserver
|
||||
|
||||
#Insignificant
|
||||
nframes: framecounter
|
||||
now: runtime
|
||||
timestamp: frametime
|
||||
frameindex: rx_frameindex
|
||||
frameindex: rx_frameindex
|
||||
datastream: udp_datastream
|
||||
@@ -2038,53 +2038,6 @@ dacvalues:
|
||||
help: ''
|
||||
infer_action: true
|
||||
is_description: true
|
||||
datastream:
|
||||
actions:
|
||||
GET:
|
||||
args:
|
||||
- arg_types:
|
||||
- defs::portPosition
|
||||
argc: 1
|
||||
cast_input:
|
||||
- true
|
||||
check_det_id: false
|
||||
convert_det_id: true
|
||||
function: getDataStream
|
||||
input:
|
||||
- args[0]
|
||||
input_types:
|
||||
- defs::portPosition
|
||||
output:
|
||||
- OutString(t)
|
||||
require_det_id: true
|
||||
store_result_in_t: true
|
||||
PUT:
|
||||
args:
|
||||
- arg_types:
|
||||
- defs::portPosition
|
||||
- bool
|
||||
argc: 2
|
||||
cast_input:
|
||||
- true
|
||||
- true
|
||||
check_det_id: false
|
||||
convert_det_id: true
|
||||
function: setDataStream
|
||||
input:
|
||||
- args[0]
|
||||
- args[1]
|
||||
input_types:
|
||||
- defs::portPosition
|
||||
- bool
|
||||
output:
|
||||
- ToString(args)
|
||||
require_det_id: true
|
||||
store_result_in_t: false
|
||||
command_name: datastream
|
||||
function_alias: datastream
|
||||
help: "[left|right] [0, 1]\n\t[Eiger] Enables or disables data streaming from left\
|
||||
\ or/and right side of detector for 10 GbE mode. 1 (enabled) by default."
|
||||
infer_action: true
|
||||
dbitclk:
|
||||
actions:
|
||||
GET:
|
||||
@@ -5671,7 +5624,7 @@ numinterfaces:
|
||||
argc: 1
|
||||
cast_input:
|
||||
- true
|
||||
check_det_id: false
|
||||
check_det_id: true
|
||||
convert_det_id: true
|
||||
function: setNumberofUDPInterfaces
|
||||
input:
|
||||
@@ -5680,7 +5633,7 @@ numinterfaces:
|
||||
- int
|
||||
output:
|
||||
- args.front()
|
||||
require_det_id: true
|
||||
require_det_id: false
|
||||
store_result_in_t: false
|
||||
command_name: numinterfaces
|
||||
function_alias: numinterfaces
|
||||
@@ -12035,6 +11988,56 @@ udp_cleardst:
|
||||
help: "\n\tClears udp destination details on the detector."
|
||||
infer_action: true
|
||||
template: true
|
||||
udp_datastream:
|
||||
actions:
|
||||
GET:
|
||||
args:
|
||||
- arg_types:
|
||||
- defs::portPosition
|
||||
argc: 1
|
||||
cast_input:
|
||||
- true
|
||||
check_det_id: false
|
||||
convert_det_id: true
|
||||
function: getUDPDataStream
|
||||
input:
|
||||
- args[0]
|
||||
input_types:
|
||||
- defs::portPosition
|
||||
output:
|
||||
- OutString(t)
|
||||
require_det_id: true
|
||||
store_result_in_t: true
|
||||
PUT:
|
||||
args:
|
||||
- arg_types:
|
||||
- defs::portPosition
|
||||
- bool
|
||||
argc: 2
|
||||
cast_input:
|
||||
- true
|
||||
- true
|
||||
check_det_id: false
|
||||
convert_det_id: true
|
||||
function: setUDPDataStream
|
||||
input:
|
||||
- args[0]
|
||||
- args[1]
|
||||
input_types:
|
||||
- defs::portPosition
|
||||
- bool
|
||||
output:
|
||||
- ToString(args)
|
||||
require_det_id: true
|
||||
store_result_in_t: false
|
||||
command_name: udp_datastream
|
||||
function_alias: udp_datastream
|
||||
help: "[left|right|top|bottom] [0, 1]\n\tEnables or disables UDP data streaming\
|
||||
\ from left or right of 10GbE UDP port of the detector. Options: left, right.\
|
||||
\ Both ports are enabled (1) by default.\n\tEnables or disables UDP data streaming\
|
||||
\ from the top or bottom of receiver. This option is available only when numinterfaces\
|
||||
\ is set to 2. Options: top, bottom. Both interfaces are enabled (1) by default."
|
||||
infer_action: true
|
||||
udp_dstip:
|
||||
actions:
|
||||
GET:
|
||||
|
||||
@@ -719,8 +719,9 @@ class Detector {
|
||||
* restarts client and receiver zmq sockets if zmq streaming enabled. \n
|
||||
* [Gotthard2] second interface enabled to send veto information via 10Gbps
|
||||
* for debugging. By default, if veto enabled, it is sent via 2.5 gbps
|
||||
* interface. \nSetting this resets the receiver roi */
|
||||
void setNumberofUDPInterfaces(int n, Positions pos = {});
|
||||
* interface. \nSetting this resets the receiver roi and any udp datastream
|
||||
* disables */
|
||||
void setNumberofUDPInterfaces(int n);
|
||||
|
||||
/** [Jungfrau][Moench] */
|
||||
Result<int> getSelectedUDPInterface(Positions pos = {}) const;
|
||||
@@ -897,6 +898,37 @@ class Detector {
|
||||
*/
|
||||
void setTransmissionDelay(int step);
|
||||
|
||||
/** [Eiger] Returns whether the 10GbE UDP data stream from detector is
|
||||
* enabled. Options: LEFT, RIGHT [Jungfrau][Moench] Returns whether the UDP
|
||||
* data stream from receiver is enabled. Options: TOP, BOTTOM
|
||||
*
|
||||
*/
|
||||
Result<bool> getUDPDataStream(const defs::portPosition port,
|
||||
Positions pos = {}) const;
|
||||
|
||||
/** [Eiger] Enables or disables UDP data streaming from left or right of
|
||||
* 10GbE UDP port of the detector. Default: enabled. Options: LEFT, RIGHT \n
|
||||
* [Jungfrau][Moench] Enables or disables UDP data streaming from the top or
|
||||
* bottom of receiver. Default: enabled. Options: TOP, BOTTOM. This option
|
||||
* is available only when numinterfaces is set to 2.
|
||||
*/
|
||||
void setUDPDataStream(const defs::portPosition port, const bool enable,
|
||||
Positions pos = {});
|
||||
|
||||
/** List of disabled UDP ports with index (moduleIndex * 2 + portIndex),
|
||||
* where portIndex is 0 for BOTTOM/LEFT port, and 1 for TOP/RIGHT port.
|
||||
* It is the index with 'd' in the file name when writing data. \n
|
||||
* [Eiger] LEFT, RIGHT
|
||||
* [Jungfrau][Moench] TOP, BOTTOM
|
||||
* This feature is available only when numinterfaces is set to 2.
|
||||
*/
|
||||
std::vector<int> getRxDisabledUDPPortIndices() const;
|
||||
|
||||
/** list of possible port positions.
|
||||
* [Eiger] LEFT, RIGHT
|
||||
* [Jungfrau][Moench] TOP, BOTTOM
|
||||
*/
|
||||
std::vector<defs::portPosition> getPortPositionList() const;
|
||||
///@}
|
||||
|
||||
/** @name Receiver Configuration */
|
||||
@@ -1252,16 +1284,6 @@ class Detector {
|
||||
* hardware required). */
|
||||
void setQuad(const bool enable);
|
||||
|
||||
/** [Eiger] */
|
||||
Result<bool> getDataStream(const defs::portPosition port,
|
||||
Positions pos = {}) const;
|
||||
|
||||
/** [Eiger] enable or disable data streaming from left or right of detector
|
||||
* for 10GbE. Default: enabled
|
||||
*/
|
||||
void setDataStream(const defs::portPosition port, const bool enable,
|
||||
Positions pos = {});
|
||||
|
||||
/** [Eiger] Advanced */
|
||||
Result<bool> getTop(Positions pos = {}) const;
|
||||
|
||||
@@ -2272,7 +2294,7 @@ class Detector {
|
||||
private:
|
||||
std::vector<uint16_t> getValidPortNumbers(uint16_t start_port);
|
||||
void updateRxRateCorrections();
|
||||
void setNumberofUDPInterfaces_(int n, Positions pos);
|
||||
void setNumberofUDPInterfaces_(int n);
|
||||
};
|
||||
|
||||
} // namespace sls
|
||||
|
||||
@@ -2426,82 +2426,6 @@ std::string Caller::dacname(int action) {
|
||||
return os.str();
|
||||
}
|
||||
|
||||
std::string Caller::datastream(int action) {
|
||||
|
||||
std::ostringstream os;
|
||||
// print help
|
||||
if (action == slsDetectorDefs::HELP_ACTION) {
|
||||
os << R"V0G0N([left|right] [0, 1]
|
||||
[Eiger] Enables or disables data streaming from left or/and right side of detector for 10 GbE mode. 1 (enabled) by default. )V0G0N"
|
||||
<< std::endl;
|
||||
return os.str();
|
||||
}
|
||||
|
||||
// check if action and arguments are valid
|
||||
if (action == slsDetectorDefs::GET_ACTION) {
|
||||
if (1 && args.size() != 1) {
|
||||
throw RuntimeError("Wrong number of arguments for action GET");
|
||||
}
|
||||
|
||||
if (args.size() == 1) {
|
||||
try {
|
||||
StringTo<defs::portPosition>(args[0]);
|
||||
} catch (...) {
|
||||
throw RuntimeError(
|
||||
"Could not convert argument 0 to defs::portPosition");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
else if (action == slsDetectorDefs::PUT_ACTION) {
|
||||
if (1 && args.size() != 2) {
|
||||
throw RuntimeError("Wrong number of arguments for action PUT");
|
||||
}
|
||||
|
||||
if (args.size() == 2) {
|
||||
try {
|
||||
StringTo<defs::portPosition>(args[0]);
|
||||
} catch (...) {
|
||||
throw RuntimeError(
|
||||
"Could not convert argument 0 to defs::portPosition");
|
||||
}
|
||||
try {
|
||||
StringTo<bool>(args[1]);
|
||||
} catch (...) {
|
||||
throw RuntimeError("Could not convert argument 1 to bool");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
else {
|
||||
|
||||
throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions "
|
||||
"are ['GET', 'PUT']");
|
||||
}
|
||||
|
||||
// generate code for each action
|
||||
if (action == slsDetectorDefs::GET_ACTION) {
|
||||
if (args.size() == 1) {
|
||||
auto arg0 = StringTo<defs::portPosition>(args[0]);
|
||||
auto t = det->getDataStream(arg0, std::vector<int>{det_id});
|
||||
os << OutString(t) << '\n';
|
||||
}
|
||||
}
|
||||
|
||||
if (action == slsDetectorDefs::PUT_ACTION) {
|
||||
if (args.size() == 2) {
|
||||
auto arg0 = StringTo<defs::portPosition>(args[0]);
|
||||
auto arg1 = StringTo<bool>(args[1]);
|
||||
det->setDataStream(arg0, arg1, std::vector<int>{det_id});
|
||||
os << ToString(args) << '\n';
|
||||
}
|
||||
}
|
||||
|
||||
return os.str();
|
||||
}
|
||||
|
||||
std::string Caller::dbitclk(int action) {
|
||||
|
||||
std::ostringstream os;
|
||||
@@ -7052,8 +6976,12 @@ std::string Caller::numinterfaces(int action) {
|
||||
|
||||
if (action == slsDetectorDefs::PUT_ACTION) {
|
||||
if (args.size() == 1) {
|
||||
if (det_id != -1) {
|
||||
throw RuntimeError(
|
||||
"Cannot execute numinterfaces at module level");
|
||||
}
|
||||
auto arg0 = StringTo<int>(args[0]);
|
||||
det->setNumberofUDPInterfaces(arg0, std::vector<int>{det_id});
|
||||
det->setNumberofUDPInterfaces(arg0);
|
||||
os << args.front() << '\n';
|
||||
}
|
||||
}
|
||||
@@ -14985,6 +14913,83 @@ std::string Caller::udp_cleardst(int action) {
|
||||
return os.str();
|
||||
}
|
||||
|
||||
std::string Caller::udp_datastream(int action) {
|
||||
|
||||
std::ostringstream os;
|
||||
// print help
|
||||
if (action == slsDetectorDefs::HELP_ACTION) {
|
||||
os << R"V0G0N([left|right|top|bottom] [0, 1]
|
||||
Enables or disables UDP data streaming from left or right of 10GbE UDP port of the detector. Options: left, right. Both ports are enabled (1) by default.
|
||||
Enables or disables UDP data streaming from the top or bottom of receiver. This option is available only when numinterfaces is set to 2. Options: top, bottom. Both interfaces are enabled (1) by default. )V0G0N"
|
||||
<< std::endl;
|
||||
return os.str();
|
||||
}
|
||||
|
||||
// check if action and arguments are valid
|
||||
if (action == slsDetectorDefs::GET_ACTION) {
|
||||
if (1 && args.size() != 1) {
|
||||
throw RuntimeError("Wrong number of arguments for action GET");
|
||||
}
|
||||
|
||||
if (args.size() == 1) {
|
||||
try {
|
||||
StringTo<defs::portPosition>(args[0]);
|
||||
} catch (...) {
|
||||
throw RuntimeError(
|
||||
"Could not convert argument 0 to defs::portPosition");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
else if (action == slsDetectorDefs::PUT_ACTION) {
|
||||
if (1 && args.size() != 2) {
|
||||
throw RuntimeError("Wrong number of arguments for action PUT");
|
||||
}
|
||||
|
||||
if (args.size() == 2) {
|
||||
try {
|
||||
StringTo<defs::portPosition>(args[0]);
|
||||
} catch (...) {
|
||||
throw RuntimeError(
|
||||
"Could not convert argument 0 to defs::portPosition");
|
||||
}
|
||||
try {
|
||||
StringTo<bool>(args[1]);
|
||||
} catch (...) {
|
||||
throw RuntimeError("Could not convert argument 1 to bool");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
else {
|
||||
|
||||
throw RuntimeError("INTERNAL ERROR: Invalid action: supported actions "
|
||||
"are ['GET', 'PUT']");
|
||||
}
|
||||
|
||||
// generate code for each action
|
||||
if (action == slsDetectorDefs::GET_ACTION) {
|
||||
if (args.size() == 1) {
|
||||
auto arg0 = StringTo<defs::portPosition>(args[0]);
|
||||
auto t = det->getUDPDataStream(arg0, std::vector<int>{det_id});
|
||||
os << OutString(t) << '\n';
|
||||
}
|
||||
}
|
||||
|
||||
if (action == slsDetectorDefs::PUT_ACTION) {
|
||||
if (args.size() == 2) {
|
||||
auto arg0 = StringTo<defs::portPosition>(args[0]);
|
||||
auto arg1 = StringTo<bool>(args[1]);
|
||||
det->setUDPDataStream(arg0, arg1, std::vector<int>{det_id});
|
||||
os << ToString(args) << '\n';
|
||||
}
|
||||
}
|
||||
|
||||
return os.str();
|
||||
}
|
||||
|
||||
std::string Caller::udp_dstlist(int action) {
|
||||
|
||||
std::ostringstream os;
|
||||
|
||||
@@ -105,7 +105,6 @@ class Caller {
|
||||
std::string daclist(int action);
|
||||
std::string dacname(int action);
|
||||
std::string dacvalues(int action);
|
||||
std::string datastream(int action);
|
||||
std::string dbitclk(int action);
|
||||
std::string dbitphase(int action);
|
||||
std::string dbitpipeline(int action);
|
||||
@@ -345,6 +344,7 @@ class Caller {
|
||||
std::string txdelay_right(int action);
|
||||
std::string type(int action);
|
||||
std::string udp_cleardst(int action);
|
||||
std::string udp_datastream(int action);
|
||||
std::string udp_dstip(int action);
|
||||
std::string udp_dstip2(int action);
|
||||
std::string udp_dstlist(int action);
|
||||
@@ -474,7 +474,6 @@ class Caller {
|
||||
{"daclist", &Caller::daclist},
|
||||
{"dacname", &Caller::dacname},
|
||||
{"dacvalues", &Caller::dacvalues},
|
||||
{"datastream", &Caller::datastream},
|
||||
{"dbitclk", &Caller::dbitclk},
|
||||
{"dbitphase", &Caller::dbitphase},
|
||||
{"dbitpipeline", &Caller::dbitpipeline},
|
||||
@@ -718,6 +717,7 @@ class Caller {
|
||||
{"txdelay_right", &Caller::txdelay_right},
|
||||
{"type", &Caller::type},
|
||||
{"udp_cleardst", &Caller::udp_cleardst},
|
||||
{"udp_datastream", &Caller::udp_datastream},
|
||||
{"udp_dstip", &Caller::udp_dstip},
|
||||
{"udp_dstip2", &Caller::udp_dstip2},
|
||||
{"udp_dstlist", &Caller::udp_dstlist},
|
||||
@@ -903,6 +903,7 @@ class Caller {
|
||||
{"now", "runtime"},
|
||||
{"timestamp", "frametime"},
|
||||
{"frameindex", "rx_frameindex"},
|
||||
{"datastream", "udp_datastream"},
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -1082,17 +1082,17 @@ Result<int> Detector::getNumberofUDPInterfaces(Positions pos) const {
|
||||
return pimpl->Parallel(&Module::getNumberofUDPInterfacesFromShm, pos);
|
||||
}
|
||||
|
||||
void Detector::setNumberofUDPInterfaces(int n, Positions pos) {
|
||||
void Detector::setNumberofUDPInterfaces(int n) {
|
||||
auto detType = getDetectorType().squash();
|
||||
if (detType != defs::JUNGFRAU && detType != defs::MOENCH) {
|
||||
throw RuntimeError(
|
||||
"Cannot set number of udp interfaces for this detector.");
|
||||
}
|
||||
// also called by vetostream (for gotthard2)
|
||||
setNumberofUDPInterfaces_(n, pos);
|
||||
setNumberofUDPInterfaces_(n);
|
||||
}
|
||||
|
||||
void Detector::setNumberofUDPInterfaces_(int n, Positions pos) {
|
||||
void Detector::setNumberofUDPInterfaces_(int n) {
|
||||
if (!size()) {
|
||||
throw RuntimeError("No modules added.");
|
||||
}
|
||||
@@ -1102,10 +1102,10 @@ void Detector::setNumberofUDPInterfaces_(int n, Positions pos) {
|
||||
bool previouslyReceiverStreaming = false;
|
||||
uint16_t rxStartingPort = 0;
|
||||
if (useReceiver) {
|
||||
previouslyReceiverStreaming = getRxZmqDataStream(pos).squash(true);
|
||||
previouslyReceiverStreaming = getRxZmqDataStream().squash(true);
|
||||
rxStartingPort = getRxZmqPort({0}).squash(0);
|
||||
}
|
||||
pimpl->Parallel(&Module::setNumberofUDPInterfaces, pos, n);
|
||||
pimpl->Parallel(&Module::setNumberofUDPInterfaces, {}, n);
|
||||
// ensure receiver zmq socket ports are multiplied by 2 (2 interfaces)
|
||||
setClientZmqPort(clientStartingPort, -1);
|
||||
if (getUseReceiverFlag().squash(false)) {
|
||||
@@ -1117,8 +1117,8 @@ void Detector::setNumberofUDPInterfaces_(int n, Positions pos) {
|
||||
pimpl->setDataStreamingToClient(true);
|
||||
}
|
||||
if (previouslyReceiverStreaming) {
|
||||
setRxZmqDataStream(false, pos);
|
||||
setRxZmqDataStream(true, pos);
|
||||
setRxZmqDataStream(false);
|
||||
setRxZmqDataStream(true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1317,6 +1317,24 @@ void Detector::setTransmissionDelay(int step) {
|
||||
pimpl->setTransmissionDelay(step);
|
||||
}
|
||||
|
||||
Result<bool> Detector::getUDPDataStream(const defs::portPosition port,
|
||||
Positions pos) const {
|
||||
return pimpl->getUDPDataStream(port, pos);
|
||||
}
|
||||
|
||||
void Detector::setUDPDataStream(const defs::portPosition port,
|
||||
const bool enable, Positions pos) {
|
||||
pimpl->setUDPDataStream(port, enable, pos);
|
||||
}
|
||||
|
||||
std::vector<int> Detector::getRxDisabledUDPPortIndices() const {
|
||||
return pimpl->getRxDisabledUDPPortIndices();
|
||||
}
|
||||
|
||||
std::vector<defs::portPosition> Detector::getPortPositionList() const {
|
||||
return pimpl->getPortPositionList();
|
||||
}
|
||||
|
||||
// Receiver
|
||||
|
||||
Result<bool> Detector::getUseReceiverFlag(Positions pos) const {
|
||||
@@ -1750,16 +1768,6 @@ void Detector::setQuad(const bool enable) {
|
||||
pimpl->Parallel(&Module::setQuad, {}, enable);
|
||||
}
|
||||
|
||||
Result<bool> Detector::getDataStream(const defs::portPosition port,
|
||||
Positions pos) const {
|
||||
return pimpl->Parallel(&Module::getDataStream, pos, port);
|
||||
}
|
||||
|
||||
void Detector::setDataStream(const defs::portPosition port, const bool enable,
|
||||
Positions pos) {
|
||||
pimpl->Parallel(&Module::setDataStream, pos, port, enable);
|
||||
}
|
||||
|
||||
Result<bool> Detector::getTop(Positions pos) const {
|
||||
return pimpl->Parallel(&Module::getTop, pos);
|
||||
}
|
||||
@@ -2012,7 +2020,7 @@ void Detector::setVetoStream(defs::streamingInterface interface,
|
||||
? 2
|
||||
: 1);
|
||||
if (numinterfaces != old_numinterfaces) {
|
||||
setNumberofUDPInterfaces_(numinterfaces, pos);
|
||||
setNumberofUDPInterfaces_(numinterfaces);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1126,10 +1126,17 @@ int DetectorImpl::acquire() {
|
||||
|
||||
// start receiver
|
||||
if (receiver) {
|
||||
Parallel(&Module::startReceiver, {});
|
||||
}
|
||||
|
||||
startProcessingThread(receiver);
|
||||
// to catch dummy zmq packets for disabled ports,
|
||||
// start processing thread before startReceiver
|
||||
if (dataReady != nullptr)
|
||||
startRxZmqProcessingThread();
|
||||
|
||||
Parallel(&Module::startReceiver, {});
|
||||
|
||||
if (dataReady == nullptr)
|
||||
startRxProgressThread();
|
||||
}
|
||||
|
||||
// start and read all
|
||||
try {
|
||||
@@ -1314,53 +1321,46 @@ void DetectorImpl::printProgress(double progress) {
|
||||
std::cout << '\r' << std::flush;
|
||||
}
|
||||
|
||||
void DetectorImpl::startProcessingThread(bool receiver) {
|
||||
void DetectorImpl::startRxZmqProcessingThread() {
|
||||
dataProcessingThread =
|
||||
std::thread(&DetectorImpl::processData, this, receiver);
|
||||
std::thread(&DetectorImpl::readFrameFromReceiver, this);
|
||||
}
|
||||
|
||||
void DetectorImpl::processData(bool receiver) {
|
||||
if (receiver) {
|
||||
if (dataReady != nullptr) {
|
||||
readFrameFromReceiver();
|
||||
}
|
||||
// only update progress
|
||||
else {
|
||||
LOG(logINFO) << "Type 'q' and hit enter to stop acquisition";
|
||||
double progress = 0;
|
||||
printProgress(progress);
|
||||
void DetectorImpl::startRxProgressThread() {
|
||||
dataProcessingThread = std::thread(&DetectorImpl::printRxProgress, this);
|
||||
}
|
||||
|
||||
while (true) {
|
||||
// to exit acquire by typing q
|
||||
if (kbhit() != 0) {
|
||||
if (fgetc(stdin) == 'q') {
|
||||
LOG(logINFO)
|
||||
<< "Caught the command to stop acquisition";
|
||||
stopDetector({});
|
||||
}
|
||||
}
|
||||
// get and print progress
|
||||
double temp =
|
||||
(double)Parallel(&Module::getReceiverProgress, {0})
|
||||
.squash();
|
||||
if (temp != progress) {
|
||||
printProgress(progress);
|
||||
progress = temp;
|
||||
}
|
||||
void DetectorImpl::printRxProgress() {
|
||||
LOG(logINFO) << "Type 'q' and hit enter to stop acquisition";
|
||||
double progress = 0;
|
||||
printProgress(progress);
|
||||
|
||||
// exiting loop
|
||||
if (getJoinThreadFlag()) {
|
||||
// print progress one final time before exiting
|
||||
progress =
|
||||
(double)Parallel(&Module::getReceiverProgress, {0})
|
||||
.squash();
|
||||
printProgress(progress);
|
||||
break;
|
||||
}
|
||||
// otherwise error when connecting to the receiver too fast
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
||||
while (true) {
|
||||
// to exit acquire by typing q
|
||||
if (kbhit() != 0) {
|
||||
if (fgetc(stdin) == 'q') {
|
||||
LOG(logINFO) << "Caught the command to stop acquisition";
|
||||
stopDetector({});
|
||||
}
|
||||
}
|
||||
// get and print progress
|
||||
double temp =
|
||||
(double)Parallel(&Module::getReceiverProgress, {0}).squash();
|
||||
if (temp != progress) {
|
||||
progress = temp;
|
||||
printProgress(progress);
|
||||
}
|
||||
|
||||
// exiting loop
|
||||
if (getJoinThreadFlag()) {
|
||||
// print progress one final time before exiting
|
||||
progress =
|
||||
(double)Parallel(&Module::getReceiverProgress, {0}).squash();
|
||||
printProgress(progress);
|
||||
break;
|
||||
}
|
||||
// otherwise error when connecting to the receiver too fast
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1644,6 +1644,77 @@ void DetectorImpl::verifyUniqueHost(
|
||||
}
|
||||
}
|
||||
|
||||
void DetectorImpl::assertTwoUDPDataInterfaces(const std::string &cmd) const {
|
||||
// assert globally
|
||||
auto numInterfaces =
|
||||
Parallel(&Module::getNumberofUDPInterfacesFromShm, {})
|
||||
.tsquash("Inconsistent number of UDP interfaces among modules");
|
||||
if (numInterfaces != 2) {
|
||||
throw RuntimeError(
|
||||
"Cannot " + cmd +
|
||||
". Change number of udp interfaces to 2 (cmd = numinterfaces).");
|
||||
}
|
||||
}
|
||||
|
||||
Result<bool> DetectorImpl::getUDPDataStream(const defs::portPosition port,
|
||||
Positions pos) const {
|
||||
assertTwoUDPDataInterfaces("get enable/disable UDP ports");
|
||||
return Parallel(&Module::getUDPDataStream, pos, port);
|
||||
}
|
||||
|
||||
void DetectorImpl::setUDPDataStream(const defs::portPosition port,
|
||||
const bool enable, Positions pos) {
|
||||
assertTwoUDPDataInterfaces("set enable/disable UDP ports");
|
||||
Parallel(&Module::setUDPDataStream, pos, port, enable);
|
||||
updateRxUDPDatastreamMetadata();
|
||||
}
|
||||
|
||||
void DetectorImpl::updateRxUDPDatastreamMetadata() {
|
||||
assertTwoUDPDataInterfaces(
|
||||
"update Disbaled UDP ports metadata in receiver");
|
||||
|
||||
std::vector<int> disable;
|
||||
auto portList = getPortPositionList();
|
||||
if (portList.size() != 2) {
|
||||
throw RuntimeError("Invalid port size. Expected 2.");
|
||||
}
|
||||
// bottom and left is port 0
|
||||
auto port0 = Parallel(&Module::getUDPDataStream, {}, portList[0]);
|
||||
auto port1 = Parallel(&Module::getUDPDataStream, {}, portList[1]);
|
||||
|
||||
// if any of them are disabled
|
||||
if (port0.any(false) || port1.any(false)) {
|
||||
// for each module: if disabled, push port index
|
||||
for (size_t i = 0; i != port0.size(); ++i) {
|
||||
if (!port0[i]) {
|
||||
disable.push_back(i * 2);
|
||||
}
|
||||
if (!port1[i]) {
|
||||
disable.push_back(i * 2 + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
modules[0]->updateRxUDPPortDisableMetadata(disable);
|
||||
}
|
||||
|
||||
std::vector<int> DetectorImpl::getRxDisabledUDPPortIndices() const {
|
||||
assertTwoUDPDataInterfaces("get Disbaled UDP ports metadata from receiver");
|
||||
return modules[0]->getRxUDPPortDisableMetadata();
|
||||
}
|
||||
|
||||
std::vector<defs::portPosition> DetectorImpl::getPortPositionList() const {
|
||||
switch (shm()->detType) {
|
||||
case defs::JUNGFRAU:
|
||||
case defs::MOENCH:
|
||||
return std::vector<defs::portPosition>{defs::BOTTOM, defs::TOP};
|
||||
case defs::EIGER:
|
||||
return std::vector<defs::portPosition>{defs::LEFT, defs::RIGHT};
|
||||
default:
|
||||
throw RuntimeError("port Position does not exist for this detector");
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<defs::ROI> DetectorImpl::getRxROI(int module_id) const {
|
||||
if (shm()->detType == CHIPTESTBOARD ||
|
||||
shm()->detType == defs::XILINX_CHIPTESTBOARD) {
|
||||
|
||||
@@ -278,10 +278,9 @@ class DetectorImpl : public virtual slsDetectorDefs {
|
||||
void stopDetector(Positions pos);
|
||||
|
||||
/**
|
||||
* Combines data from all readouts and gives it to the gui
|
||||
* or just gives progress of acquisition by polling receivers
|
||||
* gives progress of acquisition by polling receivers
|
||||
*/
|
||||
void processData(bool receiver);
|
||||
void printRxProgress();
|
||||
|
||||
/**
|
||||
* Convert raw file
|
||||
@@ -310,6 +309,15 @@ class DetectorImpl : public virtual slsDetectorDefs {
|
||||
std::vector<std::pair<std::string, uint16_t>>
|
||||
verifyUniqueRxHost(const std::vector<std::string> &names) const;
|
||||
|
||||
void assertTwoUDPDataInterfaces(const std::string &cmd) const;
|
||||
Result<bool> getUDPDataStream(const defs::portPosition port,
|
||||
Positions pos) const;
|
||||
void setUDPDataStream(const defs::portPosition port, const bool enable,
|
||||
Positions pos);
|
||||
void updateRxUDPDatastreamMetadata();
|
||||
std::vector<int> getRxDisabledUDPPortIndices() const;
|
||||
std::vector<defs::portPosition> getPortPositionList() const;
|
||||
|
||||
defs::xy getPortGeometry() const;
|
||||
std::vector<defs::ROI> getRxROI(int module_id = -1) const;
|
||||
void setRxROI(const std::vector<defs::ROI> &args);
|
||||
@@ -441,7 +449,8 @@ class DetectorImpl : public virtual slsDetectorDefs {
|
||||
|
||||
void printProgress(double progress);
|
||||
|
||||
void startProcessingThread(bool receiver);
|
||||
void startRxZmqProcessingThread();
|
||||
void startRxProgressThread();
|
||||
|
||||
/**
|
||||
* Check if processing thread is ready to join main thread
|
||||
|
||||
@@ -1407,6 +1407,76 @@ void Module::setTransmissionDelayRight(int value) {
|
||||
sendToDetector(F_SET_TRANSMISSION_DELAY_RIGHT, value, nullptr);
|
||||
}
|
||||
|
||||
bool Module::getUDPDataStream(const portPosition port) const {
|
||||
// receiver only
|
||||
if (shm()->detType == JUNGFRAU || shm()->detType == MOENCH) {
|
||||
if (!shm()->useReceiverFlag) {
|
||||
throw RuntimeError("No receiver to get udp datastream.");
|
||||
}
|
||||
return sendToReceiver<int>(F_RECEIVER_GET_UDP_DATASTREAM,
|
||||
static_cast<int>(port));
|
||||
} else
|
||||
return sendToDetector<int>(F_GET_DATASTREAM, static_cast<int>(port));
|
||||
}
|
||||
|
||||
void Module::setUDPDataStream(const portPosition port, const bool enable) {
|
||||
int args[]{static_cast<int>(port), static_cast<int>(enable)};
|
||||
if (shm()->detType == JUNGFRAU || shm()->detType == MOENCH) {
|
||||
if (!shm()->useReceiverFlag) {
|
||||
throw RuntimeError("No receiver to set udp datastream.");
|
||||
}
|
||||
sendToReceiver(F_RECEIVER_SET_UDP_DATASTREAM, args, nullptr);
|
||||
} else {
|
||||
sendToDetector(F_SET_DATASTREAM, args, nullptr);
|
||||
if (shm()->useReceiverFlag) {
|
||||
sendToReceiver(F_RECEIVER_SET_UDP_DATASTREAM, args, nullptr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Module::updateRxUDPPortDisableMetadata(const std::vector<int> &disable) {
|
||||
if (!shm()->useReceiverFlag) {
|
||||
return;
|
||||
}
|
||||
LOG(logDEBUG) << "Updating UDP port disable metadata in Receiver 0";
|
||||
auto client = ReceiverSocket(shm()->rxHostname, shm()->rxTCPPort);
|
||||
|
||||
client.Send(F_RECEIVER_SET_UDP_PORT_DISABLE_META);
|
||||
client.setFnum(F_RECEIVER_SET_UDP_PORT_DISABLE_META);
|
||||
|
||||
auto nports = static_cast<int>(disable.size());
|
||||
client.Send(nports);
|
||||
if (nports > 0) {
|
||||
client.Send(disable);
|
||||
}
|
||||
if (client.Receive<int>() == FAIL) {
|
||||
throw ReceiverError("Receiver " + std::to_string(moduleIndex) +
|
||||
" returned error: " + client.readErrorMessage());
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<int> Module::getRxUDPPortDisableMetadata() const {
|
||||
if (!shm()->useReceiverFlag) {
|
||||
throw RuntimeError("No receiver to get disabled udp port indices.");
|
||||
}
|
||||
|
||||
LOG(logDEBUG) << "Getting UDP port disable metadata in Receiver 0";
|
||||
auto client = ReceiverSocket(shm()->rxHostname, shm()->rxTCPPort);
|
||||
|
||||
client.Send(F_RECEIVER_GET_UDP_PORT_DISABLE_META);
|
||||
client.setFnum(F_RECEIVER_GET_UDP_PORT_DISABLE_META);
|
||||
if (client.Receive<int>() == FAIL) {
|
||||
throw ReceiverError("Receiver " + std::to_string(moduleIndex) +
|
||||
" returned error: " + client.readErrorMessage());
|
||||
}
|
||||
auto nports = client.Receive<int>();
|
||||
std::vector<int> retval(nports);
|
||||
if (nports > 0) {
|
||||
client.Receive(retval);
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
// Receiver Config
|
||||
|
||||
bool Module::getUseReceiverFlag() const { return shm()->useReceiverFlag; }
|
||||
@@ -1948,18 +2018,6 @@ void Module::setQuad(const bool enable) {
|
||||
}
|
||||
}
|
||||
|
||||
bool Module::getDataStream(const portPosition port) const {
|
||||
return sendToDetector<int>(F_GET_DATASTREAM, static_cast<int>(port));
|
||||
}
|
||||
|
||||
void Module::setDataStream(const portPosition port, const bool enable) {
|
||||
int args[]{static_cast<int>(port), static_cast<int>(enable)};
|
||||
sendToDetector(F_SET_DATASTREAM, args, nullptr);
|
||||
if (shm()->useReceiverFlag) {
|
||||
sendToReceiver(F_RECEIVER_SET_DATASTREAM, args, nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
bool Module::getTop() const {
|
||||
return (static_cast<bool>(sendToDetector<int>(F_GET_TOP)));
|
||||
}
|
||||
|
||||
@@ -279,6 +279,10 @@ class Module : public virtual slsDetectorDefs {
|
||||
void setTransmissionDelayLeft(int value);
|
||||
int getTransmissionDelayRight() const;
|
||||
void setTransmissionDelayRight(int value);
|
||||
bool getUDPDataStream(const portPosition port) const;
|
||||
void setUDPDataStream(const portPosition port, const bool enable);
|
||||
void updateRxUDPPortDisableMetadata(const std::vector<int> &disable);
|
||||
std::vector<int> getRxUDPPortDisableMetadata() const;
|
||||
|
||||
/**************************************************
|
||||
* *
|
||||
@@ -388,8 +392,6 @@ class Module : public virtual slsDetectorDefs {
|
||||
void pulseChip(int n_pulses = 0);
|
||||
bool getQuad() const;
|
||||
void setQuad(const bool enable);
|
||||
bool getDataStream(const portPosition port) const;
|
||||
void setDataStream(const portPosition port, const bool enable);
|
||||
bool getTop() const;
|
||||
void setTop(bool value);
|
||||
|
||||
|
||||
@@ -694,22 +694,6 @@ int InferAction::dacvalues() {
|
||||
}
|
||||
}
|
||||
|
||||
int InferAction::datastream() {
|
||||
|
||||
if (args.size() == 1) {
|
||||
return slsDetectorDefs::GET_ACTION;
|
||||
}
|
||||
|
||||
if (args.size() == 2) {
|
||||
return slsDetectorDefs::PUT_ACTION;
|
||||
}
|
||||
|
||||
else {
|
||||
|
||||
throw RuntimeError("Could not infer action: Wrong number of arguments");
|
||||
}
|
||||
}
|
||||
|
||||
int InferAction::dbitclk() {
|
||||
|
||||
if (args.size() == 0) {
|
||||
@@ -4025,6 +4009,22 @@ int InferAction::udp_cleardst() {
|
||||
}
|
||||
}
|
||||
|
||||
int InferAction::udp_datastream() {
|
||||
|
||||
if (args.size() == 1) {
|
||||
return slsDetectorDefs::GET_ACTION;
|
||||
}
|
||||
|
||||
if (args.size() == 2) {
|
||||
return slsDetectorDefs::PUT_ACTION;
|
||||
}
|
||||
|
||||
else {
|
||||
|
||||
throw RuntimeError("Could not infer action: Wrong number of arguments");
|
||||
}
|
||||
}
|
||||
|
||||
int InferAction::udp_dstip() {
|
||||
|
||||
if (args.size() == 0) {
|
||||
|
||||
@@ -56,7 +56,6 @@ class InferAction {
|
||||
int daclist();
|
||||
int dacname();
|
||||
int dacvalues();
|
||||
int datastream();
|
||||
int dbitclk();
|
||||
int dbitphase();
|
||||
int dbitpipeline();
|
||||
@@ -296,6 +295,7 @@ class InferAction {
|
||||
int txdelay_right();
|
||||
int type();
|
||||
int udp_cleardst();
|
||||
int udp_datastream();
|
||||
int udp_dstip();
|
||||
int udp_dstip2();
|
||||
int udp_dstlist();
|
||||
@@ -390,7 +390,6 @@ class InferAction {
|
||||
{"daclist", &InferAction::daclist},
|
||||
{"dacname", &InferAction::dacname},
|
||||
{"dacvalues", &InferAction::dacvalues},
|
||||
{"datastream", &InferAction::datastream},
|
||||
{"dbitclk", &InferAction::dbitclk},
|
||||
{"dbitphase", &InferAction::dbitphase},
|
||||
{"dbitpipeline", &InferAction::dbitpipeline},
|
||||
@@ -634,6 +633,7 @@ class InferAction {
|
||||
{"txdelay_right", &InferAction::txdelay_right},
|
||||
{"type", &InferAction::type},
|
||||
{"udp_cleardst", &InferAction::udp_cleardst},
|
||||
{"udp_datastream", &InferAction::udp_datastream},
|
||||
{"udp_dstip", &InferAction::udp_dstip},
|
||||
{"udp_dstip2", &InferAction::udp_dstip2},
|
||||
{"udp_dstlist", &InferAction::udp_dstlist},
|
||||
|
||||
@@ -6,6 +6,7 @@ target_sources(tests PRIVATE
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/test-SharedMemory.cpp
|
||||
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/acquire/Acquire.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/acquire/CTBState.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/acquire/ExpectedState.cpp
|
||||
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/Caller/test-Caller.cpp
|
||||
|
||||
@@ -589,46 +589,6 @@ TEST_CASE("quad", "[.detectorintegration]") {
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("datastream", "[.detectorintegration]") {
|
||||
Detector det;
|
||||
Caller caller(&det);
|
||||
auto det_type = det.getDetectorType().squash();
|
||||
if (det_type == defs::EIGER) {
|
||||
auto prev_val_left = det.getDataStream(defs::LEFT);
|
||||
auto prev_val_right = det.getDataStream(defs::RIGHT);
|
||||
// no "left" or "right"
|
||||
REQUIRE_THROWS(caller.call("datastream", {"1"}, -1, PUT));
|
||||
{
|
||||
std::ostringstream oss;
|
||||
caller.call("datastream", {"left", "0"}, -1, PUT, oss);
|
||||
REQUIRE(oss.str() == "datastream [left, 0]\n");
|
||||
}
|
||||
{
|
||||
std::ostringstream oss;
|
||||
caller.call("datastream", {"right", "0"}, -1, PUT, oss);
|
||||
REQUIRE(oss.str() == "datastream [right, 0]\n");
|
||||
}
|
||||
{
|
||||
std::ostringstream oss;
|
||||
caller.call("datastream", {"left", "1"}, -1, PUT, oss);
|
||||
REQUIRE(oss.str() == "datastream [left, 1]\n");
|
||||
}
|
||||
{
|
||||
std::ostringstream oss;
|
||||
caller.call("datastream", {"right", "1"}, -1, PUT, oss);
|
||||
REQUIRE(oss.str() == "datastream [right, 1]\n");
|
||||
}
|
||||
for (int i = 0; i != det.size(); ++i) {
|
||||
det.setDataStream(defs::LEFT, prev_val_left[i], {i});
|
||||
det.setDataStream(defs::RIGHT, prev_val_right[i], {i});
|
||||
}
|
||||
} else {
|
||||
REQUIRE_THROWS(caller.call("datastream", {}, -1, GET));
|
||||
REQUIRE_THROWS(caller.call("datastream", {"1"}, -1, PUT));
|
||||
REQUIRE_THROWS(caller.call("datastream", {"left", "1"}, -1, PUT));
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("top", "[.detectorintegration]") {
|
||||
Detector det;
|
||||
Caller caller(&det);
|
||||
|
||||
@@ -99,31 +99,4 @@ void test_onchip_dac_caller(defs::dacIndex index, const std::string &dacname,
|
||||
}
|
||||
}
|
||||
|
||||
std::pair<uint64_t, int>
|
||||
calculate_ctb_image_size(const acq::CTBState &test_info, bool isXilinxCtb) {
|
||||
|
||||
LOG(logDEBUG1) << test_info;
|
||||
sls::CtbImageInputs inputs{};
|
||||
inputs.mode = test_info.readout_mode;
|
||||
inputs.nAnalogSamples = test_info.num_adc_samples;
|
||||
inputs.adcMask = test_info.adc_enable_10g;
|
||||
if (!isXilinxCtb && !test_info.ten_giga) {
|
||||
inputs.adcMask = test_info.adc_enable_1g;
|
||||
}
|
||||
inputs.nTransceiverSamples = test_info.num_trans_samples;
|
||||
inputs.transceiverMask = test_info.transceiver_mask;
|
||||
inputs.nDigitalSamples = test_info.num_dbit_samples;
|
||||
inputs.dbitOffset = test_info.dbit_offset;
|
||||
inputs.dbitReorder = test_info.dbit_reorder;
|
||||
inputs.dbitList = test_info.dbit_list;
|
||||
|
||||
auto out = computeCtbImageSize(inputs);
|
||||
uint64_t image_size =
|
||||
out.nAnalogBytes + out.nDigitalBytes + out.nTransceiverBytes;
|
||||
LOG(logDEBUG1) << "Expected image size: " << image_size;
|
||||
int npixelx = out.nPixelsX;
|
||||
LOG(logDEBUG1) << "Expected number of pixels in x: " << npixelx;
|
||||
return std::make_pair(image_size, npixelx);
|
||||
}
|
||||
|
||||
} // namespace sls
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||
#pragma once
|
||||
|
||||
#include "acquire/CTBState.h"
|
||||
#include "checks/MasterFileChecks.h"
|
||||
#include "sls/sls_detector_defs.h"
|
||||
|
||||
#include <chrono>
|
||||
@@ -13,6 +13,8 @@
|
||||
namespace sls {
|
||||
|
||||
namespace acq = sls::test::acquire;
|
||||
namespace mf = sls::test::master_file;
|
||||
namespace checks = sls::test::checks;
|
||||
|
||||
void test_valid_port_caller(const std::string &command,
|
||||
const std::vector<std::string> &arguments,
|
||||
@@ -23,7 +25,42 @@ void test_dac_caller(slsDetectorDefs::dacIndex index,
|
||||
void test_onchip_dac_caller(slsDetectorDefs::dacIndex index,
|
||||
const std::string &dacname, int dacvalue);
|
||||
|
||||
std::pair<uint64_t, int>
|
||||
calculate_ctb_image_size(const acq::CTBState &test_info, bool isXilinxCtb);
|
||||
/**
|
||||
* Helper function to run an acquisition and check the master file (both binary
|
||||
* and hdf5) for expected values. The function takes in a lambda that is called
|
||||
* with the master filechecker object to perform checks on the master file. The
|
||||
* acquisition is run with default acquisition and file states, but these can be
|
||||
* modified within the lambda if needed. This version has the master file
|
||||
* checker object created within the function instead of using a helper
|
||||
* function, to allow for more flexibility in handling exceptions (especially
|
||||
* HDF5 exceptions) and logging.
|
||||
*/
|
||||
template <typename F>
|
||||
void test_run_with_master_file_checker(Detector &det, F f) {
|
||||
|
||||
auto acq_state = acq::default_acquisition_state();
|
||||
auto file_state = acq::default_file_state();
|
||||
std::array<defs::fileFormat, 2> formats = {defs::BINARY, defs::HDF5};
|
||||
|
||||
for (const auto &format : formats) {
|
||||
file_state.file_format = format;
|
||||
acq::run(det, acq_state, file_state);
|
||||
std::string fname = acq::get_master_file_name(file_state);
|
||||
if (format == defs::HDF5) {
|
||||
#ifdef HDF5C
|
||||
try {
|
||||
mf::Checker<mf::H5Context> checker(fname);
|
||||
f(det, acq_state, file_state, checker);
|
||||
} catch (H5::Exception &e) {
|
||||
LOG(logERROR) << "HDF5 error: " << e.getDetailMsg();
|
||||
throw;
|
||||
}
|
||||
#endif
|
||||
} else {
|
||||
mf::Checker<mf::JsonContext> checker(fname);
|
||||
f(det, acq_state, file_state, checker);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace sls
|
||||
|
||||
@@ -1,29 +1,15 @@
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||
#include "acquire/ExpectedState.h"
|
||||
#include "checks/MasterFileChecks.h"
|
||||
|
||||
#include "sls/Detector.h"
|
||||
#include "sls/ToString.h"
|
||||
#include "sls/logger.h"
|
||||
#include "test-Caller-global.h"
|
||||
|
||||
#include "catch.hpp"
|
||||
#include <filesystem>
|
||||
#include <fstream>
|
||||
#include <rapidjson/document.h>
|
||||
#include <rapidjson/error/en.h>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
|
||||
#ifdef HDF5C
|
||||
#include "H5Cpp.h"
|
||||
#endif
|
||||
|
||||
namespace sls {
|
||||
|
||||
namespace mf = sls::test::master_file;
|
||||
namespace acq = sls::test::acquire;
|
||||
namespace checks = sls::test::checks;
|
||||
|
||||
TEST_CASE("check_master_file_attributes",
|
||||
"[.detectorintegration][.disable_check_data_file]") {
|
||||
@@ -32,10 +18,6 @@ TEST_CASE("check_master_file_attributes",
|
||||
auto detType = det.getDetectorType().squash(defs::GENERIC);
|
||||
INFO("Testing master file attributes with " << ToString(detType));
|
||||
|
||||
// currently num frame = 1 (default)
|
||||
auto acq_state = acq::default_acquisition_state();
|
||||
auto file_state = acq::default_file_state();
|
||||
|
||||
// if ctb, set to default and restore after test
|
||||
std::optional<acq::CTBState> ctb_state = std::nullopt;
|
||||
if (detType == defs::CHIPTESTBOARD ||
|
||||
@@ -44,36 +26,75 @@ TEST_CASE("check_master_file_attributes",
|
||||
}
|
||||
acq::CTBStateGuard ctb_guard(det, ctb_state);
|
||||
|
||||
// binary => /tmp/sls_test_master_0.json
|
||||
file_state.file_format = defs::BINARY;
|
||||
acq::run(det, acq_state, file_state);
|
||||
test_run_with_master_file_checker(
|
||||
det, [&](auto &det, auto &acq_state, auto &file_state, auto &checker) {
|
||||
// get expected state of parameters and check against master file
|
||||
auto expected_state = acq::build_expected_state(
|
||||
det, acq_state, file_state, ctb_state);
|
||||
checks::check_metadata(checker, expected_state);
|
||||
});
|
||||
}
|
||||
|
||||
std::string fname = acq::get_master_file_name(file_state);
|
||||
mf::Checker<mf::JsonContext> checker(fname);
|
||||
TEST_CASE("udp_datastream with master file",
|
||||
"[.detectorintegration][.disable_check_data_file]") {
|
||||
Detector det;
|
||||
auto det_type = det.getDetectorType().squash();
|
||||
if (det_type == defs::EIGER) {
|
||||
auto prev_val_left = det.getUDPDataStream(defs::LEFT);
|
||||
auto prev_val_right = det.getUDPDataStream(defs::RIGHT);
|
||||
|
||||
// get expected state of parameters and check against master file
|
||||
acq::ExpectedState expected_state =
|
||||
acq::build_expected_state(det, acq_state, file_state, ctb_state);
|
||||
checks::check_metadata(checker, expected_state);
|
||||
det.setUDPDataStream(defs::LEFT, false);
|
||||
// check master file
|
||||
{
|
||||
// expected
|
||||
std::vector<defs::portPosition> expected_ports =
|
||||
det.getPortPositionList();
|
||||
std::vector<int> expected_disabled_ports =
|
||||
det.getRxDisabledUDPPortIndices();
|
||||
REQUIRE(expected_disabled_ports.size() > 0);
|
||||
|
||||
#ifdef HDF5C
|
||||
try {
|
||||
// hdf5 => /tmp/sls_test_master_0.h5
|
||||
file_state.file_format = defs::HDF5;
|
||||
acq::run(det, acq_state, file_state);
|
||||
test_run_with_master_file_checker(
|
||||
det, [&](auto &det, auto &acq_state, auto &file_state,
|
||||
auto &checker) {
|
||||
checks::check_udp_ports_type(checker, expected_ports);
|
||||
checks::check_udp_ports_disabled(checker,
|
||||
expected_disabled_ports);
|
||||
});
|
||||
}
|
||||
|
||||
std::string fname = acq::get_master_file_name(file_state);
|
||||
mf::Checker<mf::H5Context> checker(fname);
|
||||
for (int i = 0; i != det.size(); ++i) {
|
||||
det.setUDPDataStream(defs::LEFT, prev_val_left[i], {i});
|
||||
det.setUDPDataStream(defs::RIGHT, prev_val_right[i], {i});
|
||||
}
|
||||
} else if ((det_type == defs::JUNGFRAU || det_type == defs::MOENCH) &&
|
||||
(det.getNumberofUDPInterfaces().squash(0) == 2)) {
|
||||
auto prev_val_top = det.getUDPDataStream(defs::TOP);
|
||||
auto prev_val_bottom = det.getUDPDataStream(defs::BOTTOM);
|
||||
|
||||
// get expected state of parameters and check against master file
|
||||
acq::ExpectedState expected_state =
|
||||
acq::build_expected_state(det, acq_state, file_state, ctb_state);
|
||||
checks::check_metadata(checker, expected_state);
|
||||
} catch (H5::Exception &e) {
|
||||
LOG(logERROR) << "HDF5 error: " << e.getDetailMsg();
|
||||
throw;
|
||||
det.setUDPDataStream(defs::TOP, false);
|
||||
// check master file
|
||||
{
|
||||
// expected
|
||||
std::vector<defs::portPosition> expected_ports =
|
||||
det.getPortPositionList();
|
||||
std::vector<int> expected_disabled_ports =
|
||||
det.getRxDisabledUDPPortIndices();
|
||||
REQUIRE(expected_disabled_ports.size() > 0);
|
||||
|
||||
test_run_with_master_file_checker(
|
||||
det, [&](auto &det, auto &acq_state, auto &file_state,
|
||||
auto &checker) {
|
||||
checks::check_udp_ports_type(checker, expected_ports);
|
||||
checks::check_udp_ports_disabled(checker,
|
||||
expected_disabled_ports);
|
||||
});
|
||||
}
|
||||
|
||||
for (int i = 0; i != det.size(); ++i) {
|
||||
det.setUDPDataStream(defs::TOP, prev_val_top[i], {i});
|
||||
det.setUDPDataStream(defs::BOTTOM, prev_val_bottom[i], {i});
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
} // namespace sls
|
||||
|
||||
@@ -127,7 +127,8 @@ TEST_CASE("rx_framescaught", "[.detectorintegration]") {
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("rx_missingpackets", "[.detectorintegration]") {
|
||||
TEST_CASE("rx_missingpackets",
|
||||
"[.detectorintegration][.disable_check_data_file]") {
|
||||
Detector det;
|
||||
Caller caller(&det);
|
||||
auto prev_val = det.getFileWrite();
|
||||
|
||||
@@ -3068,6 +3068,95 @@ TEST_CASE("txdelay", "[.detectorintegration]") {
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("udp_datastream", "[.detectorintegration]") {
|
||||
Detector det;
|
||||
Caller caller(&det);
|
||||
auto det_type = det.getDetectorType().squash();
|
||||
if (det_type == defs::EIGER) {
|
||||
auto prev_val_left = det.getUDPDataStream(defs::LEFT);
|
||||
auto prev_val_right = det.getUDPDataStream(defs::RIGHT);
|
||||
|
||||
// invalid args
|
||||
REQUIRE_THROWS(caller.call("udp_datastream", {"top", "1"}, -1, PUT));
|
||||
REQUIRE_THROWS(caller.call("udp_datastream", {"bottom", "1"}, -1, PUT));
|
||||
// no "left" or "right" argument
|
||||
REQUIRE_THROWS(caller.call("udp_datastream", {"1"}, -1, PUT));
|
||||
{
|
||||
std::ostringstream oss;
|
||||
caller.call("udp_datastream", {"left", "0"}, -1, PUT, oss);
|
||||
REQUIRE(oss.str() == "udp_datastream [left, 0]\n");
|
||||
}
|
||||
{
|
||||
std::ostringstream oss;
|
||||
caller.call("udp_datastream", {"right", "0"}, -1, PUT, oss);
|
||||
REQUIRE(oss.str() == "udp_datastream [right, 0]\n");
|
||||
}
|
||||
{
|
||||
std::ostringstream oss;
|
||||
caller.call("udp_datastream", {"left", "1"}, -1, PUT, oss);
|
||||
REQUIRE(oss.str() == "udp_datastream [left, 1]\n");
|
||||
}
|
||||
{
|
||||
std::ostringstream oss;
|
||||
caller.call("udp_datastream", {"right", "1"}, -1, PUT, oss);
|
||||
REQUIRE(oss.str() == "udp_datastream [right, 1]\n");
|
||||
}
|
||||
for (int i = 0; i != det.size(); ++i) {
|
||||
det.setUDPDataStream(defs::LEFT, prev_val_left[i], {i});
|
||||
det.setUDPDataStream(defs::RIGHT, prev_val_right[i], {i});
|
||||
}
|
||||
} else if (det_type == defs::JUNGFRAU || det_type == defs::MOENCH) {
|
||||
|
||||
// throw with 1 interface
|
||||
if (det.getNumberofUDPInterfaces().squash() == 1) {
|
||||
REQUIRE_THROWS(
|
||||
caller.call("udp_datastream", {"top", "0"}, -1, PUT));
|
||||
}
|
||||
// 2 interfaces
|
||||
else {
|
||||
auto prev_val_top = det.getUDPDataStream(defs::TOP);
|
||||
auto prev_val_bottom = det.getUDPDataStream(defs::BOTTOM);
|
||||
|
||||
// invalid args
|
||||
REQUIRE_THROWS(
|
||||
caller.call("udp_datastream", {"left", "1"}, -1, PUT));
|
||||
REQUIRE_THROWS(
|
||||
caller.call("udp_datastream", {"right", "1"}, -1, PUT));
|
||||
// no "top" or "bottom" argument
|
||||
REQUIRE_THROWS(caller.call("udp_datastream", {"1"}, -1, PUT));
|
||||
{
|
||||
std::ostringstream oss;
|
||||
caller.call("udp_datastream", {"top", "0"}, -1, PUT, oss);
|
||||
REQUIRE(oss.str() == "udp_datastream [top, 0]\n");
|
||||
}
|
||||
{
|
||||
std::ostringstream oss;
|
||||
caller.call("udp_datastream", {"bottom", "0"}, -1, PUT, oss);
|
||||
REQUIRE(oss.str() == "udp_datastream [bottom, 0]\n");
|
||||
}
|
||||
{
|
||||
std::ostringstream oss;
|
||||
caller.call("udp_datastream", {"top", "1"}, -1, PUT, oss);
|
||||
REQUIRE(oss.str() == "udp_datastream [top, 1]\n");
|
||||
}
|
||||
{
|
||||
std::ostringstream oss;
|
||||
caller.call("udp_datastream", {"bottom", "1"}, -1, PUT, oss);
|
||||
REQUIRE(oss.str() == "udp_datastream [bottom, 1]\n");
|
||||
}
|
||||
for (int i = 0; i != det.size(); ++i) {
|
||||
det.setUDPDataStream(defs::TOP, prev_val_top[i], {i});
|
||||
det.setUDPDataStream(defs::BOTTOM, prev_val_bottom[i], {i});
|
||||
}
|
||||
}
|
||||
} else {
|
||||
REQUIRE_THROWS(caller.call("udp_datastream", {}, -1, GET));
|
||||
REQUIRE_THROWS(caller.call("udp_datastream", {"1"}, -1, PUT));
|
||||
REQUIRE_THROWS(caller.call("udp_datastream", {"left", "1"}, -1, PUT));
|
||||
REQUIRE_THROWS(caller.call("udp_datastream", {"top", "1"}, -1, PUT));
|
||||
}
|
||||
}
|
||||
|
||||
/* ZMQ Streaming Parameters (Receiver<->Client) */
|
||||
|
||||
TEST_CASE("zmqport", "[.detectorintegration]") {
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||
|
||||
#include "CTBState.h"
|
||||
#include "GeneralData.h"
|
||||
|
||||
namespace sls::test::acquire {
|
||||
|
||||
std::pair<uint64_t, int> calculate_ctb_image_size(const CTBState &test_info,
|
||||
bool isXilinxCtb) {
|
||||
LOG(logDEBUG1) << test_info;
|
||||
CtbImageInputs inputs{};
|
||||
inputs.mode = test_info.readout_mode;
|
||||
inputs.nAnalogSamples = test_info.num_adc_samples;
|
||||
inputs.adcMask = test_info.adc_enable_10g;
|
||||
if (!isXilinxCtb && !test_info.ten_giga) {
|
||||
inputs.adcMask = test_info.adc_enable_1g;
|
||||
}
|
||||
inputs.nTransceiverSamples = test_info.num_trans_samples;
|
||||
inputs.transceiverMask = test_info.transceiver_mask;
|
||||
inputs.nDigitalSamples = test_info.num_dbit_samples;
|
||||
inputs.dbitOffset = test_info.dbit_offset;
|
||||
inputs.dbitReorder = test_info.dbit_reorder;
|
||||
inputs.dbitList = test_info.dbit_list;
|
||||
|
||||
auto out = computeCtbImageSize(inputs);
|
||||
uint64_t image_size =
|
||||
out.nAnalogBytes + out.nDigitalBytes + out.nTransceiverBytes;
|
||||
LOG(logDEBUG1) << "Expected image size: " << image_size;
|
||||
int npixelx = out.nPixelsX;
|
||||
LOG(logDEBUG1) << "Expected number of pixels in x: " << npixelx;
|
||||
return std::make_pair(image_size, npixelx);
|
||||
}
|
||||
|
||||
} // namespace sls::test::acquire
|
||||
@@ -135,4 +135,14 @@ class CTBStateGuard {
|
||||
CTBState saved_;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief
|
||||
* @param test_info current CTB state
|
||||
* @param isXilinxCtb if the detector type is Xilinx CTB
|
||||
* @return std::pair<uint64_t, int> pair of image size in bytes and number of
|
||||
* channels in dimension X (Currently only analog channels)
|
||||
*/
|
||||
std::pair<uint64_t, int> calculate_ctb_image_size(const CTBState &test_info,
|
||||
bool isXilinxCtb);
|
||||
|
||||
} // namespace sls::test::acquire
|
||||
@@ -2,7 +2,6 @@
|
||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||
|
||||
#include "ExpectedState.h"
|
||||
#include "Caller/test-Caller-global.h"
|
||||
#include "receiver_defs.h"
|
||||
|
||||
// unnamed namespace for internal linkage
|
||||
@@ -47,7 +46,7 @@ defs::xy get_port_shape(const Detector &det,
|
||||
"CTB state must be provided to calculate expected port shape");
|
||||
}
|
||||
portSize.x =
|
||||
sls::calculate_ctb_image_size(
|
||||
acq::calculate_ctb_image_size(
|
||||
ctb_state.value(), det_type == defs::XILINX_CHIPTESTBOARD)
|
||||
.second;
|
||||
portSize.y = 1;
|
||||
@@ -136,6 +135,14 @@ int get_num_udp_interfaces(const Detector &det) {
|
||||
"Inconsistent number of UDP interfaces");
|
||||
}
|
||||
|
||||
std::vector<defs::portPosition> get_udp_port_types(const Detector &det) {
|
||||
return det.getPortPositionList();
|
||||
}
|
||||
|
||||
std::vector<int> get_udp_ports_disabled(const Detector &det) {
|
||||
return det.getRxDisabledUDPPortIndices();
|
||||
}
|
||||
|
||||
int get_read_n_rows(const Detector &det) {
|
||||
return det.getReadNRows().tsquash("Inconsistent number of read rows");
|
||||
}
|
||||
@@ -184,6 +191,10 @@ acq::JungfrauExpectedState build_jungfrau_specific_state(const Detector &det) {
|
||||
e.exptime = get_exptime(det);
|
||||
e.period = get_period(det);
|
||||
e.num_udp_interfaces = get_num_udp_interfaces(det);
|
||||
if (e.num_udp_interfaces == 2) {
|
||||
e.udp_port_types = get_udp_port_types(det);
|
||||
e.udp_ports_disabled = get_udp_ports_disabled(det);
|
||||
}
|
||||
e.read_n_rows = get_read_n_rows(det);
|
||||
e.readout_speed = get_readout_speed(det);
|
||||
return e;
|
||||
@@ -195,6 +206,10 @@ acq::MoenchExpectedState build_moench_specific_state(const Detector &det) {
|
||||
e.exptime = get_exptime(det);
|
||||
e.period = get_period(det);
|
||||
e.num_udp_interfaces = get_num_udp_interfaces(det);
|
||||
if (e.num_udp_interfaces == 2) {
|
||||
e.udp_port_types = get_udp_port_types(det);
|
||||
e.udp_ports_disabled = get_udp_ports_disabled(det);
|
||||
}
|
||||
e.read_n_rows = get_read_n_rows(det);
|
||||
e.readout_speed = get_readout_speed(det);
|
||||
return e;
|
||||
@@ -213,6 +228,8 @@ acq::EigerExpectedState build_eiger_specific_state(const Detector &det) {
|
||||
e.sub_exptime = sub_exptime;
|
||||
e.sub_period = sub_period;
|
||||
e.quad = det.getQuad().tsquash("Inconsistent quad setting");
|
||||
e.udp_port_types = get_udp_port_types(det);
|
||||
e.udp_ports_disabled = get_udp_ports_disabled(det);
|
||||
e.read_n_rows = get_read_n_rows(det);
|
||||
{
|
||||
for (auto item : det.getRateCorrection())
|
||||
@@ -342,7 +359,7 @@ int get_expected_image_size(const Detector &det,
|
||||
}
|
||||
LOG(logINFORED) << ctb_state.value();
|
||||
image_size =
|
||||
sls::calculate_ctb_image_size(
|
||||
acq::calculate_ctb_image_size(
|
||||
ctb_state.value(), (det_type == defs::XILINX_CHIPTESTBOARD))
|
||||
.first;
|
||||
break;
|
||||
|
||||
@@ -31,6 +31,8 @@ struct JungfrauExpectedState {
|
||||
ns exptime{};
|
||||
ns period{};
|
||||
int num_udp_interfaces{};
|
||||
std::vector<defs::portPosition> udp_port_types;
|
||||
std::vector<int> udp_ports_disabled;
|
||||
int read_n_rows{};
|
||||
defs::speedLevel readout_speed{};
|
||||
};
|
||||
@@ -40,6 +42,8 @@ struct MoenchExpectedState {
|
||||
ns exptime{};
|
||||
ns period{};
|
||||
int num_udp_interfaces{};
|
||||
std::vector<defs::portPosition> udp_port_types;
|
||||
std::vector<int> udp_ports_disabled;
|
||||
int read_n_rows{};
|
||||
defs::speedLevel readout_speed{};
|
||||
};
|
||||
@@ -54,6 +58,8 @@ struct EigerExpectedState {
|
||||
ns sub_exptime{};
|
||||
ns sub_period{};
|
||||
bool quad{};
|
||||
std::vector<defs::portPosition> udp_port_types;
|
||||
std::vector<int> udp_ports_disabled;
|
||||
int read_n_rows{};
|
||||
std::vector<int64_t> rate_corrections{};
|
||||
defs::speedLevel readout_speed{};
|
||||
|
||||
@@ -128,6 +128,22 @@ void check_num_udp_interfaces(CheckerT &checker, const int &value) {
|
||||
value);
|
||||
}
|
||||
|
||||
template <typename CheckerT>
|
||||
void check_udp_ports_type(CheckerT &checker,
|
||||
const std::vector<defs::portPosition> &value) {
|
||||
REQUIRE(value.size() == 2);
|
||||
std::vector<std::string> ports = {ToString(value[0]), ToString(value[1])};
|
||||
checker.template check<std::vector<std::string>>(
|
||||
MasterAttributes::N_UDP_PORTS_TYPE.data(), ports);
|
||||
}
|
||||
|
||||
template <typename CheckerT>
|
||||
void check_udp_ports_disabled(CheckerT &checker,
|
||||
const std::vector<int> &value) {
|
||||
checker.template check<std::vector<int>>(
|
||||
MasterAttributes::N_UDP_PORTS_DISABLED.data(), value);
|
||||
}
|
||||
|
||||
template <typename CheckerT>
|
||||
void check_read_n_rows(CheckerT &checker, const int &value) {
|
||||
checker.template check<int>(MasterAttributes::N_NUMBER_OF_ROWS.data(),
|
||||
@@ -318,6 +334,10 @@ void check_jungfrau_metadata(CheckerT &checker,
|
||||
check_exptime(checker, st.exptime);
|
||||
check_period(checker, st.period);
|
||||
check_num_udp_interfaces(checker, st.num_udp_interfaces);
|
||||
if (st.num_udp_interfaces == 2) {
|
||||
check_udp_ports_type(checker, st.udp_port_types);
|
||||
check_udp_ports_disabled(checker, st.udp_ports_disabled);
|
||||
}
|
||||
check_read_n_rows(checker, st.read_n_rows);
|
||||
check_readout_speed(checker, st.readout_speed);
|
||||
}
|
||||
@@ -331,6 +351,10 @@ void check_moench_metadata(CheckerT &checker,
|
||||
check_exptime(checker, st.exptime);
|
||||
check_period(checker, st.period);
|
||||
check_num_udp_interfaces(checker, st.num_udp_interfaces);
|
||||
if (st.num_udp_interfaces == 2) {
|
||||
check_udp_ports_type(checker, st.udp_port_types);
|
||||
check_udp_ports_disabled(checker, st.udp_ports_disabled);
|
||||
}
|
||||
check_read_n_rows(checker, st.read_n_rows);
|
||||
check_readout_speed(checker, st.readout_speed);
|
||||
}
|
||||
@@ -349,6 +373,8 @@ void check_eiger_metadata(CheckerT &checker,
|
||||
check_sub_exptime(checker, st.sub_exptime);
|
||||
check_sub_period(checker, st.sub_period);
|
||||
check_quad(checker, st.quad);
|
||||
check_udp_ports_type(checker, st.udp_port_types);
|
||||
check_udp_ports_disabled(checker, st.udp_ports_disabled);
|
||||
check_read_n_rows(checker, st.read_n_rows);
|
||||
check_rate_corrections(checker, st.rate_corrections);
|
||||
check_readout_speed(checker, st.readout_speed);
|
||||
|
||||
@@ -238,6 +238,23 @@ template <> struct Reader<H5Context, std::array<ns, 3UL>> {
|
||||
}
|
||||
};
|
||||
|
||||
template <> struct Reader<H5Context, std::vector<int>> {
|
||||
static std::vector<int> read(const H5Context &ctx, const std::string &name,
|
||||
AccessType access) {
|
||||
if (access == AccessType::Attribute) {
|
||||
throw RuntimeError("'std::vector<int>' attribute access not "
|
||||
"supported for HDF5");
|
||||
}
|
||||
require_dataset(ctx, name);
|
||||
auto ds = ctx.file.openDataSet(HDF5_GROUP + name);
|
||||
auto len = get_1d_size(ds);
|
||||
std::vector<int> out{};
|
||||
out.resize(len);
|
||||
ds.read(out.data(), H5::PredType::NATIVE_INT);
|
||||
return out;
|
||||
}
|
||||
};
|
||||
|
||||
template <> struct Reader<H5Context, std::vector<int64_t>> {
|
||||
static std::vector<int64_t>
|
||||
read(const H5Context &ctx, const std::string &name, AccessType access) {
|
||||
@@ -255,6 +272,29 @@ template <> struct Reader<H5Context, std::vector<int64_t>> {
|
||||
}
|
||||
};
|
||||
|
||||
template <> struct Reader<H5Context, std::vector<std::string>> {
|
||||
static std::vector<std::string>
|
||||
read(const H5Context &ctx, const std::string &name, AccessType access) {
|
||||
if (access == AccessType::Attribute) {
|
||||
throw RuntimeError(
|
||||
"'std::vector<std::string>' attribute access not "
|
||||
"supported for HDF5");
|
||||
}
|
||||
require_dataset(ctx, name);
|
||||
auto ds = ctx.file.openDataSet(HDF5_GROUP + name);
|
||||
H5::StrType strType(H5::PredType::C_S1, H5T_VARIABLE);
|
||||
std::vector<const char *> raw;
|
||||
raw.resize(get_1d_size(ds));
|
||||
ds.read(raw.data(), strType);
|
||||
std::vector<std::string> out;
|
||||
out.reserve(raw.size());
|
||||
for (auto c : raw) {
|
||||
out.emplace_back(c);
|
||||
}
|
||||
return out;
|
||||
}
|
||||
};
|
||||
|
||||
template <> struct Reader<H5Context, std::map<std::string, std::string>> {
|
||||
static std::map<std::string, std::string>
|
||||
read(const H5Context &ctx, const std::string &name, AccessType access) {
|
||||
|
||||
@@ -120,6 +120,17 @@ template <> struct Reader<JsonContext, std::array<ns, 3UL>> {
|
||||
}
|
||||
};
|
||||
|
||||
template <> struct Reader<JsonContext, std::vector<int>> {
|
||||
static std::vector<int> read(const JsonContext &ctx,
|
||||
const std::string &name, AccessType access) {
|
||||
std::vector<int> out{};
|
||||
for (const auto &item : ctx.doc[name.c_str()].GetArray()) {
|
||||
out.push_back(item.GetInt());
|
||||
}
|
||||
return out;
|
||||
}
|
||||
};
|
||||
|
||||
template <> struct Reader<JsonContext, std::vector<int64_t>> {
|
||||
static std::vector<int64_t>
|
||||
read(const JsonContext &ctx, const std::string &name, AccessType access) {
|
||||
@@ -131,6 +142,17 @@ template <> struct Reader<JsonContext, std::vector<int64_t>> {
|
||||
}
|
||||
};
|
||||
|
||||
template <> struct Reader<JsonContext, std::vector<std::string>> {
|
||||
static std::vector<std::string>
|
||||
read(const JsonContext &ctx, const std::string &name, AccessType access) {
|
||||
std::vector<std::string> out{};
|
||||
for (const auto &item : ctx.doc[name.c_str()].GetArray()) {
|
||||
out.push_back(item.GetString());
|
||||
}
|
||||
return out;
|
||||
}
|
||||
};
|
||||
|
||||
template <> struct Reader<JsonContext, std::map<std::string, std::string>> {
|
||||
static std::map<std::string, std::string>
|
||||
read(const JsonContext &ctx, const std::string &name, AccessType access) {
|
||||
|
||||
Reference in New Issue
Block a user