594d338f |
1 | #!/bin/bash |
2 | |
3 | |
4 | function usage { |
5 | echo "Usage:" |
6 | echo "makeCalibTree [options]" |
7 | echo |
8 | echo "options:" |
9 | echo " -r, --range : create tree for the given range of runs" |
10 | echo " e.g. 70000-80000" |
11 | echo " -a, --auto : create trees in chunks of \$NFILES for all the files" |
12 | echo " found in the OCDB entries of \$AUTOFILES" |
13 | echo " -l, --list : text file with a list of runs to process" |
14 | echo " -d, --outdir : output file directory" |
15 | echo " -f, --outfile : output file name" |
16 | echo " -b, --batch : run as batch job(s)" |
17 | echo " -o, --overwrite : overwrite old files" |
18 | echo " -h, --help : display this help" |
19 | echo "" |
20 | exit 0 |
21 | |
22 | } |
23 | |
24 | # |
25 | # create a list of files in $RANGE which are also available in $AUTOFILES |
26 | # |
27 | function createRangeList { |
28 | #get first and last run from range |
29 | local first=$(echo $RANGE | sed 's|\(.*\)-.*|\1|') |
30 | local last=$(echo $RANGE | sed 's|.*-\(.*\)|\1|') |
31 | #create list with all TPC runs |
32 | local command=ls |
33 | if [ $WITHALIEN -eq 1 ]; then command=alien_ls; fi |
34 | local dir=$AUTOFILES |
35 | RUNS=($($command $dir | sed 's|Run\([0-9]\{5\}\)_.*|\1|')) |
36 | #define filename |
37 | local filename=calibTreeTime_${first}_${last} |
38 | #remove old files |
39 | #test -d $TMPLISTDIR && rm -rf $TMPLISTDIR |
40 | test -d $TMPLISTDIR |
41 | mkdir -p $TMPLISTDIR |
42 | for (( i=0; i<${#RUNS[*]}; i=i+1 )); do |
43 | if [ ${RUNS[$i]} -lt $first ]||[ ${RUNS[$i]} -gt $last ]; then continue; fi |
44 | echo ${RUNS[$i]} >> $TMPLISTDIR/$filename |
45 | done |
46 | } |
47 | |
48 | # |
49 | # automatic list creation for runs in files in OCDB entry pointed to by $AUTOFILES |
50 | # crete as many lists as needed in chunks of $NFILES files |
51 | # respect the run range, if given |
52 | # |
53 | function createGuiLists { |
54 | local command=ls |
55 | if [ $WITHALIEN -eq 1 ]; then command=alien_ls; fi |
56 | local dir=$AUTOFILES |
57 | RUNS=($($command $dir | sed 's|Run\([0-9]\{5\}\)_.*|\1|')) |
58 | local count=0 |
59 | local iter=0 |
60 | local skip=0 |
61 | local filename= |
62 | local nfiles=$NFILES |
63 | #find first and last iterator |
64 | #get first and last run from range |
65 | local first=0 |
66 | local last=999999999 |
67 | local ifirst=0 |
68 | local ilast=${#RUNS[*]} |
69 | if [ "x$RANGE" != "x" ]; then |
70 | first=$(echo $RANGE | sed 's|\(.*\)-.*|\1|') |
71 | last=$(echo $RANGE | sed 's|.*-\(.*\)|\1|') |
72 | for (( i=0; i<${#RUNS[*]}; i=i+1 )); do |
73 | if [ ${RUNS[i]} -ge $first ]&&[ $ifirst -eq 0 ]; then ifirst=$i; fi |
74 | if [ ${RUNS[i]} -gt $last ]&&[ $ilast -eq ${#RUNS[*]} ]; then ilast=$i; fi |
75 | done |
76 | fi |
77 | #remove old files |
78 | #test -d $TMPLISTDIR && rm -rf $TMPLISTDIR |
79 | test -d $TMPLISTDIR |
80 | mkdir -p $TMPLISTDIR |
81 | for (( i=$ifirst; i<$ilast; i=i+1 )); do |
82 | if [ $count -eq $nfiles ]; then |
83 | count=0 |
84 | let iter=$iter+1 |
85 | fi |
86 | if [ $count -eq 0 ]; then |
87 | local firstLocal=$(echo "$iter*$nfiles+$ifirst" | bc) |
88 | local lastLocal=$(echo "if ($firstLocal+$nfiles-1>=$ilast-$ifirst) $ilast-1 else $firstLocal+$nfiles-1" | bc) |
89 | filename=calibTreeTime_${RUNS[$firstLocal]}_${RUNS[$lastLocal]} |
90 | fi |
91 | echo ${RUNS[$i]} >> $TMPLISTDIR/$filename |
92 | let count=$count+1 |
93 | done |
94 | } |
95 | |
96 | function runJobs { |
97 | local count=0; |
98 | local filename= |
99 | for file in $TMPLISTDIR/*; do |
100 | if [ "x$OUTFILE" == "x" ]; then |
101 | filename=$(basename $file).root |
102 | else |
103 | filename=${OUTFILE}_${count} |
104 | fi |
105 | if [ $OVERWRITE -eq 0 ];then |
106 | test -f $OUTDIR/$filename && continue |
107 | fi |
108 | if [ $BATCH -eq 0 ]; then |
109 | $SCRIPTDIR/makeCalibTree -l $file -f $filename -d $OUTDIR |
110 | else |
111 | $SCRIPTDIR/makeCalibTree -l $file -f $filename -d $OUTDIR -b |
112 | fi |
113 | let count=$count+1 |
114 | done |
115 | } |
116 | |
117 | function runJobOnList { |
118 | if [ $OVERWRITE -eq 0 ];then |
119 | if [ -f $OUTDIR/$OUTFILE ]; then |
120 | echo "Not overwriting file '$OUTDIR/$OUTFILE' use -o to enforce it" |
121 | exit 0; |
122 | fi |
123 | fi |
124 | if [ $BATCH -eq 1 ]; then |
125 | $BATCHCOMMAND -oo $GUI_OUTDIR/logs/$OUTFILE.out.log -eo $GUI_OUTDIR/logs/$OUTFILE.err.log /$SCRIPTDIR/makeCalibTreeList $LISTFILE $OUTDIR/$OUTFILE $SCRIPTDIR |
126 | else |
127 | $SCRIPTDIR/makeCalibTreeList $LISTFILE $OUTDIR/$OUTFILE $SCRIPTDIR |
128 | fi |
129 | } |
130 | |
131 | if [ "x$SCRIPTDIR" == "x" ]; then |
132 | echo please run: |
133 | echo export SCRIPTDIR=whatever_is_you_path |
134 | echo |
135 | exit 1 |
136 | fi |
137 | source $SCRIPTDIR/guiEnv.sh |
138 | |
139 | |
140 | #parse options |
141 | TEMP=`getopt -o r:l:f:d:aboh --long range:,list:,calibDir:,outfile:,outdir:,auto,batch,overwrite,help \ |
142 | -n 'run' -- "$@"` |
143 | |
144 | if [ $? != 0 ] ; then usage ; fi |
145 | |
146 | eval set -- "$TEMP" |
147 | |
148 | RANGE= |
149 | OUTFILE= |
150 | OVERWRITE=0 |
151 | LISTFILE= |
152 | BATCH=0 |
153 | COMMAND= |
154 | AUTO=0 |
155 | OUTDIR=$GUI_OUTDIR_TIME |
156 | |
157 | while true ; do |
158 | case "$1" in |
159 | -r|--range) RANGE=$2; shift 2;; |
160 | -l|--list) LISTFILE=$2; shift 2;; |
161 | -f|--outfile) OUTFILE=$2; shift 2;; |
162 | -d|--outdir) OUTDIR=$2; shift 2;; |
163 | -a|--auto) AUTO=1; shift;; |
164 | -b|--batch) BATCH=1; shift;; |
165 | -o|--overwrite) OVERWRITE=1; shift;; |
166 | -h|--help) usage;; |
167 | --) shift ; break ;; |
168 | *) echo "Internal error!" ; exit 1 ;; |
169 | esac |
170 | done |
171 | |
172 | |
173 | |
174 | if [ $AUTO -eq 1 ]; then |
175 | test -d $OUTDIR || mkdir -p $OUTDIR |
176 | #remove last file if it does not contain $NFILES files |
177 | lastfile=$(ls $OUTDIR/* | tail -1) |
178 | if [ "x$lastfile" != "x" ]; then |
179 | nfiles=$(wc -l $lastfile | awk '{print $1}') |
180 | if [ $nfiles -ne $NFILES ]; then |
181 | rm $lastfile |
182 | fi |
183 | fi |
184 | createGuiLists |
185 | runJobs |
186 | echo "files written to '$OUTDIR'" |
187 | exit 0 |
188 | fi |
189 | |
190 | if [ "x$RANGE" != "x" ]&&[ "x$LISTFILE" == "x" ]; then |
191 | test -d $OUTDIR || mkdir -p $OUTDIR |
192 | createRangeList |
193 | runJobs |
194 | exit 0 |
195 | fi |
196 | |
197 | if [ "x$RANGE" == "x" ]&&[ "x$LISTFILE" != "x" ]; then |
198 | test -d $OUTDIR || mkdir -p $OUTDIR |
199 | runJobOnList |
200 | exit 0 |
201 | fi |
202 | |
203 | #we should have left already, so show usage |
204 | usage |