4 # -----------------------------------------------------------------------------------------------------
6 # Toolkit for the determination of the fixed parameters in the system, a.k.a. "pre-calibration".
7 # The list of parameters includes (x,y,z) positions of strings and tripods, stretching of strings,
8 # z-positions of the optical modules, orientations of the strings and possibly z-positions of anchors.
10 # The value of a given parameter is optimised by minimising the average chi2/NDF
11 # of a series of global fits applied to a predefined set of acoustic events.
12 # For each parameter, there exists a designated function.
14 # There are also steering functions to consistently determine the optimal values for a set of parameters.
15 # In these, the current accuracy of the parameter values is taken into account.
16 # These are therefore referred to as "stages".
17 # The pre-calibration thus consists of a sequence of stages.
18 # For each detector, a complete pre-calibration procedure is implemented in a designated script.
20 # Mandatory input variables:
22 # DETECTOR # detector file
23 # INPUT_FILES # list of input files (output of JAcousticsEventBuilder[.sh])
25 # Optional input variables:
27 # HYDROPHONE # if defined, use hydrophones in global fit; else do not use hydrophones
31 # STRINGS corresponds to list of strings to be fitted; this can be changed with function fixStrings.
32 # TRIPODS corresponds to list of tripods to be fitted; this can be changed with function fixTripods.
34 # TRANSMITTERS corresponds to list of strings which have an emitter on the anchor (maybe empty).
35 # For these strings, the orientations and the z-positions of the anchors will separately be fitted.
36 # This list will also be changed with function fixStrings.
37 # -----------------------------------------------------------------------------------------------------
39 source $JPP_DIR/setenv.sh $JPP_DIR >& /dev/
null
40 source $JPP_BIN/gradient.sh
42 echo "Toolkit for pre-calibrations of detectors."
43 echo "Consult the script '$0' for more details."
45 if [[ ! $ZSH_EVAL_CONTEXT =~ :
file$ ]];
then
46 echo "This script should be sourced by the steering script for a specific detector."
50 if [[ `ps -
o stat= -p $$` == *
"+" ]];
then
51 echo "This script cannot interactively be used."
55 source JAcousticsToolkit.sh
59 set_variable: JOBS ACOUSTICS_JOBS 0 # number of parallel threads
60 set_variable: SLEEP_US ACOUSTICS_SLEEP_US 100 # sleep time [us] of
main thread when data
queue exceeds limit
63 typeset -
a CHI2 #
chi2 values; index [1] corresponds to best value
65 let
"NUMBER_OF_ITERATIONS = 100" # maximal number of iterations
66 let
"EPSILON = 5.0E-4" # maximal
distance to minimum of
chi2
67 let
"RADIUS_M = 1.0" # maximal horizontal
distance between
T-bar and emitter/hydrophone
68 let
"PRECISION = 10" # number of decimals of
chi2 evaluation
71 # -----------------------------------------------------------------------------------------------------
74 # Install input files in working directory and create temporary directory TMPDIR.
76 # -----------------------------------------------------------------------------------------------------
79 eval `JPrintDetector -
a $DETECTOR -O IDENTIFIER`
83 JAcoustics.sh $DETECTOR_ID
85 get_tripods tripod.txt TRIPODS
87 TRANSMITTERS=(`get_strings_with_transmitter transmitter.txt`)
89 if [[
"${HYDROPHONE+YES}" ==
"YES" ]];
then
90 HYDROPHONES=(`get_strings_with_hydrophone hydrophone.txt`)
97 JConvertDetectorFormat -
a $DETECTOR -
o $TMPDIR/pmt.datx
102 # -----------------------------------------------------------------------------------------------------
103 # Backup files in given directory.
106 # -----------------------------------------------------------------------------------------------------
111 cp -p {tripod.txt,transmitter.txt,hydrophone.txt} $1
117 # -----------------------------------------------------------------------------------------------------
118 # Remove temporary directory and restore input files in working directory.
120 # -----------------------------------------------------------------------------------------------------
125 rm -rf $TMPDIR >& /dev/
null
127 rm -
f {acoustics_fit_parameters,acoustics_trigger_parameters}.txt
129 JAcoustics.sh $DETECTOR_ID
133 # -----------------------------------------------------------------------------------------------------
136 # \param 1-N identifiers
137 # -----------------------------------------------------------------------------------------------------
138 function fixStrings()
144 if (( ${#BUFFER} > 0 ));
then
146 TRANSMITTERS=(${TRANSMITTERS:|BUFFER})
147 HYDROPHONES=(${HYDROPHONES:|BUFFER})
152 # -----------------------------------------------------------------------------------------------------
155 # \param 1-
N identifiers
156 # -----------------------------------------------------------------------------------------------------
157 function fixTripods()
163 if (( ${#BUFFER} > 0 ));
then
164 for ID in $BUFFER[*];
do
165 unset
"TRIPODS[${ID}]"
171 # -----------------------------------------------------------------------------------------------------
172 # Evaluate current chi2.
174 # \param 1 variable containing chi2 value on return
175 # -----------------------------------------------------------------------------------------------------
178 rm -
f $TMPDIR/katoomba.root >& /dev/
null
180 if (( $JOBS == 0 ));
then
184 -
f "$INPUT_FILES[*]" \
185 -
o $TMPDIR/katoomba.root \
188 -
V sound_velocity.txt \
190 -@ $TMPDIR/acoustics_fit_parameters.txt \
194 -
d 0 --! >& $TMPDIR/job.log
200 -
f "$INPUT_FILES[*]" \
201 -
o $TMPDIR/katoomba.root \
204 -
V sound_velocity.txt \
206 -@ $TMPDIR/acoustics_fit_parameters.txt \
212 -
d 0 --! >& $TMPDIR/job.log
215 if (( $? != 0 ));
then
216 fatal
"non-zero exit code, see $TMPDIR/job.log"
219 ls -l $TMPDIR/katoomba.root >> $TMPDIR/job.log
221 let
"UV = $($JPP_DIR/examples/JAcoustics/JPrintChi2 -f $TMPDIR/katoomba.root -p $PRECISION)"
223 if (( $? != 0 ));
then
224 fatal
"non-zero exit code let, value <${UV}>."
231 # -----------------------------------------------------------------------------------------------------
233 # This stage can be used to determine the (x,y,z) positions of tripods using strings that are fixed.
235 # \param 1 fit option
236 # \param 2 M-estimator
237 # \param 3 resolution [s]
238 # \param 4 step size [m]
239 # \param 5 maximum number of extra steps
240 # -----------------------------------------------------------------------------------------------------
243 cat>$TMPDIR/acoustics_fit_parameters.txt<<EOF
244 `egrep Tmax_s acoustics_fit_parameters.txt`
252 if (( ${#STRINGS} > 0 ));
then
253 JEditDetector -
a $DETECTOR -
o $TMPDIR/detector_0.datx -
k "$STRINGS[*]" -q -
d 0 >& /dev/
null
259 for ID in ${(
k)TRIPODS};
do
260 PARAMETERS[
'JEditTripod -f tripod.txt -T "$ID addx %" -o tripod.txt -q -d 0 >& /dev/null']=$4
261 PARAMETERS[
'JEditTripod -f tripod.txt -T "$ID addy %" -o tripod.txt -q -d 0 >& /dev/null']=$4
262 PARAMETERS[
'JEditTripod -f tripod.txt -T "$ID addz %" -o tripod.txt -q -d 0 >& /dev/null']=$4
267 printf
"detector %6d %8.4f\n" $N $Y
269 if (( ${#STRINGS} > 0 ));
then
275 # -----------------------------------------------------------------------------------------------------
277 # This stage can be used to determine the positions of the strings and tripods.
279 # \param 1 fit option
280 # \param 2 M-estimator
281 # \param 3 resolution [s]
282 # \param 4 step size strings [m]
283 # \param 5 step size tripods [m]
284 # \param 6 maximum number of extra steps
285 # -----------------------------------------------------------------------------------------------------
288 cat>$TMPDIR/acoustics_fit_parameters.txt<<EOF
289 `egrep Tmax_s acoustics_fit_parameters.txt`
300 PARAMETERS[
'JEditDetector -a $DETECTOR -S "$STRING addx %" -o $DETECTOR -q -d 0 >& /dev/null']=$4
301 PARAMETERS[
'JEditDetector -a $DETECTOR -S "$STRING addy %" -o $DETECTOR -q -d 0 >& /dev/null']=$4
302 PARAMETERS[
'JEditDetector -a $DETECTOR -s "$STRING addz %" -o $DETECTOR -q -d 0 >& /dev/null']=$4
305 for ID in ${(
k)TRIPODS};
do
306 PARAMETERS[
'JEditTripod -f tripod.txt -T "$ID addx %" -o tripod.txt -q -d 0 >& /dev/null']=$5
307 PARAMETERS[
'JEditTripod -f tripod.txt -T "$ID addy %" -o tripod.txt -q -d 0 >& /dev/null']=$5
308 PARAMETERS[
'JEditTripod -f tripod.txt -T "$ID addz %" -o tripod.txt -q -d 0 >& /dev/null']=$5
311 for STRING in ${HYDROPHONES:|TRANSMITTERS};
do
312 PARAMETERS[
'JEditHydrophone -f hydrophone.txt -S "$STRING rot %" -o hydrophone.txt -q -d 0 >& /dev/null; JEditTransmitter -f transmitter.txt -S "$STRING rot %" -o transmitter.txt -q -d 0 >& /dev/null']=$(($4 / $RADIUS_M))
319 PARAMETERS[
'JEditDetector -a $DETECTOR -M "$MODULE addz %" -o $DETECTOR -q -d 0 >& /dev/null']=$4
320 PARAMETERS[
'JEditHydrophone -f hydrophone.txt -S "$STRING rot %" -o hydrophone.txt -q -d 0 >& /dev/null; JEditTransmitter -f transmitter.txt -S "$STRING rot %" -o transmitter.txt -q -d 0 >& /dev/null']=$(($4 / $RADIUS_M))
325 printf
"detector %6d %8.4f\n" $N $Y
329 # -----------------------------------------------------------------------------------------------------
331 # This stage can be used to determine the stretching and z-positions of individual strings.
333 # \param 1 fit option
334 # \param 2 M-estimator
335 # \param 3 resolution [s]
336 # \param 4 step size stretching [unit]
337 # \param 4 step size z-position [m]
338 # \param 5 maximum number of extra steps
339 # -----------------------------------------------------------------------------------------------------
342 cat>$TMPDIR/acoustics_fit_parameters.txt<<EOF
343 `egrep Tmax_s acoustics_fit_parameters.txt`
353 JEditDetector -
a $DETECTOR -
o $TMPDIR/detector_1.datx -
r "$STRING" -q -
d 0 >& /dev/
null
358 PARAMETERS[
'JEditDetector -a $DETECTOR -s "$STRING mul %" -o $DETECTOR -q -d 0 >& /dev/null; JEditDetector -a $DETECTOR -s "$STRING subz \$\(\(% * $CAN_ZMAX_M\)\)" -o $DETECTOR -q -d 0 >& /dev/null']=$4
359 PARAMETERS[
'JEditDetector -a $DETECTOR -s "$STRING addz %" -o $DETECTOR -q -d 0 >& /dev/null']=$5
363 printf
"string %04d %6d %8.4f\n" $STRING $N $Y
370 # -----------------------------------------------------------------------------------------------------
372 # This stage can be used to determine the z-positions of the modules.
374 # \param 1 fit option
375 # \param 2 M-estimator
376 # \param 3 resolution [s]
377 # \param 4 step size [m]
378 # \param 5 maximum number of extra steps
379 # -----------------------------------------------------------------------------------------------------
382 cat>$TMPDIR/acoustics_fit_parameters.txt<<EOF
383 `egrep Tmax_s acoustics_fit_parameters.txt`
395 for (( FLOOR = 1; $FLOOR <= 18; FLOOR += 1 ));
do
399 PARAMETERS[
'JEditDetector -a $DETECTOR -M "$MODULE addz %" -o $DETECTOR -q -d 0 >& /dev/null']=$4
405 printf
"detector %6d %8.4f\n" $N $Y
409 # -----------------------------------------------------------------------------------------------------
411 # This stage can be used to determine the z-positions of the anchors
413 # \param 1 fit option
414 # \param 2 M-estimator
415 # \param 3 resolution [s]
416 # \param 4 step size [m]
417 # \param 5 maximum number of extra steps
418 # -----------------------------------------------------------------------------------------------------
421 cat>$TMPDIR/acoustics_fit_parameters.txt<<EOF
422 `egrep Tmax_s acoustics_fit_parameters.txt`
436 PARAMETERS[
'JEditDetector -a $DETECTOR -M "$MODULE addz %" -o $DETECTOR -q -d 0 >& /dev/null']=$4
441 printf
"detector %6d %8.4f\n" $N $Y
445 # -----------------------------------------------------------------------------------------------------
447 # This stage can be used to determine the rotations of the strings and z-positions of the anchors
448 # including the response of hydrophones.
449 # It includes a determination of the positions of the strings and tripods.
451 # \param 1 fit option
452 # \param 2 M-estimator
453 # \param 3 resolution [s]
454 # \param 4 step size strings [m]
455 # \param 5 step size tripods [m]
456 # \param 6 maximum number of extra steps
457 # -----------------------------------------------------------------------------------------------------
460 cat>$TMPDIR/acoustics_fit_parameters.txt<<EOF
461 `egrep Tmax_s acoustics_fit_parameters.txt`
477 PARAMETERS[
'JEditDetector -a $DETECTOR -S "$STRING addx %" -o $DETECTOR -q -d 0 >& /dev/null']=$4
478 PARAMETERS[
'JEditDetector -a $DETECTOR -S "$STRING addy %" -o $DETECTOR -q -d 0 >& /dev/null']=$4
479 PARAMETERS[
'JEditDetector -a $DETECTOR -s "$STRING addz %" -o $DETECTOR -q -d 0 >& /dev/null']=$4
480 PARAMETERS[
'JEditDetector -a $DETECTOR -M "$MODULE addz %" -o $DETECTOR -q -d 0 >& /dev/null']=$4
482 PARAMETERS[
'JEditHydrophone -f hydrophone.txt -S "$STRING rot %" -o hydrophone.txt -q -d 0 >& /dev/null; JEditTransmitter -f transmitter.txt -S "$STRING rot %" -o transmitter.txt -q -d 0 >& /dev/null']=$(($4 / $RADIUS_M))
485 for ID in ${(
k)TRIPODS};
do
486 PARAMETERS[
'JEditTripod -f tripod.txt -T "$ID addx %" -o tripod.txt -q -d 0 >& /dev/null']=$5
487 PARAMETERS[
'JEditTripod -f tripod.txt -T "$ID addy %" -o tripod.txt -q -d 0 >& /dev/null']=$5
488 PARAMETERS[
'JEditTripod -f tripod.txt -T "$ID addz %" -o tripod.txt -q -d 0 >& /dev/null']=$5
493 printf
"detector %6d %8.4f\n" $N $Y
then fatal No hydrophone data file $HYDROPHONE_TXT fi sort gr k
int main(int argc, char *argv[])
then usage $script[< detector identifier >< run range >]< QA/QCfile > nExample script to produce data quality plots nWhen a detector identifier and run range are data are downloaded from the database nand subsequently stored in the given QA QC file
clean eval JPrintDetector a $DETECTOR O IDENTIFIER eval JPrintDetector a $DETECTOR O SUMMARY set_variable STRING
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
then JLigier sh continue fi cat
then echo Submitting reweighting and histogram comparison jobs to nikhef stbc batch queue
o $QUALITY_ROOT d $DEBUG!CHECK_EXIT_CODE JPlot1D f
then JShowerPostfit f $INPUT_FILE o $OUTPUT_FILE N
usr share Modules init zsh export TMPDIR
static const double H
Planck constant [eV s].
then fatal Wrong number of arguments fi set_variable STRING $argv[1] set_variable DETECTORXY_TXT $WORKDIR $DETECTORXY_TXT tail read X Y CHI2 RMS printf optimum n $X $Y $CHI2 $RMS awk v Y
V(JDAQEvent-JTriggerReprocessor)*1.0/(JDAQEvent+1.0e-10)
then fatal Wrong number of arguments fi JConvertDetectorFormat a o
do JCanberra a $DETECTOR f $INPUT_FILE o $WORKDIR canberra[${EMITTER}\] root T $WORKDIR tripod txt V $WORKDIR sound_velocity txt M $WORKDIR mechanics txt H $WORKDIR hydrophone txt E $EMITTER $DISABLE d $DEBUG!done kill_child_processes_at_exit attach getModule a $DETECTOR typeset Z STRING typeset Z FLOOR for STRING in $STRINGS[*]
then fatal Invalid string $STRING
then echo Variable JPP_DIR undefined exit fi source $JPP_DIR setenv sh $JPP_DIR &dev null set_variable
case $OPTION in clean clean
do set_variable OUTPUT_DIRECTORY $WORKDIR T
set_array INPUT_FILES argv[2,$((START_INDEX_STRING-1))] set_array STRINGS
then $DIR JKatoomba a $DETECTOR o $WORKDIR katoomba root T $TRIPOD n sigma_s
then JMuonMCEvt f $INPUT_FILE o $INTERMEDIATE_FILE d
then set_variable MODULE getModule a $DETECTOR L $STRING $FLOOR JEditDetector a $DETECTOR M $MODULE add $X o $DETECTOR else echo No update of detector $DETECTOR
static const JPBS_t HYDROPHONE(4, 5)
PBS of hydrophone
then if[[!-f $DETECTOR]] then JDetector sh $DETECTOR fi cat $WORKDIR trigger_parameters txt<< EOFtrigger3DMuon.enabled=1;trigger3DMuon.numberOfHits=5;trigger3DMuon.gridAngle_deg=1;ctMin=0.0;TMaxLocal_ns=15.0;EOF set_variable TRIGGEREFFICIENCY_TRIGGERED_EVENTS_ONLY INPUT_FILES=() for((i=1;$i<=$NUMBER_OF_RUNS;++i));do JSirene.sh $DETECTOR $JPP_DATA/genhen.km3net_wpd_V2_0.evt.gz $WORKDIR/sirene_ ${i}.root JTriggerEfficiency.sh $DETECTOR $DETECTOR $WORKDIR/sirene_ ${i}.root $WORKDIR/trigger_efficiency_ ${i}.root $WORKDIR/trigger_parameters.txt $JPP_DATA/PMT_parameters.txt INPUT_FILES+=($WORKDIR/trigger_efficiency_ ${i}.root) done for ANGLE_DEG in $ANGLES_DEG[*];do set_variable SIGMA_NS 3.0 set_variable OUTLIERS 3 set_variable OUTPUT_FILE $WORKDIR/matrix\[${ANGLE_DEG}\deg\].root $JPP_DIR/examples/JReconstruction-f"$INPUT_FILES[*]"-o $OUTPUT_FILE-S ${SIGMA_NS}-A ${ANGLE_DEG}-O ${OUTLIERS}-d ${DEBUG}--!fiif[[$OPTION=="plot"]];then if((0));then for H1 in h0 h1;do JPlot1D-f"$WORKDIR/matrix["${^ANGLES_DEG}" deg].root:${H1}"-y"1 2e3"-Y-L TR-T""-\^"number of events [a.u.]"-> o chi2
esac typeset A BUFFER $JPP_DIR examples JAcoustics JCreep f $INPUT_FILE BUFFER
then echo Creating output directory
do set_variable DETECTOR_TXT $WORKDIR detector
double getChi2(const double P)
Get chi2 corresponding to given probability.
then fatal Wrong number of arguments fi set_variable DETECTOR $argv[1] set_variable INPUT_FILE $argv[2] eval JPrintDetector a $DETECTOR O IDENTIFIER eval JPrintDetector a $DETECTOR O SUMMARY JAcoustics sh $DETECTOR_ID source JAcousticsToolkit sh CHECK_EXIT_CODE typeset A EMITTERS get_tripods $WORKDIR tripod txt EMITTERS get_transmitters $WORKDIR transmitter txt EMITTERS for EMITTER in
source $JPP_DIR setenv csh $JPP_DIR &dev null eval JShellParser o a A
esac $JPP_BIN JLogger sh $LOGGER until pgrep JGetMessage</dev/null > dev null
const JModule & getModule(const JDetector &detector, const JModuleLocation &location)
find module with a given string and floor number
#define DEBUG(A)
Message macros.