ROOTPWA
fitMassBins.sh
Go to the documentation of this file.
1 #!/bin/bash
2 ##########################################################################
3 #
4 # Copyright 2010
5 #
6 # This file is part of rootpwa
7 #
8 # rootpwa is free software: you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation, either version 3 of the License, or
11 # (at your option) any later version.
12 #
13 # rootpwa is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
17 #
18 # You should have received a copy of the GNU General Public License
19 # along with rootpwa. If not, see <http://www.gnu.org/licenses/>.
20 #
21 ##########################################################################
22 #-------------------------------------------------------------------------
23 # File and Version Information:
24 # $Rev:: -1 $: revision of last commit
25 # $Author:: $: author of last commit
26 # $Date:: $: date of last commit
27 #
28 # Description:
29 # performs PWA fit of a number of consecutive mass bins specified
30 # by (1-based) start index MASS_BIN_INDEX and the number of bins
31 # NMB_BINS_TO_COMBINE
32 #
33 # runs locally as well as on a batch system
34 #
35 # job arguments may be passed via command line or environment
36 # variable
37 #
38 # a typical command line to run this script locally looks like this:
39 # for i in $(seq 1 50);\
40 # do fitMassBins.sh -r 2 -N ${i} &> ${ROOTPWA_LOGS_DIR}/fitMassBins.${i}.log;\
41 # done
42 #
43 # uses PWA environment variable(s)
44 # ROOTPWA_ENV_SET
45 # ROOTPWA_BIN
46 # ROOTPWA_WAVE_LIST
47 # ROOTPWA_DATA_DIR
48 # ROOTPWA_FITS_DIR
49 #
50 #
51 # Author List:
52 # Boris Grube TUM (original author)
53 #
54 #
55 #-------------------------------------------------------------------------
56 
57 
58 # file layout parameters
59 # subdirectory names for amplitudes
60 DT_AMP_DIR_NAME=AMPS
61 PS_AMP_DIR_NAME=PSPAMPS
62 PSACC_AMP_DIR_NAME=ACCAMPS
63 # amplitude file format
64 AMP_FILE_EXT=.amp
65 #AMP_FILE_EXT=.root
66 # integral file name
67 INT_FILE_NAME=norm.int
68 #INT_FILE_NAME=norm.root
69 # fit result file extension
70 FIT_FILE_EXT=.result.root
71 
72 
73 # SGE setup
74 # if SGE is used as batch system, job arrays can be conveniently used
75 # to run this script; MASS_BIN_INDEX is set to SGE_TASK_ID
76 # define queue
77 ##$ -l medium=TRUE,h_vmem=200M
78 # path for stdout files
79 ##$ -o /afs/e18.ph.tum.de/user/bgrube/compass/pwa/4PionMuoProdPwa/logs
80 # merge sterr into stdout
81 #$ -j yes
82 # send mail when job aborted, rescheduled, or suspended
83 ##$ -M bgrube
84 ##$ -m as
85 # enable path aliasing
86 #$ -cwd
87 # export all environment variables to job
88 #$ -V
89 
90 
91 echo ">>> info: called ${0} ${*}"
92 
93 
94 function usage {
95  cat << EOF
96 usage: $(basename ${0}) [OPTIONS]... [BATCH INDEX]
97 
98 performs PWA fit for a number of consecutive mass bins, by running pwafit of the ROOTPWA package
99 
100 options:
101  -${WAVE_LIST_OPT} <FILE> path to wave list file
102  -${RANK_OPT} <RANK> rank of spin density matrix
103  -${NMB_BINS_TO_COMBINE_OPT} <#> number of mass bins processed by one fit job
104  -${MASS_BINS_DIR_OPT} <DIR> path to directory with mass bins
105  -${FITS_DIR_OPT} <DIR> path to output directory for fit results
106  -${NORM_OPT} if set, amplitudes are normalized
107  -${VERBOSE_OPT} if set, debug output is printed
108  -${TOLERANCE_OPT} <#> minimizer tolerance
109  -${START_VAL_OPT} if set, start values are fixed to ${DEFAULT_START_VAL}
110  -${HELP_OPT} display this help and exit
111 EOF
112 echo
113 printPar
114 if [[ "${#}" -eq 1 ]]
115 then
116  exit ${1}
117 else
118  exit 1
119 fi
120 }
121 
122 
123 function printPar {
124  if [[ -z "${NORM}" || "${NORM}" != "-N" ]]
125  then
126  NORM_STATE="false"
127  else
128  NORM_STATE="true"
129  fi
130  if [[ "${VERBOSE}" = "-q" ]]
131  then
132  VERBOSE_STATE="false"
133  else
134  VERBOSE_STATE="true"
135  fi
136  if [[ -z "${FIX_START_VAL}" || "${FIX_START_VAL}" != "-x${DEFAULT_START_VAL}" ]]
137  then
138  START_VAL_STATE="false"
139  else
140  START_VAL_STATE="true"
141  fi
142  cat << EOF
143 parameter values:
144  path to wave list file ..................... -${WAVE_LIST_OPT} ${WAVE_LIST}
145  rank of spin density matrix ................ -${RANK_OPT} ${RANK}
146  number of mass bins to fit ................. -${NMB_BINS_TO_COMBINE_OPT} ${NMB_BINS_TO_COMBINE}
147  path to directory with mass bins ........... -${MASS_BINS_DIR_OPT} ${MASS_BINS_DIR}
148  path to output directory for fit results ... -${FITS_DIR_OPT} ${FITS_DIR}
149  normalize amplitudes ....................... ${NORM_STATE}
150  print debug output ......................... ${VERBOSE_STATE}
151  minimizer tolerance ........................ ${TOLERANCE}
152  fix start values ........................... ${START_VAL_STATE}
153 
154  mass bin batch index ....................... ${SGE_TASK_ID}
155 EOF
156 }
157 
158 
159 # take arguments either from command line, environment, or use default
160 # command line has highest priority
161 # option variables
162 WAVE_LIST_OPT="w"
163 RANK_OPT="r"
164 NMB_BINS_TO_COMBINE_OPT="n"
165 MASS_BINS_DIR_OPT="m"
166 FITS_DIR_OPT="o"
167 NORM_OPT="N"
168 VERBOSE_OPT="v"
169 TOLERANCE_OPT="t"
170 START_VAL_OPT="x"
171 HELP_OPT="h"
172 # use default values, if variables are not defined in environment
173 if [[ -z "${WAVE_LIST}" ]]
174 then
175  WAVE_LIST="${ROOTPWA_WAVE_LIST}"
176 fi
177 if [[ -z "${RANK}" ]]
178 then
179  RANK=1
180 fi
181 if [[ -z "${NMB_BINS_TO_COMBINE}" ]]
182 then
183  NMB_BINS_TO_COMBINE=1
184 fi
185 if [[ -z "${MASS_BINS_DIR}" ]]
186 then
187  MASS_BINS_DIR="${ROOTPWA_DATA_DIR}"
188 fi
189 if [[ -z "${FITS_DIR}" ]]
190 then
191  FITS_DIR="${ROOTPWA_FITS_DIR}"
192 fi
193 if [[ -z "${NORM}" || "${NORM}" != "-N" ]]
194 then
195  NORM=
196 fi
197 if [[ -z "${TOLERANCE}" ]]
198 then
199  TOLERANCE="1e-10"
200 fi
201 if [[ -z "${DEFAULT_START_VAL}" ]]
202 then
203  DEFAULT_START_VAL="0.01"
204 fi
205 VERBOSE="-q"
206 if [[ -z "${SGE_TASK_ID}" ]]
207 then
208  SGE_TASK_ID=1
209 fi
210 # parse command line options
211 while getopts "${WAVE_LIST_OPT}:${RANK_OPT}:${NMB_BINS_TO_COMBINE_OPT}:${MASS_BINS_DIR_OPT}:${FITS_DIR_OPT}:${NORM_OPT}${VERBOSE_OPT}${TOLERANCE_OPT}:${START_VAL_OPT}${HELP_OPT}" OPTION
212 do
213  case ${OPTION} in
214  ${WAVE_LIST_OPT}) WAVE_LIST=${OPTARG};;
215  ${RANK_OPT}) RANK=${OPTARG};;
216  ${NMB_BINS_TO_COMBINE_OPT}) NMB_BINS_TO_COMBINE=${OPTARG};;
217  ${MASS_BINS_DIR_OPT}) MASS_BINS_DIR=${OPTARG};;
218  ${FITS_DIR_OPT}) FITS_DIR=${OPTARG};;
219  ${NORM_OPT}) NORM="-N";;
220  ${VERBOSE_OPT}) VERBOSE="";;
221  ${TOLERANCE_OPT}) TOLERANCE=${OPTARG};;
222  ${START_VAL_OPT}) FIX_START_VAL="-x${DEFAULT_START_VAL}";;
223  ${HELP_OPT}) usage 0;;
224  esac
225 done
226 shift $((${OPTIND} - 1)) # remove used options and leave remaining arguments in $*
227 if [[ -n "${1}" ]]
228 then
229  SGE_TASK_ID="${1}"
230 fi
231 if [[ -z "${WAVE_LIST}" || -z "${RANK}" || -z "${NMB_BINS_TO_COMBINE}" || -z "${MASS_BINS_DIR}" || -z "${FITS_DIR}" ]]
232 then
233  usage 1
234 fi
235 if [[ "${ROOTPWA_ENV_SET}" != "true" ]]
236 then
237  echo "!!! error: ROOTPWA environment is not setup. please source the ROOTPWA setup script first."
238  exit 1
239 fi
240 
241 
242 echo ">>> info: ${0} started on $(date)"
243 printPar && echo
244 
245 
246 # construct array of mass bins in ascending order
247 MASS_BINS=( $(find ${MASS_BINS_DIR} -type d -regex '.*/[0-9]+.[0-9]+' -printf '%f\n' | sort -n) )
248 # get index and mass range for bin sequence
249 declare -i BIN_SEQ_IDX_MIN=0
250 declare -i BIN_SEQ_IDX_MAX=0
251 (( BIN_SEQ_IDX_MIN = (SGE_TASK_ID - 1) * NMB_BINS_TO_COMBINE ))
252 (( BIN_SEQ_IDX_MAX = SGE_TASK_ID * NMB_BINS_TO_COMBINE - 1 ))
253 if (( BIN_SEQ_IDX_MIN > ${#MASS_BINS[@]} - 1 ))
254 then
255  echo "!!! error: lower bin sequence index $(expr ${BIN_SEQ_IDX_MAX} + 1) out of range. exiting."
256  exit 1
257 fi
258 if (( BIN_SEQ_IDX_MAX > ${#MASS_BINS[@]} - 1 ))
259 then
260  echo "??? warning: upper bin sequence index $(expr ${BIN_SEQ_IDX_MAX} + 1) out of range. set to maximum possible value."
261  (( BIN_SEQ_IDX_MAX = ${#MASS_BINS[@]} - 1 ))
262 fi
263 if (( BIN_SEQ_IDX_MIN > BIN_SEQ_IDX_MAX ))
264 then
265  echo "!!! error: lower bin sequence index $(expr ${BIN_SEQ_IDX_MIN} + 1) larger than upper $(expr ${BIN_SEQ_IDX_MAX} + 1). exiting."
266  exit 1
267 fi
268 BIN_SEQ_M_MIN=${MASS_BINS[${BIN_SEQ_IDX_MIN}]%.*}
269 BIN_SEQ_M_MAX=${MASS_BINS[${BIN_SEQ_IDX_MAX}]#*.}
270 # path of output ROOT file
271 OUT_FILE=${FITS_DIR}/${BIN_SEQ_M_MIN}.${BIN_SEQ_M_MAX}${FIT_FILE_EXT}
272 # check whether wave list file exists
273 if [[ ! -s "${WAVE_LIST}" ]]
274 then
275  echo "!!! error: wave list file ${WAVE_LIST} does not exist! exiting."
276  exit 1
277 fi
278 
279 
280 # loop over bins in batch
281 echo "------------------------------------------------------------"
282 echo ">>> info: performing PWA fit for ${NMB_BINS_TO_COMBINE} mass bins: index range = [$(expr ${BIN_SEQ_IDX_MIN} + 1), $(expr ${BIN_SEQ_IDX_MAX} + 1)], mass range = [${BIN_SEQ_M_MIN}, ${BIN_SEQ_M_MAX}]"
283 echo
284 for (( IDX=BIN_SEQ_IDX_MIN; IDX<=BIN_SEQ_IDX_MAX; IDX++ ))
285 do
286  MASS_BIN_NAME=${MASS_BINS[${IDX}]}
287  # path to mass bin data
288  AMP_DIR="${MASS_BINS_DIR}/${MASS_BIN_NAME}/${DT_AMP_DIR_NAME}"
289  BIN_M_MIN=${MASS_BIN_NAME%.*}
290  BIN_M_MAX=${MASS_BIN_NAME#*.}
291  # check whether amplitude directory exists
292  if [[ ! -d "${AMP_DIR}" ]]
293  then
294  echo "!!! error: amplitude directory '${AMP_DIR}' does not exist! exiting."
295  exit 1
296  fi
297  PS_AMP_DIR="${MASS_BINS_DIR}/${MASS_BIN_NAME}/${PS_AMP_DIR_NAME}"
298  # check whether directory with phase-space amplitudes exists
299  if [[ ! -d "${PS_AMP_DIR}" ]]
300  then
301  echo "!!! error: directory '${PS_AMP_DIR}' with phase-space amplitudes does not exist! exiting."
302  exit 1
303  fi
304  PSACC_AMP_DIR="${MASS_BINS_DIR}/${MASS_BIN_NAME}/${PSACC_AMP_DIR_NAME}"
305  # check whether directory with accepted phase space amplitudes exists
306  if [[ ! -d "${PSACC_AMP_DIR}" ]]
307  then
308  echo "??? warning: directory '${PSACC_AMP_DIR}' with accepted phase-space amplitudes does not exist. using phase space integrals in '${PS_AMP_DIR}'."
309  PSACC_AMP_DIR=${PS_AMP_DIR}
310  fi
311  # set path to phase-space integrals
312  PS_INT_FILE="${PS_AMP_DIR}/${INT_FILE_NAME}"
313  PSACC_INT_FILE="${PSACC_AMP_DIR}/${INT_FILE_NAME}"
314  # run pwafit
315  NMB_NORM_EVENTS=$(sed '2q;d' ${PS_INT_FILE})
316  echo "............................................................"
317  echo ">>> info: starting PWA fit for bin $(expr ${IDX} + 1) with mass = [${BIN_M_MIN}, ${BIN_M_MAX}]"
318  echo ">>> info: using amplitude files in ${AMP_DIR}"
319  #ls -l --dereference ${AMP_DIR}/*.${AMP_FILE_EXT}
320  echo ">>> info: using wavelist ${WAVE_LIST}"
321  CMD="${ROOTPWA_BIN}/pwafit -l ${BIN_M_MIN} -u ${BIN_M_MAX} -w ${WAVE_LIST} -d ${AMP_DIR} -o ${OUT_FILE} ${NORM} -n ${PS_INT_FILE} -A ${NMB_NORM_EVENTS} -a ${PSACC_INT_FILE} -r ${RANK} ${VERBOSE} -t ${TOLERANCE} ${FIX_START_VAL}"
322  echo "${CMD}"
323  time eval ${CMD}
324  echo
325 done
326 
327 
328 echo ">>> info: ${0} successfully finished on $(date)"
329 exit 0