Jpp 21.0.0-rc.1
the software that should make you happy
Loading...
Searching...
No Matches
examples/JDataFilter/JDataFilter.sh
Go to the documentation of this file.
1#!/usr/bin/env zsh
2#
3# \author mdejong
4#
5script=${0##*/}
6
7# ------------------------------------------------------------------------------------------
8#
9# Example script to run JDataFilter and JDataWriter using JDQSimulator(s)
10#
11# ------------------------------------------------------------------------------------------
12
13if [ -z $JPP_DIR ]; then
14 echo "Variable JPP_DIR undefined."
15 exit
16fi
17
18source $JPP_DIR/setenv.sh $JPP_DIR
19
20zmodload zsh/mathfunc
21
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
26
27set_variable MESSAGE_SERVER localhost:${LIGIER}
28set_variable MESSAGE_LOGGER localhost:${LIGIER}
29
30set_variable TIMEOUT_S 10
31set_variable RUNTIME_S 30
32set_variable SOURCE_HOST $IP_ADDRESS
33
34let "STDEV = 4.0" # standard deviation
35
36typeset -A FILTER_HOST
37
38FILTER_HOST[5551]=$IP_ADDRESS
39FILTER_HOST[5552]=$IP_ADDRESS
40FILTER_HOST[5553]=$IP_ADDRESS
41
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
49
50if do_usage $*; then
51 usage "$script [working directory]"
52fi
53
54case $# in
55 1) set_variable WORKDIR $1;&
56 0) ;;
57 *) fatal "Wrong number of arguments."
58esac
59
60if ( is_CCLyon ); then
61 error "This test cannot be performed in CC-Lyon."
62 exit 0
63fi
64
65WORKDIR=$(mktemp -d $WORKDIR)
66
67set_variable DETECTOR $WORKDIR/detector.detx
68
69set_variable ID 1000
70set_variable RUN 1001
71
72typeset -Z 8 ID
73typeset -Z 8 RUN
74
75set_variable INPUT_FILE $WORKDIR/timeslice.root
76set_variable OUTPUT_FILE $WORKDIR/KM3NeT_${ID}_${RUN}.root
77
78
79# Continue server
80
81JLigier-local.sh ${LIGIER} continue
82
83
84# Create detector
85
86JModule -D $ID -M 101 -o $DETECTOR
87
88
89# Create input data
90
91if ( ! reuse_file $INPUT_FILE ); then
92
93 JRandomTimesliceWriter \
94 -a $DETECTOR \
95 -o $INPUT_FILE \
96 -B "$SINGLESRATE_HZ $DOUBLESRATE_HZ" \
97 -n $NUMBER_OF_SLICES \
98 -d1 --!
99fi
100
101
102# Remove output data
103
104rm -f $OUTPUT_FILE >& /dev/null
105
106
107set_variable NUMBER_OF_FRAMES `JPrintDetector -a $DETECTOR -O modules | awk '/Module/ {if ($4 != 0) {print $0}}' | wc -l`
108
109
110# JDataFilter configure data
111
112cat>$WORKDIR/ev_configure_datafilter.txt<<EOF
113logger_s = 5;
114update_s = 10;
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};
122EOF
123
124# JDQSimulator configure data.
125
126cat>$WORKDIR/ev_configure_dqsimulator.txt<<EOF
127numberOfFrames = ${NUMBER_OF_FRAMES};
128numberOfEvents = 1;
129inputFile = ${INPUT_FILE};
130source = 0 ${DQ_SIMULATOR};
131EOF
132
133
134# Driver input.
135
136cat>$WORKDIR/driver.txt<<EOF
137
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 &))";
140
141EOF
142
143KEYS=(${(k)FILTER_HOST})
144
145for (( i = 1; $i <= ${#KEYS}; i += 1 )); do
146
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]
150
151 echo "target = $i ${HOST}:${PORT};" >> $WORKDIR/ev_configure_dqsimulator.txt
152 echo "JDataFilter = ${DATAFILTER} ${HOST}:${PORT};" >> $WORKDIR/ev_configure_datafilter.txt
153
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
156done
157
158cat>>$WORKDIR/driver.txt<<EOF
159
160print
161
162enter
163
164event ev_init { RC_CMD }
165
166event ev_configure {
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;
170}
171
172event ev_start { RC_CMD $RUN $ID }
173
174sleep $RUNTIME_S
175
176event ev_pause { RC_CMD }
177event ev_stop { RC_CMD }
178event ev_reset { RC_CMD }
179event ev_off { RC_CMD }
180
181EOF
182
183
184# Go!
185
186JDAQDriver \
187 -H $MESSAGE_SERVER \
188 -M $MESSAGE_LOGGER \
189 -t $TIMEOUT_S \
190 -f $WORKDIR/driver.txt \
191 -d $DEBUG \
192 -c
193
194
195# Tests
196
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`
199
200R=($(( ($NUMBER_OF_EVENTS * 1.0) / ($NUMBER_OF_SUMMARYSLICES * 0.1)))
201 $(( sqrt($NUMBER_OF_EVENTS * 1.0) / ($NUMBER_OF_SUMMARYSLICES * 0.1))))
202
203printf "Rate %7.3f +/- %7.3f ?= %7.3f\n" $R[1] $R[2] $TRIGGERRATE_HZ
204
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"
207fi
208
209
210# Clean
211
212JStopDAQ.sh $MESSAGE_SERVER $MESSAGE_LOGGER
213
214ssh $WRITER_HOST "killall JDataWriter" >& /dev/null
215ssh $FILTER_HOST "killall JDataFilter" >& /dev/null
216killall JDQSimulator >& /dev/null
217
218rm -rf $WORKDIR