7# ------------------------------------------------------------------------------------------
9# Example script to run JDataFilter and JDataWriter using JDQSimulator(s)
11# ------------------------------------------------------------------------------------------
13if [ -z $JPP_DIR ]; then
14 echo "Variable JPP_DIR undefined."
18source $JPP_DIR/setenv.sh $JPP_DIR
22set_variable: DEBUG TEST_DEBUG 3
23set_variable: WORKDIR TEST_WORKDIR ${TMPDIR:-/tmp}/XXXXXX
24set_variable IP_ADDRESS `get_ip_address`
25set_variable LIGIER 5554
27set_variable MESSAGE_SERVER localhost:${LIGIER}
28set_variable MESSAGE_LOGGER localhost:${LIGIER}
30set_variable TIMEOUT_S 10
31set_variable RUNTIME_S 30
32set_variable SOURCE_HOST $IP_ADDRESS
34let "STDEV = 4.0" # standard deviation
38FILTER_HOST[5551]=$IP_ADDRESS
39FILTER_HOST[5552]=$IP_ADDRESS
40FILTER_HOST[5553]=$IP_ADDRESS
42set_variable WRITER_HOST $IP_ADDRESS
43set_variable DQ_SIMULATOR JDQSimulator
44set_variable DATAWRITER W000/W000
45set_variable SINGLESRATE_HZ 1e3
46set_variable DOUBLESRATE_HZ 0e3
47set_variable TRIGGERRATE_HZ 100.0
48set_variable NUMBER_OF_SLICES 10
51 usage "$script [working directory]"
55 1) set_variable WORKDIR $1;&
57 *) fatal "Wrong number of arguments."
61 error "This test cannot be performed in CC-Lyon."
65WORKDIR=$(mktemp -d $WORKDIR)
67set_variable DETECTOR $WORKDIR/detector.detx
75set_variable INPUT_FILE $WORKDIR/timeslice.root
76set_variable OUTPUT_FILE $WORKDIR/KM3NeT_${ID}_${RUN}.root
81JLigier-local.sh ${LIGIER} continue
86JModule -D $ID -M 101 -o $DETECTOR
91if ( ! reuse_file $INPUT_FILE ); then
93 JRandomTimesliceWriter \
96 -B "$SINGLESRATE_HZ $DOUBLESRATE_HZ" \
97 -n $NUMBER_OF_SLICES \
104rm -f $OUTPUT_FILE >& /dev/null
107set_variable NUMBER_OF_FRAMES `JPrintDetector -a $DETECTOR -O modules | awk '/Module/ {if ($4 != 0) {print $0}}' | wc -l`
110# JDataFilter configure data
112cat>$WORKDIR/ev_configure_datafilter.txt<<EOF
115dataWriter = ${WRITER_HOST}:${LIGIER};
116numberOfFramesPerSlice = ${NUMBER_OF_FRAMES};
117detector = %<${DETECTOR}>%;
118triggerParameters = triggerRandom.enabled = 1;
119triggerParameters = triggerRandom.rate_Hz = $TRIGGERRATE_HZ;
120queueSize = 100000000;
121JDataWriter = ${DATAWRITER} ${WRITER_HOST};
124# JDQSimulator configure data.
126cat>$WORKDIR/ev_configure_dqsimulator.txt<<EOF
127numberOfFrames = ${NUMBER_OF_FRAMES};
129inputFile = ${INPUT_FILE};
130source = 0 ${DQ_SIMULATOR};
136cat>$WORKDIR/driver.txt<<EOF
138process ${DQ_SIMULATOR} $SOURCE_HOST ssh $SOURCE_HOST "(setenv ROOTSYS $ROOTSYS && source $JPP_DIR/setenv.csh $JPP_DIR && (JDQSimulator -H \$SERVER\$ -M \$LOGGER\$ -d $DEBUG -u ${DQ_SIMULATOR} </dev/null >&/dev/null &))";
139process ${DATAWRITER} $WRITER_HOST ssh $WRITER_HOST "(setenv ROOTSYS $ROOTSYS && source $JPP_DIR/setenv.csh $JPP_DIR && (JDataWriter -H \$SERVER\$ -M \$LOGGER\$ -d $DEBUG -u ${DATAWRITER} -D ${WRITER_HOST}:${LIGIER} -p $WORKDIR </dev/null >&/dev/null &))";
143KEYS=(${(k)FILTER_HOST})
145for (( i = 1; $i <= ${#KEYS}; i += 1 )); do
147 set_variable DATAFILTER F${(l:3::0::0:0)i}/F${(l:3::0::0:0)i}
148 set_variable PORT $KEYS[$i]
149 set_variable HOST $FILTER_HOST[$PORT]
151 echo "target = $i ${HOST}:${PORT};" >> $WORKDIR/ev_configure_dqsimulator.txt
152 echo "JDataFilter = ${DATAFILTER} ${HOST}:${PORT};" >> $WORKDIR/ev_configure_datafilter.txt
154 echo "process ${DATAFILTER} $HOST \
155 (setenv ROOTSYS $ROOTSYS && source $JPP_DIR/setenv.csh $JPP_DIR && (JDataFilter -u $DATAFILTER -H \$SERVER\$ -M \$LOGGER\$ -P $PORT -d $DEBUG </dev/null >&/dev/null &));" >> $WORKDIR/driver.txt
158cat>>$WORKDIR/driver.txt<<EOF
164event ev_init { RC_CMD }
167 RC_DFLTR %<$WORKDIR/ev_configure_datafilter.txt>%
168 RC_DQSIM %<$WORKDIR/ev_configure_dqsimulator.txt>%
169 RC_DWRT path=$WORKDIR; update_s=10; logger_s=5;
172event ev_start { RC_CMD $RUN $ID }
176event ev_pause { RC_CMD }
177event ev_stop { RC_CMD }
178event ev_reset { RC_CMD }
179event ev_off { RC_CMD }
190 -f $WORKDIR/driver.txt \
197set_variable NUMBER_OF_EVENTS `JPrintTree -f $OUTPUT_FILE -@ "type = JDAQEvent" -k number_of_entries`
198set_variable NUMBER_OF_SUMMARYSLICES `JPrintTree -f $OUTPUT_FILE -@ "type = JDAQSummaryslice" -k number_of_entries`
200R=($(( ($NUMBER_OF_EVENTS * 1.0) / ($NUMBER_OF_SUMMARYSLICES * 0.1)))
201 $(( sqrt($NUMBER_OF_EVENTS * 1.0) / ($NUMBER_OF_SUMMARYSLICES * 0.1))))
203printf "Rate %7.3f +/- %7.3f ?= %7.3f\n" $R[1] $R[2] $TRIGGERRATE_HZ
205if (( $R[1] > $TRIGGERRATE_HZ + $STDEV*$R[2] )) || (($R[1] < $TRIGGERRATE_HZ - $STDEV*$R[2] )); then
206 fatal "Rate $R[1] +/- $R[2] != $TRIGGERRATE_HZ"
212JStopDAQ.sh $MESSAGE_SERVER $MESSAGE_LOGGER
214ssh $WRITER_HOST "killall JDataWriter" >& /dev/null
215ssh $FILTER_HOST "killall JDataFilter" >& /dev/null
216killall JDQSimulator >& /dev/null