adafb4413138be9ec0395a9ab215b8f8052224a2
[u/mrichter/AliRoot.git] / PWGLF / FORWARD / analysis2 / sim / doit.sh
1 #!/bin/bash
2 version=5
3 tag=
4 id=
5 run=
6 stage=0
7 upload=0 
8 jobs=2
9 events=1
10 gen=default
11 aliroot="v5-04-Rev-20"
12 root=""
13 geant=""
14 minmerge=30
15 noact=0
16
17 # --- Display help message -------------------------------------------
18 usage()
19 {
20     cat <<EOF 
21 Usage: $0 [OPTIONS]
22
23 Options:
24         -h,--help               This help
25         -t|--tag       TAG      Job tag [****] ($tag)
26         -i|--id        NAME     Name of production ($id)
27         -R|--run       RUN_NO   Run number ($run)
28         -e|--generator NAME     Event generator ($gen)
29         -c|--copy               Copy files to AliEn
30         -n|--jobs      JOBS     Set number of jobs[**] ($jobs)
31         -m|--events    EVENTS   Set events/job[**] ($events)
32         -s|--stage     STAGE    Set the stage[***] ($stage)
33         -o|--output    DIR      Set base output directory ($aout)
34         -d|--data      DIR      Set data directory ($adir)
35         -b|--bin       DIR      Set base bin directory ($abin)
36         -a|--aliroot   RELEASE  Set AliROOT release [*] ($aliroot)
37         -r|--root      RELEASE  Set ROOT release [*] ($root)
38         -g|--geant     RELEASE  Set GEANT3 release [*] ($geant)
39         -f|--final     NUMBER   Run final merging when down to this ($minmerge)
40
41 [*] Only make sense with option -c 
42 [**] Only make sense for stage 0
43 [***] If stage is set to 6, try to deduce the stage automatically
44 [****] TAG is a short hand for specific id and run
45 EOF
46 }
47
48 # --- Process a return value -----------------------------------------
49 log_msg() 
50 {
51     local log=$1 ; shift
52     echo -en "$@\e[0m ... "
53     if test "x$log" != "x" ; then 
54         echo "=== $@" >> $log 
55     fi
56 }
57 # --- Make error -----------------------------------------------------
58 log_err() 
59 {
60     local pre=$1 
61     local post=$2 
62     echo -e "\e[31;1mError\e[0m: ${pre} \e[35m${post}\e[0m" > /dev/stderr 
63 }
64
65 # --- Process a return value -----------------------------------------
66 log_end()
67 {
68     local log=$1
69     local ret=$2 
70     local ext=$3
71     local msg=""
72     local fmt=""
73     if test $ret -eq 0 ; then 
74         msg="success"
75         fmt="32"
76     else 
77         msg="failure"
78         fmt="31"
79     fi 
80     echo -e "\e[${fmt}m${msg}${ext}\e[0m"
81     if test "x$log" != "x" ; then 
82         echo "=== $msg$ext" >> $log 
83     fi 
84 }
85
86 # --- Copy a file to AliEn -------------------------------------------
87 copy()
88 {
89     local file=$1 
90     local dest=$2
91     local del=$3
92     local base=`basename $file`
93
94     if test "x$del" != "x" ; then 
95         log_msg cp.log "Removing \e[33malien:${dest}/${base}"
96         if test $noact -lt 1 ; then 
97             alien_rm ${dest}/${base} >> cp.log 2>&1 
98         fi 
99         log_end cp.log $? " (ignore errors)"
100     fi
101
102     log_msg cp.log "Uploading \e[33m${file}\e[0m to \e[33m${dest}"
103     if test $noact -lt 1 ; then 
104         alien_cp -n file:${file} alien:${dest}/${base} >> cp.log 2>&1
105     fi 
106     log_end cp.log $? 
107 }
108
109 # --- Run merging jpb ------------------------------------------------
110 merge()
111 {
112     local what=$1
113     local stage=$2 
114     local dir=$3
115     local out=$4
116     local tag=$5 
117     local run=$6
118     local tmpdir=`mktemp -d` 
119     local pre=$what
120     if test "x$what" = "xAOD" ; then 
121         pre="aod";
122     fi 
123
124     local top=${out}/${tag}/${run}
125     local bse=${what}_Stage_${stage}.xml 
126     local xml=${tmpdir}/${bse}
127     local arc=${pre}_archive.zip
128     local jdl=Merge.jdl
129     local ret=0
130
131     rm -f cp.log 
132
133     log_msg cp.log "Creating XML file \e[33m${xml}"
134     if test $stage -eq 1 ; then 
135         rm -f ${xml}
136         alien_find -x ${top}/${bse} ${top} */${arc} > ${xml} 2>>cp.log
137         ret=$? 
138     else 
139         let prev=$stage-1
140         rm -f ${xml}
141         alien_find -x ${top}/${bse} ${top}/${what}_Stage_${prev} */${arc} \
142             > ${xml} 2>>cp.log
143         ret=$? 
144     fi
145     log_end cp.log $ret 
146     if test $ret -ne 0 ; then 
147         log_err "Make XML", "Failed to make XML collection $bse"
148         exit 1
149     fi 
150     local n=`grep "<event name" ${xml} | wc -l 2>/dev/null` 
151     if test $n -lt $minmerge ; then 
152         old=$bse
153         stage=5
154         jdl=Final.jdl
155         bse=${what}_Stage_${stage}.xml 
156         tmp=${tmpdir}/${bse}
157         sed "s,$old,$bse," < $xml > $tmp
158         xml=$tmp
159     fi
160     echo -e "\e[33m$n\e[0m input files for \e[32m${what} stage ${stage}\e[0m"
161
162     copy ${xml} ${top} del
163
164     log_msg "" "Submitting merging job \e[33m${jdl}"
165     if test $noact -lt 1 ; then 
166         alien_submit alien:${dir}/${jdl} ${run} ${stage} ${tag} ${what}
167     fi 
168     log_end "" $?
169 }
170
171 # --- Determine the next stage ---------------------------------------
172 progress()
173 {
174     local out=$1 
175
176     log_msg "" "Deduce next stage for \e[33m$out"
177     # First, check for final merge result 
178     # echo -e "\nCheck of ${out}/QA_merge_archive.zip"
179     alien_ls ${out}/QA_merge_archive.zip > /dev/null 2>&1 
180     if test $? -eq 0 ; then 
181         stage=6
182     else
183         #  Then check for production data 
184         # echo -e "\nCheck of ${out}/001"
185         alien_ls ${out}/001 > /dev/null 2>&1 
186         ret=$?
187         # echo "ret=$ret"
188         if test $ret -ne 0 ; then 
189             # echo "No output, stage 0 to be done"
190             stage=0
191         else
192             # Finally, check each merge stage 
193             tmp=0
194             stage=0
195             for i in 4 3 2 1; do 
196                 # echo -e "\nCheck of ${out}/QA_Stage_${i}"
197                 alien_ls ${out}/QA_Stage_${i} > /dev/null 2>&1 
198                 if test $? -ne 0 ; then 
199                     tmp=$i 
200                 else 
201                     break
202                 fi
203             done 
204             stage=$tmp
205         fi
206     fi 
207     log_msg "" "\e[34;m$stage"
208     log_end "" 0
209 }
210 # --- Upload files ---------------------------------------------------
211 push()
212 {
213     local bin=$1 
214     local data=$2 
215     local out=$3
216     local tmpdir=`mktemp -d` 
217
218     rm cp.log
219
220     jdls="Run.jdl Merge.jdl Final.jdl"
221     for i in $jdls ; do 
222         log_msg "" "Creating \e[33m${i}"
223         sed -e "s|@out@|${out}|"                \
224             -e "s|@data@|${data}|"              \
225             -e "s|@bin@|${bin}|"                \
226             -e "s|@aliroot@|${aliroot}|"        \
227             -e "s|@root@|${root}|"              \
228             -e "s|@geant@|${geant}|"            \
229             < ${i}.in > ${tmpdir}/${i}
230         log_end "" $? 
231     done
232
233     log_msg cp.log "Removing and re-creating \e[33m${data}"
234     if test $noact -lt 1 ; then 
235         alien_rmdir ${data} >> cp.log 2>&1
236         alien_mkdir -p $data >> cp.log 2>&1
237     fi
238     log_end cp.log $?
239
240     local del=1
241     if test "X$bin" = "X$data" ; then del=0 ; fi 
242     copy run.sh $bin $del
243     copy merge.sh $bin $del
244
245
246     files="simrun.sh            \
247         GRP.C                   \
248         Simulate.C              \
249         Config.C                \
250         DetConfig.C             \
251         OCDBConfig.C            \
252         Reconstruct.C           \
253         Check.C                 \
254         Tag.C                   \
255         QA.C                    \
256         QAConfig.C              \
257         AOD.C                   \
258         AODConfig.C             \
259         ${tmpdir}/Run.jdl       \
260         ${tmpdir}/Merge.jdl     \
261         ${tmpdir}/Final.jdl     \
262         fmd_corrections.root"
263     
264     for i in $files ; do 
265         copy $i ${data}
266     done 
267 }
268
269 # --- Get package versions -------------------------------------------
270 getVersions()
271 {
272     local ali=$1
273     local roo=$2
274     local gean=$3
275
276     log_msg "" "Checking software packages"
277     if test "x$ali" = "x" ; then 
278         log_end "" 1
279         log_err "Check versions" "No AliROOT Release specified"
280         exit 1
281     fi
282     if test "x$roo" != "x" && test "x$gean" = "x" ; then 
283         log_msg "" "\e[33mAliROOT=$ali ROOT=$roo GEANT=$gean"
284         log_end "" 0
285         return
286     fi
287         
288     l=`wget -q http://alimonitor.cern.ch/packages/ -O - | \
289         sed -n -e '/<tr/,/<\/tr>/ p' | \
290         sed -n "/<a.*VO_ALICE@AliRoot::${aliroot}/,/VO_ALICE@ROOT::/ p" | \
291         sed -n -e 's/.*VO_ALICE@\(GEAN\|ROO\)T3*::\(v[-0-9a-zA-Z]*\).*/\L\1=\2/gp'|\
292         tr '\n' ' '` 
293     eval $l
294     if test "X$roo" = "X" || test "X$gean" = "X" ; then 
295         log_end "" 1 
296         log_err "Check versions", "Failed to extract ROOT/GEANT3 versions"
297         exit 1
298     fi
299     root=$roo
300     geant=$gean
301     log_msg "" "\e[33mAliROOT=$ali ROOT=$root GEANT=$geant"
302     log_end "" 0
303 }
304
305 # --- Create an arcive for upload ------------------------------------
306 archive()
307 {
308     log_msg "" "Creating archive of files" 
309     local name=sim_files${version}
310     mkdir -p ${name}
311     files="\
312         run.sh          \
313         AOD.C           \
314         Check.C         \
315         Config.C        \
316         doit.sh         \
317         Final.jdl.in    \
318         GRP.C           \
319         Merge.jdl.in    \
320         QA.C            \
321         README.md       \
322         Reconstruct.C   \
323         Run.jdl.in      \
324         simrun.sh       \
325         Simulate.C      \
326         Tag.C           \
327         merge.sh        \
328         fmd_corrections.root"
329
330     for i in $files ; do 
331         cp $i ${name}/$i 
332     done
333     tar -czf ${name}.tar.gz ${name} 
334     ret=$?
335     rm -rf ${name}
336     log_end "" $ret
337 }
338
339 # --- Set some variables ---------------------------------------------
340 auid=`alien_whoami | sed 's/^ *//'` 
341 ahome=/alice/cern.ch/user/`echo $auid | sed 's/^\(.\).*/\1/'`/$auid
342 adir=${ahome}/mc
343 abin=${ahome}/mc
344 aout=${ahome}/test
345 stages="AOD QA"
346
347 # --- Proces command line options ------------------------------------
348 while test $# -gt 0 ; do 
349     case $1 in 
350         -h|--help) usage; exit 0;;
351         -t|--tag)       tag=$2          ; shift ;; 
352         -i|--id)        id=$2           ; shift ;; 
353         -R|--run)       run=$2          ; shift ;; 
354         -e|--generator) gen=$2          ; shift ;;
355         -c|--copy)      upload=1        ;; 
356         -n|--jobs)      jobs=$2         ; shift ;;
357         -m|--events)    events=$2       ; shift ;;
358         -s|--stage)     stage=$2        ; shift ;; 
359         -S|--stages)    stages=$2       ; shift ;; 
360         -b|--bin)       abin=$2         ; shift ;; 
361         -o|--output)    aout=$2         ; shift ;; 
362         -d|--data)      adir=$2         ; shift ;; 
363         -a|--aliroot)   aliroot=$2      ; shift ;;
364         -r|--root)      root=$2         ; shift ;; 
365         -g|--geant)     geant=$2        ; shift ;; 
366         -f|--final)     minmerge=$2     ; shift ;;
367         -A|--archive)   archive         ; exit 0 ;;
368         -x|--dry-run)   noact=1         ;;
369         *) log_err "Unknown option" "$1" ;  exit 1  ;;
370     esac
371     shift 
372 done 
373 abin=$adir
374
375
376
377 # --- May upload only ------------------------------------------------
378 if test $upload -gt 0 ; then 
379     getVersions "$aliroot" "$root" "$geant"
380     push ${abin} ${adir} ${aout}
381     if test $stage -lt 0 ; then 
382         exit 0
383     fi 
384 fi
385
386 # --- Inspect options ------------------------------------------------
387 case $tag in 
388     pp)   id=$tag ; run=118506 ;; 
389     PbPb) id=$tag ; run=138190 ;; 
390     pPb)  id=$tag ; run=195483 ;;
391     Pbp)  id=$tag ; run=196433 ;; 
392 esac
393 if test "x$id" = "x" ; then 
394     log_err "" "No job identifier given" 
395     log_end "" 1
396     exit 1
397 fi
398 if test "x$run" = "x" ; then 
399     log_err "" "No run number given" 
400     log_end "" 1
401     exit 1
402 fi
403 case $stage in 
404     0|1|2|3|4|5) : ;; 
405     6)  progress $aout/$id/$run ;;
406     *)  log_err "Invalid stage" "$stage" ; exit 1 ;;
407 esac
408 if test $stage -ge 6 ; then 
409     log_msg "" "All done"
410     log_end "" 0
411     exit 0
412 fi
413
414 # --- Either run the job or merge ------------------------------------
415 if test $stage -le 0 ; then 
416     log_msg "" "Removing old ${aout}/${id}/${run}"
417     ret=0
418     if test $noact -lt 1 ; then 
419         alien_rmdir ${aout}/${id}/${run} > /dev/null 2>&1 
420         ret=$?
421     fi 
422     log_end "" $ret
423
424     log_msg "" "Submitting \e[33mRun.jdl\e[0m for \e[34m$id run\e[0m (\e[34m$jobs\e[0m jobs w/\e[34m$events)"
425     if test $noact -lt 1 ; then 
426         alien_submit alien:${adir}/Run.jdl ${run} ${jobs} ${events} ${id} ${gen}
427         ret=$?
428     fi 
429     log_end "" $ret
430     exit $ret
431 fi
432
433 for s in $stages ; do 
434     merge ${s} ${stage} ${adir} ${aout} ${id} ${run}
435 done
436
437 #
438 # EOF
439 #
440
441
442