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.