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
44 set_variable: JOBS ACOUSTICS_JOBS 0 # number of parallel threads
47 usage "Toolkit for pre-calibrations of detectors."\
48 "\nThis script should be sourced by the steering script for a specific detector."\
49 "\nConsult the script '$0' for more details."
53 echo "This script should be sourced by the steering script for a specific detector."
57 if [[ `ps -
o stat= -p $$` == *
"+" ]];
then
58 echo "This script cannot interactively be used."
62 source JAcousticsToolkit.sh
65 typeset -
a CHI2 #
chi2 values; index [1] corresponds to best value
67 let
"NUMBER_OF_ITERATIONS = 100" # maximal number of iterations
68 let
"EPSILON = 5.0E-4" # maximal
distance to minimum of
chi2
69 let
"RADIUS_M = 1.0" # maximal horizontal
distance between
T-bar and emitter/hydrophone
70 let
"PRECISION = 10" # number of decimals of
chi2 evaluation
73 # -----------------------------------------------------------------------------------------------------
76 # Install input files in working directory and create temporary directory TMPDIR.
78 # -----------------------------------------------------------------------------------------------------
81 eval `JPrintDetector -
a $DETECTOR -O IDENTIFIER`
85 JAcoustics.sh $DETECTOR_ID
87 get_tripods tripod.txt TRIPODS
89 TRANSMITTERS=(`get_strings_with_transmitter
transmitter.txt`)
91 if [[
"${HYDROPHONE+YES}" ==
"YES" ]];
then
92 HYDROPHONES=(`get_strings_with_hydrophone hydrophone.txt`)
99 if [[ ! -
f pmt.datx ]];
then
106 # -----------------------------------------------------------------------------------------------------
107 # Backup files in given directory.
110 # -----------------------------------------------------------------------------------------------------
113 debug "Backup intermediate results to $1"
123 # -----------------------------------------------------------------------------------------------------
124 # Remove temporary directory and restore input files in working directory.
126 # -----------------------------------------------------------------------------------------------------
131 rm -rf $TMPDIR >& /dev/
null
133 rm -
f {acoustics_fit_parameters,acoustics_trigger_parameters}.txt
135 JAcoustics.sh $DETECTOR_ID
139 # -----------------------------------------------------------------------------------------------------
142 # \param 1-N identifiers
143 # -----------------------------------------------------------------------------------------------------
144 function fixStrings()
150 if (( ${#BUFFER} > 0 ));
then
152 TRANSMITTERS=(${TRANSMITTERS:|BUFFER})
153 HYDROPHONES=(${HYDROPHONES:|BUFFER})
158 # -----------------------------------------------------------------------------------------------------
161 # \param 1-
N identifiers
162 # -----------------------------------------------------------------------------------------------------
163 function fixTripods()
169 if (( ${#BUFFER} > 0 ));
then
170 for ID in $BUFFER[*];
do
171 unset
"TRIPODS[${ID}]"
177 # -----------------------------------------------------------------------------------------------------
178 # Evaluate current chi2.
180 # \param 1 variable containing chi2 value on return
182 # -----------------------------------------------------------------------------------------------------
185 if (( $JOBS == 0 ));
then
187 rm -
f $TMPDIR/katoomba.root >& /dev/
null
191 -
f "$INPUT_FILES[*]" \
192 -
o $TMPDIR/katoomba.root \
195 -
V sound_velocity.txt \
197 -@ $TMPDIR/acoustics_fit_parameters.txt \
200 -
d 0 >& $TMPDIR/job.log
202 if (( $? != 0 ));
then
203 fatal
"non-zero exit code, see $TMPDIR/job.log"
206 set_variable RESULT $($JPP_DIR/examples/JAcoustics/JPrintChi2 -
f $TMPDIR/katoomba.root -p $PRECISION)
210 if (( $2 == 0 ));
then
212 # step wise improvement of the chi2
216 -
f "$INPUT_FILES[*]" \
219 -
V sound_velocity.txt \
221 -@ $TMPDIR/acoustics_fit_parameters.txt \
225 -
d 0 3>&1 1>&4 } |
read RESULT } 4>&1 >& $TMPDIR/job.log
229 # evaluation of the chi2 before the determination of the gradient of the chi2
231 rm -
f $TMPDIR/fremantle.jpp >& /dev/
null
235 -
f "$INPUT_FILES[*]" \
236 -
o $TMPDIR/fremantle.jpp \
239 -
V sound_velocity.txt \
241 -@ $TMPDIR/acoustics_fit_parameters.txt \
245 -
d 0 3>&1 1>&4 } |
read RESULT } 4>&1 >& $TMPDIR/job.log
249 # evaluation of the derivative of the chi2 to each fit parameter
253 -
f $TMPDIR/fremantle.jpp \
256 -
V sound_velocity.txt \
258 -@ $TMPDIR/acoustics_fit_parameters.txt \
261 -
d 0 3>&1 1>&4 } |
read RESULT } 4>&1 >& $TMPDIR/job.log
265 fatal
"invalid option <$2>"
268 if (( $? != 0 ));
then
269 fatal
"non-zero exit code, see $TMPDIR/job.log"
275 if (( $? != 0 ));
then
276 fatal
"non-zero exit code let, value <${RESULT}>."
283 # -----------------------------------------------------------------------------------------------------
285 # This stage can be used to determine the (x,y,z) positions of tripods using strings that are fixed.
287 # \param 1 fit option
288 # \param 2 M-estimator
289 # \param 3 resolution [s]
290 # \param 4 standard deviations
291 # \param 5 step size [m]
292 # \param 6 maximum number of extra steps
293 # -----------------------------------------------------------------------------------------------------
296 cat>$TMPDIR/acoustics_fit_parameters.txt<<EOF
297 `
egrep Tmax_s acoustics_fit_parameters.txt`
305 if (( ${#STRINGS} > 0 ));
then
306 JEditDetector -
a $DETECTOR -
o $TMPDIR/detector_0.datx -
k "$STRINGS[*]" -q -
d 0 >& /dev/
null
312 for ID in ${(
k)TRIPODS};
do
313 PARAMETERS[
'JMoveTripod -f tripod.txt -T "$ID addx %" -d 0 >& /dev/null']=$5
314 PARAMETERS[
'JMoveTripod -f tripod.txt -T "$ID addy %" -d 0 >& /dev/null']=$5
315 PARAMETERS[
'JMoveTripod -f tripod.txt -T "$ID addz %" -d 0 >& /dev/null']=$5
320 printf
"detector %6d %8.4f\n" $N $Y
322 if (( ${#STRINGS} > 0 ));
then
328 # -----------------------------------------------------------------------------------------------------
330 # This stage can be used to determine the positions of the strings and tripods.
332 # \param 1 fit option
333 # \param 2 M-estimator
334 # \param 3 resolution [s]
335 # \param 4 standard deviations
336 # \param 5 step size strings [m]
337 # \param 6 step size tripods [m]
338 # \param 7 maximum number of extra steps
339 # -----------------------------------------------------------------------------------------------------
342 cat>$TMPDIR/acoustics_fit_parameters.txt<<EOF
343 `
egrep Tmax_s acoustics_fit_parameters.txt`
354 PARAMETERS[
'JMoveDetector -a $DETECTOR -S "$STRING addx %" -d 0 >& /dev/null']=$5
355 PARAMETERS[
'JMoveDetector -a $DETECTOR -S "$STRING addy %" -d 0 >& /dev/null']=$5
356 PARAMETERS[
'JMoveDetector -a $DETECTOR -s "$STRING addz %" -d 0 >& /dev/null']=$5
359 for ID in ${(
k)TRIPODS};
do
360 PARAMETERS[
'JMoveTripod -f tripod.txt -T "$ID addx %" -d 0 >& /dev/null']=$6
361 PARAMETERS[
'JMoveTripod -f tripod.txt -T "$ID addy %" -d 0 >& /dev/null']=$6
362 PARAMETERS[
'JMoveTripod -f tripod.txt -T "$ID addz %" -d 0 >& /dev/null']=$6
365 for STRING in ${HYDROPHONES:|TRANSMITTERS};
do
366 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']=$(($5 / $RADIUS_M))
373 PARAMETERS[
'JMoveDetector -a $DETECTOR -M "$MODULE addz %" -d 0 >& /dev/null']=$5
374 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']=$(($5 / $RADIUS_M))
379 printf
"detector %6d %8.4f\n" $N $Y
383 # -----------------------------------------------------------------------------------------------------
385 # This stage can be used to determine the stretching and z-positions of individual strings.
387 # \param 1 fit option
388 # \param 2 M-estimator
389 # \param 3 resolution [s]
390 # \param 4 standard deviations
391 # \param 5 step size stretching [unit]
392 # \param 6 step size z-position [m]
393 # \param 7 maximum number of extra steps
394 # -----------------------------------------------------------------------------------------------------
397 cat>$TMPDIR/acoustics_fit_parameters.txt<<EOF
398 `
egrep Tmax_s acoustics_fit_parameters.txt`
408 JEditDetector -
a $DETECTOR -
o $TMPDIR/detector_1.datx -
r "$STRING" -q -
d 0 >& /dev/
null
413 PARAMETERS[
'JMoveDetector -a $DETECTOR -s "$STRING mul %" -d 0 >& /dev/null; JMoveDetector -a $DETECTOR -s "$STRING subz \$\(\(% * $CAN_ZMAX_M\)\)" -d 0 >& /dev/null']=$5
414 PARAMETERS[
'JMoveDetector -a $DETECTOR -s "$STRING addz %" -d 0 >& /dev/null']=$6
418 printf
"string %04d %6d %8.4f\n" $STRING $N $Y
425 # -----------------------------------------------------------------------------------------------------
427 # This stage can be used to determine the z-positions of the modules.
429 # \param 1 fit option
430 # \param 2 M-estimator
431 # \param 3 resolution [s]
432 # \param 4 standard deviations
433 # \param 5 step size [m]
434 # \param 6 maximum number of extra steps
435 # -----------------------------------------------------------------------------------------------------
438 cat>$TMPDIR/acoustics_fit_parameters.txt<<EOF
439 `
egrep Tmax_s acoustics_fit_parameters.txt`
451 for (( FLOOR = 1; $FLOOR <= 18; FLOOR += 1 ));
do
455 PARAMETERS[
'JMoveDetector -a $DETECTOR -M "$MODULE addz %" -d 0 >& /dev/null']=$5
461 printf
"detector %6d %8.4f\n" $N $Y
465 # -----------------------------------------------------------------------------------------------------
467 # This stage can be used to determine the z-positions of the anchors
469 # \param 1 fit option
470 # \param 2 M-estimator
471 # \param 3 resolution [s]
472 # \param 4 standard deviations
473 # \param 5 step size [m]
474 # \param 6 maximum number of extra steps
475 # -----------------------------------------------------------------------------------------------------
478 cat>$TMPDIR/acoustics_fit_parameters.txt<<EOF
479 `
egrep Tmax_s acoustics_fit_parameters.txt`
493 PARAMETERS[
'JMoveDetector -a $DETECTOR -M "$MODULE addz %" -d 0 >& /dev/null']=$5
498 printf
"detector %6d %8.4f\n" $N $Y
502 # -----------------------------------------------------------------------------------------------------
504 # This stage can be used to determine the rotations of the strings and z-positions of the anchors
505 # including the response of hydrophones.
506 # It includes a determination of the positions of the strings and tripods.
508 # \param 1 fit option
509 # \param 2 M-estimator
510 # \param 3 resolution [s]
511 # \param 4 standard deviations
512 # \param 5 step size strings [m]
513 # \param 6 step size tripods [m]
514 # \param 7 maximum number of extra steps
515 # -----------------------------------------------------------------------------------------------------
518 cat>$TMPDIR/acoustics_fit_parameters.txt<<EOF
519 `
egrep Tmax_s acoustics_fit_parameters.txt`
535 PARAMETERS[
'JMoveDetector -a $DETECTOR -S "$STRING addx %" -d 0 >& /dev/null']=$5
536 PARAMETERS[
'JMoveDetector -a $DETECTOR -S "$STRING addy %" -d 0 >& /dev/null']=$5
537 PARAMETERS[
'JMoveDetector -a $DETECTOR -s "$STRING addz %" -d 0 >& /dev/null']=$5
538 PARAMETERS[
'JMoveDetector -a $DETECTOR -M "$MODULE addz %" -d 0 >& /dev/null']=$5
540 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']=$(($5 / $RADIUS_M))
543 for ID in ${(
k)TRIPODS};
do
544 PARAMETERS[
'JMoveTripod -f tripod.txt -T "$ID addx %" -d 0 >& /dev/null']=$6
545 PARAMETERS[
'JMoveTripod -f tripod.txt -T "$ID addy %" -d 0 >& /dev/null']=$6
546 PARAMETERS[
'JMoveTripod -f tripod.txt -T "$ID addz %" -d 0 >& /dev/null']=$6
551 printf
"detector %6d %8.4f\n" $N $Y
then fatal No hydrophone data file $HYDROPHONE_TXT fi sort gr k
std::istream & read(std::istream &in, JTestSummary &summary, const char delimiter= ' ')
Read test summary.
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
o $QUALITY_ROOT d $DEBUG!CHECK_EXIT_CODE JPlot1D f
then usage $script(input file)+< QA/QC file >" "\nAuxiliary script to produce the following QA/QC data then fatal Wrong number of arguments fi set_array INPUT_FILES $argv[1,-2] set_variable QAQC_FILE $argv[-1] mkdir p $WORKDIR set_variable ACOUSTICS_DEBUG
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)
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 Missing detector file $DETECTOR fi eval JPrintDetector a $DETECTOR O IDENTIFIER for KEY in tripod hydrophone transmitter
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
skip elif((BINFRAC< 1.0))
then usage $script< directory A >< directoryB > nIn each directory
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 usage $script< input file >[option[primary[working directory]]] nWhere option can be N
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
then fatal Wrong number of arguments fi JConvertDetectorFormat a o
do set_variable DETECTOR_TXT $WORKDIR detector
static JNullStream null
Null I/O stream.
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
const JModule & getModule(const JDetector &detector, const JModuleLocation &location)
find module with a given string and floor number
#define DEBUG(A)
Message macros.