-
Notifications
You must be signed in to change notification settings - Fork 18
Expand file tree
/
Copy pathcreate_luts.sh
More file actions
executable file
·233 lines (211 loc) · 6.27 KB
/
Copy pathcreate_luts.sh
File metadata and controls
executable file
·233 lines (211 loc) · 6.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
#! /usr/bin/env bash
# Configuration variables
WHAT=default
FIELD=0.5
RMIN=100.
WRITER_PATH=${DELPHESO2_ROOT}/lut/
if [[ -z ${DELPHESO2_ROOT} ]]; then
WRITER_PATH="../../src/"
fi
OUT_PATH=.
OUT_TAG=
PARALLEL_JOBS=1
PARTICLES="0 1 2 3 4"
AUTOTAG="Yes"
DIPOLE="No"
FLATDIPOLE="No"
VERBOSE="No"
# List of arguments expected in the input
optstring=":ht:B:R:p:o:T:P:j:vFDd"
# Get the options
while getopts ${optstring} option; do
case ${option} in
h) # display Help
echo "Script to generate LUTs from LUT writer, arguments:"
echo "Syntax: ./create_luts.sh [${optstring}]"
echo "options:"
echo "-t tag of the LUT writer [default]"
echo "-B Magnetic field in T [0.5]"
echo "-R Minimum radius of the track in cm [100]"
echo "-p Path where the LUT writers are located [\$DELPHESO2_ROOT/lut/]"
echo "-o Output path where to write the LUTs [.]"
echo "-T Tag to append to LUTs [\"\"]"
echo "-P Particles to consider [\"0 1 2 3 4\"]"
echo "-j Number of parallel processes to use [1]"
echo "-F Don't use the automatic tagging and use only the one provided instead for the naming of the output files"
echo "-D Use dipole"
echo "-d Use dipole flat dipole parametrization"
echo "-v Verbose mode"
echo "-h Show this help"
exit 0
;;
t)
WHAT=$OPTARG
echo " > Setting LUT writer to ${WHAT}"
;;
B)
FIELD=$OPTARG
echo " > Setting B field to ${FIELD} T"
;;
R)
RMIN=$OPTARG
echo " > Setting minimum radius to ${RMIN} cm"
;;
p)
WRITER_PATH=$OPTARG
echo " > Setting LUT writer path to ${WRITER_PATH}"
;;
o)
OUT_PATH=$OPTARG
echo " > Setting LUT output path to ${OUT_PATH}"
;;
T)
OUT_TAG=$OPTARG
echo " > Setting LUT output tag to ${OUT_TAG}"
;;
P)
PARTICLES=$OPTARG
echo " > Setting LUT particles to ${PARTICLES}"
;;
j)
PARALLEL_JOBS=$OPTARG
echo " > Setting parallel jobs to ${PARALLEL_JOBS}"
;;
F)
AUTOTAG="No"
echo " > Disabling autotagging mode"
;;
D)
DIPOLE="Yes"
echo " > Enabling dipole"
;;
d)
FLATDIPOLE="Yes"
echo " > Enabling flat dipole"
;;
v)
VERBOSE="Yes"
echo " > Enabling verbose mode"
;;
\?) # Invalid option
echo "$0: Error: Invalid option, use [${optstring}]"
exit
;;
:) # Empty argument
echo "$0: Error: ust supply an argument to -$OPTARG." >&2
exit 1
;;
esac
done
if [[ ${AUTOTAG} == "Yes" ]]; then
# Defining the output tag based on the input
FIELDT=$(echo "${FIELD}*10" | bc)
FIELDT=${FIELDT%.0}
if [[ ${DIPOLE} == "Yes" ]]; then
OUT_TAG="${OUT_TAG}_Dipole"
fi
if [[ ${FLATDIPOLE} == "Yes" ]]; then
OUT_TAG="${OUT_TAG}_FlatDipole"
fi
OUT_TAG=".${FIELDT}kG.rmin${RMIN}.${WHAT}${OUT_TAG}"
fi
if [[ ${DIPOLE} == "Yes" ]]; then
DIPOLE="useDipole = 1;"
else
DIPOLE=""
fi
if [[ ${FLATDIPOLE} == "Yes" ]]; then
FLATDIPOLE="useFlatDipole = 1;"
else
FLATDIPOLE=""
fi
if [[ ${VERBOSE} == "Yes" ]]; then
echo "WHAT='${WHAT}'"
echo "FIELD='${FIELD}'"
echo "RMIN='${RMIN}'"
echo "WRITER_PATH='${WRITER_PATH}'"
echo "OUT_PATH='${OUT_PATH}'"
echo "OUT_TAG='${OUT_TAG}'"
echo "PARALLEL_JOBS='${PARALLEL_JOBS}'"
echo "PARTICLES='${PARTICLES}'"
echo "AUTOTAG='${AUTOTAG}'"
fi
if [[ -z ${WRITER_PATH} ]]; then
echo "Path of the LUT writers not defined, cannot continue"
exit 1
fi
function do_copy() {
cp "${1}" . || {
echo "Cannot find $2: ${1}"
exit 1
}
}
do_copy "${WRITER_PATH}/lutWrite.$WHAT.cc" "lut writer"
do_copy "${WRITER_PATH}/DetectorK/HistoManager.cxx"
do_copy "${WRITER_PATH}/DetectorK/HistoManager.h"
do_copy "${WRITER_PATH}/DetectorK/DetectorK.cxx"
do_copy "${WRITER_PATH}/DetectorK/DetectorK.h"
do_copy "${WRITER_PATH}/lutWrite.cc"
if [[ -z ${DELPHESO2_ROOT} ]]; then
do_copy "${WRITER_PATH}/lutCovm.hh"
fi
cp -r "${WRITER_PATH}/fwdRes" .
echo " --- creating LUTs: config = ${WHAT}, field = ${FIELD} T, min tracking radius = ${RMIN} cm"
function do_lut_for_particle() {
root -l -b <<EOF
.L HistoManager.cxx+
.L DetectorK.cxx+
.L lutWrite.cc
$DIPOLE
$FLATDIPOLE
.L lutWrite.${WHAT}.cc
printLutWriterConfiguration();
TDatabasePDG::Instance()->AddParticle("deuteron", "deuteron", 1.8756134, kTRUE, 0.0, 3, "Nucleus", 1000010020);
TDatabasePDG::Instance()->AddAntiParticle("anti-deuteron", -1000010020);
TDatabasePDG::Instance()->AddParticle("triton", "triton", 2.8089218, kTRUE, 0.0, 3, "Nucleus", 1000010030);
TDatabasePDG::Instance()->AddAntiParticle("anti-triton", -1000010030);
TDatabasePDG::Instance()->AddParticle("helium3", "helium3", 2.80839160743, kTRUE, 0.0, 6, "Nucleus", 1000020030);
TDatabasePDG::Instance()->AddAntiParticle("anti-helium3", -1000020030);
const int N = 8;
const TString pn[N] = {"el", "mu", "pi", "ka", "pr", "de", "tr", "he3"};
const int pc[N] = {11, 13, 211, 321, 2212, 1000010020, 1000010030, 1000020030 };
const float field = ${FIELD};
const float rmin = ${RMIN};
const int i = ${1};
const TString out_file = "${OUT_PATH}/lutCovm." + pn[i] + "${OUT_TAG}.dat";
Printf("Creating LUT for particle ID %i: %s with pdg code %i to %s", i, pn[i].Data(), pc[i], out_file.Data());
if(i >= 0 && i < N){
lutWrite_${WHAT}(out_file, pc[i], field, rmin);
} else{
Printf("Particle ID %i is too large or too small", i);
}
EOF
}
root -l -b <<EOF
.L HistoManager.cxx+
.L DetectorK.cxx+
EOF
N_RAN=0
for i in ${PARTICLES}; do
((N_RAN = N_RAN % PARALLEL_JOBS))
((N_RAN++ == 0)) && wait
do_lut_for_particle "${i}" &
((N_RAN + 1))
done
wait
# Checking that the output LUTs are OK
NullSize=""
P=(el mu pi ka pr de tr he3)
for i in $PARTICLES; do
LUT_FILE=${OUT_PATH}/lutCovm.${P[$i]}${OUT_TAG}.dat
if [[ ! -s ${LUT_FILE} ]]; then
echo "LUT file ${LUT_FILE} for particle ${i} has zero size"
NullSize="${NullSize} ${i}"
else
echo "${LUT_FILE} is ok"
fi
done
if [[ -n $NullSize ]]; then
echo "Created null sized LUTs!!"
exit 1
fi