]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGLF/FORWARD/analysis2/qa/RunQAMT.sh
Fixes for pA indenfication of events
[u/mrichter/AliRoot.git] / PWGLF / FORWARD / analysis2 / qa / RunQAMT.sh
CommitLineData
bae153e5 1#!/bin/bash
2#
3# This script runs the Forward QA for the specified production number
4#
5# The scripts downloads and runs the single run QA in parallel
6#
7
8# --- Help output ----------------------------------------------
9usage()
10{
11 cat <<EOF
12Usage: $0 [OPTIONS] -j [JOBID]
13 $0 [OPTIONS] -p PRODUCTION -P PASS
14
15Options:
16 -h,--help This help
17 -j,--jobid NUMBER The master job id of the production [$jobid]
18 -v,--verbose Increase verbosity [$verb]
19 -m,--max-files NUMBER Max number of files to get [$maxf]
20 -M,--max-jobs NUMBER Max number of consequtive jobs [$maxjobs]
21 -t,--top DIRECTORY Output directory [$top]
5c75ba4f 22 -R,--also-results Also get QAresults.root for each run
bae153e5 23 -Q,--qa-number NUMBER Custom QA id [$qanumber]
24 -p,--production IDENTIFIER Production identifier [$prodfull]
25 -P,--pass IDENTIFIER Pass identifier [$passfull]
e18cb8bd 26 -l,--log-file Log file output [$redir]
df678185 27 -b,--barrel NUMBER ? [$barrel]
bae153e5 28
29Note the option -j and the options -p and -P are mutually exclusive,
30The option -Q is only used if the options -p and -P are given.
31Production identifiers are of the form LHC11h, LHC11h3, or LHC11h_2.
32Pass identifers are of the form pass2, pass1_HLT, or cpass1.
33EOF
34}
35
36# --- Check AliEn token ----------------------------------------------
37check_token()
38{
39 uid=`id -u`
40 genv_file=/tmp/gclient_env_${uid}
41
42 if test ! -f ${genv_file} ; then
43 echo "No such file: ${genv_file}, please do alien-token-init" \
44 >/dev/stderr
45 exit 1
46 fi
47 . ${genv_file}
48 alien-token-info | grep -q "Token is still valid"
49 if test $? -ne 0 ; then
50 echo "Token not valid, please re-new" > /dev/stderr
51 exit 1
52 fi
53}
54
55# --- Diagnostics output ---------------------------------------------
56verb=0
57mess()
58{
59 if test $1 -gt $verb ; then return ; fi
60 shift
61 echo $*
62}
63
64# --- Handling of exit -----------------------------------------------
65lock=
66handle_exit()
67{
68 if test "x$lock" = "x" ; then return ; fi
69 rm -rf $lock
70}
71trap handle_exit EXIT
72
73# --- Handling of errors ---------------------------------------------
74last=
75handle_err()
76{
77 echo "Error: $last"
78 exit 1
79}
80enable_trap()
81{
82 trap handle_err ERR
83}
84disable_trap()
85{
86 trap - ERR
87}
88
89# --- Check the lock -------------------------------------------------
90check_lock()
91{
92 local loc=$1
93 lock=$loc/.lock
94
95 if test -f $lock ; then
96 echo "Another QA process is already running:" > /dev/stderr
97 echo "Content of ${lock}:" > /dev/stderr
98 cat $lock > /dev/stderr
99 trap - EXIT
100 exit 1
101 local now=`date`
102 cat <<EOF > $lock
103Process: $$
104User: $USER
105Start: $now
106EOF
107 fi
108}
109
110# --- Parse production information -----------------------------------
111parse_prod()
112{
113 prodyear=`echo $prodfull | sed 's/LHC\(..\).*/\1/'`
114 prodletter=`echo $prodfull | sed "s/LHC${prodyear}\(.\).*/\1/"`
115 prodpost=`echo $prodfull | sed "s/LHC${prodyear}${prodletter}//"`
116}
117
118parse_pass()
119{
120 passno=`echo $passfull | sed 's/.*pass\([0-9]*\).*/\1/'`
121 passpost=`echo $passfull | sed -n "s/.*pass${passno}_//p"`
122 passpre=`echo $passfull | sed -n "s/pass.*//p"`
123}
124
125# --- Extract parts from the found path ------------------------------
126year=0
127passfull=
128passno=0
129passpost=
130passpre=
131prodfull=
132prodyear=0
133prodletter=
134prodpost=
135remainder=
136qanumber=0
4077f3e8 137barrel=0
bae153e5 138get_parts()
139{
140 mess 1 "Parsing information from job $@"
141 year=$1 ; shift
142 prodfull=$1 ; shift
143 local lrunn=$1 ; shift
144 local ltype=$1 ; shift
145 passfull=$1 ; shift
146 remainder=$1
147
148 mess 10 "year=$year"
149 mess 10 "prodfull=$prodfull"
150 mess 10 "lrunn=$lrunn"
151 mess 10 "ltype=$ltype"
152 mess 10 "passfull=$passfull"
153 mess 10 "remainder=$remainder"
154
155 if test "x$passfull" = "x" ; then
156 remainder=
157 passfull=$ltype
158 fi
159 case x$passfull in
160 *pass*) ;;
161 *) remainder=$passfull
162 passfull=
163 ;;
164 esac
165 parse_pass
166 parse_prod
167
168 case x$remainder in
169 xQA*) qanumber=`echo $remainder | sed 's/QA//'` ;;
170 *) ;;
171 esac
172
173}
174# --- Get the index for information ----------------------------------
175skip=0
176jobu="http://alimonitor.cern.ch/prod/jobs.jsp?t="
177jobid=
178get_job()
179{
180 mess 1 "Getting the job information"
181 wget -q ${jobu}${jobid} -O job.html
182 local lskip
183 let lskip=$skip+1
184 p=`grep "/catalogue/index.jsp?path" job.html | head -n $lskip | tail -n 1 | sed -e 's,.*/alice/\(data\|sim\)/\([^<]*\)<.*,\2,' | tr '/' ' '`
185 rm -f job.html
186 get_parts $p
187}
188
189# --- Append path element --------------------------------------------
190append_to_path()
191{
192 local tmp=$1 ; shift
193 local add=$1
194 if test "x$tmp" != "x" ; then tmp="${tmp}/" ; fi
195 echo ${tmp}${add}
196}
197
198# --- Get a list of files to get -------------------------------------
199file=trending.root
5c75ba4f 200other=QAresults.root
bae153e5 201files=
202path=
203numf=0
204get_filelist()
205{
206 mess 3 "Getting file list"
207
208 local datd=data
209 local esdd=ESDs/
df678185 210 if test ${barrel} -gt 0 ; then
211 esdd=
212 fi
213 if test ${barrel} -gt 1 ; then
214 file=trending_barrel.root
215 other=QAresults_barrel.root
216 fi
bae153e5 217 case x$prodpost in
218 x_*) ;;
219 x) ;;
220 *) mess 3 "Assuming simulation output"
221 datd=sim
222 esdd=
223 ;;
224 esac
225
226 local paid=
227 if test "x$passfull" != "x" && test $passno -gt 0 ; then
228 paid=pass${passno}
229 fi
230 local post=${passpost}
231 case x$post in
232 x_*) ;;
233 x) ;;
234 *) post="_${post}" ;;
235 esac
236
237 path=/alice/${datd}/${year}/${prodfull}/
238 local search="${esdd}${passpre}${paid}${post}"
239
240 if test $qanumber -gt 0 ; then
241 qapost=`printf "QA%02d" $qanumber`
242 search=`append_to_path "$search" $qapost`
243 fi
244
245 search=`append_to_path "$search" $file`
246
247 cat <<EOF
248 Path: $path
249 Search: $search
250EOF
251 mess 1 "Getting list of files from AliEn - can take minutes - be patient"
252 mess 2 "alien_find ${path} ${search}"
5c75ba4f 253 files=`alien_find ${path} ${search} | grep -v "files found" 2>> ${redir}`
bae153e5 254 for i in $files ; do
255 let numf=$numf+1
256 done
257 mess 1 -n "Total of $numf files ... "
258 if test $maxf -lt 0 ; then
259 mess 1 "using all"
260 else
261 mess 1 "using $maxf first of these"
262 fi
263}
264
265# --- Change permissions on files ------------------------------------
266fix_perm()
267{
268 if test ! -f $1 ; then return ; fi
269 chmod g+rwX $1
e18cb8bd 270 chmod o+rX $1
bae153e5 271}
272
273# --- Check if a file is OK ------------------------------------------
274docheck=1
275check_file()
276{
277 if test $docheck -lt 1 ; then return 0; fi
5c75ba4f 278 root -l -b <<EOF >> ${redir} 2>&1
bd6f5206 279.L $ALICE_ROOT/PWGLF/FORWARD/analysis2/qa/CheckQAFile.C
5c75ba4f 280CheckQAFile("$1");
281.q
bae153e5 282EOF
bae153e5 283 local ret=$?
284 mess 2 "Check of $1 -> $ret"
285 rm -f ${scr}.C
286 return $ret
287}
288
289# --- Analyse a file -------------------------------------------------
290analyse_file()
291{
292 local dir=`dirname $1`
293 local inp=`basename $1`
294 local out=`echo $inp | sed 's/trending_/tree_/'`
295 local ret=0
296 mess 2 -n "Analysing $inp -> $out ... "
297
298 if test -f $dir/$out ; then
299 mess 2 "exits"
300 return 0
301 fi
302
303 (cd $dir
5c75ba4f 304 root -l -b <<EOF > /dev/stderr
bd6f5206 305.L $ALICE_ROOT/PWGLF/FORWARD/analysis2/qa/RunFileQA.C
5c75ba4f 306RunFileQA("$inp", "$out");
307.q
bae153e5 308EOF
bae153e5 309 ret=$?
310 mess 2 " -> $ret"
311 rm -f ${scr}.C
5c75ba4f 312 ) 2>> $redir
bae153e5 313 return $ret
314}
315
316# --- Download a single file -----------------------------------------
5c75ba4f 317also_results=1
bae153e5 318analyse_run()
319{
320 local source=$1 ; shift
321 local store=$1 ; shift
322 local r=$1 ; shift
323 local o=${store}/`basename $file .root`_${r}.root
5c75ba4f 324
bae153e5 325 mess 2 -n "$source -> $o ... "
326 if test -f $o ; then
327 mess 2 "exists"
328 # sleep 1
329 else
330 mess 2 -n "copying ... "
5c75ba4f 331 alien_cp alien:${source} file:${o} >> ${redir} 2>&1
bae153e5 332 fix_perm $o
333 mess 2 "done"
334 fi
335 if test ! -f $o ; then return 1 ; fi
336
5c75ba4f 337 if test $also_results -gt 0 ; then
338 local s=`dirname ${source}`/${other}
339 local q=${store}/`basename $other .root`_${r}.root
340
341 mess 2 -n "$s -> $q ... "
342 if test -f $q ; then
343 mess 2 "exists"
344 else
345 mess 2 -n "copying ... "
346 alien_cp alien:${s} file:${q} >> ${redir} 2>&1
347 fix_perm $q
e18cb8bd 348 mess 2 "done"
5c75ba4f 349 fi
350 fi
351
352
bae153e5 353 check_file ${o}
354 local ret=$?
355 case $ret in
356 0|2) ;;
357 1|3|4|5|6) return 2 ;;
358 esac
359
360 analyse_file ${o}
361
362 return 0
363}
364
365# --- Submit run analysis to background ------------------------------
366submit_runs()
367{
368 local out=$1 ; shift
369 local sta=$1 ; shift
370 local max=$1 ; shift
371
372 local joblist=
373 local counter=0
374 mess 5 "Submitting $maxjobs jobs from $sta/$maxf"
375 for i in $@ ; do
376 let cur=$sta+$counter
377
378 local b=`echo $i | sed -e "s,${path},,"`
379 local r=`echo $b | sed -e "s,/.*,,"`
380
381 printf "%3d/%3d: %s\n" $cur $max $r
382 runs[$counter]=$r
383
384 let counter=$counter+1
385
386 analyse_run $i $out $r &
387 j=`jobs %% | sed -e 's/^[^0-9]*//' -e 's/[^0-9]*$//'`
388 joblist="$joblist $j"
389 done
390
391 counter=0
392 mess 5 "will wait for jobs $joblist"
393 for i in $joblist ; do
394 mess 5 "waiting for $i of $joblist"
395 wait %$i
396 mess 5 "Analysing ${runs[$counter]} returned $?"
397 let counter=$counter+1
398 done
399}
400
401# --- Analyse each run in turn ---------------------------------------
402maxjobs=`grep "processor" /proc/cpuinfo | wc -l`
403analyse_runs()
404{
405 local out=$1 ; shift
406 local max=$1 ; shift
407
408 local queued=0
409 local counter=0
410 local start=0
411 local list=
412 while test $# -gt 0 ; do
413 if test $counter -ge $max ; then
414 break;
415 fi
416
417 list="$list $1"
418 shift
419 let queued=$queued+1
420 let counter=$counter+1
421
422 if test $queued -eq 1 ; then
423 start=$counter
424 fi
425
426 if test $queued -ge $maxjobs ; then
427 mess 1 "Submitting $queued jobs from $start/$max"
428 submit_runs $out $start $max $list
429 list=
430 queued=0
431 fi
432 done
433 if test $queued -gt 0 ; then
434 mess 1 "Submitting $queued jobs from $start/$max"
435 submit_runs $out $start $max $list
436 fi
437}
438
439# --- Copy style -----------------------------------------------------
440copy_style()
441{
442 if test ! -f $style ; then return ; fi
443 rm -f style.css
444 cp $style .
445 fix_perm style.css
446}
447
448# --- Run the final trending -----------------------------------------
449make_trend()
450{
451 local dir=$1
452 local ret=0
453 mess 1 -n "Analysing $dir ... "
454 (cd $dir
455 rm -f trend_*_*.html
456 rm -f trend_*_*.pdf
457 rm -f trend_*_*.root
458
5c75ba4f 459 root -l -b <<EOF > /dev/stderr
bd6f5206 460.L $ALICE_ROOT/PWGLF/FORWARD/analysis2/qa/RunFinalQA.C
5c75ba4f 461RunFinalQA(".");
462.q
bae153e5 463EOF
464 mess 1 -n " ... "
465 mess 3 -n "root -l -b -q ${scr}.C "
466 root -l -b -q ${scr}.C > /dev/null 2>&1
467 local ret=$?
468 mess 1 " -> $ret"
469 rm -f ${scr}.C
470
471 # do the index file
472 local idx=`ls trend_*_*.html 2> /dev/null`
473 for i in $idx ; do
474 mess 1 "Making index.html point to $i"
475 sed -e 's,index.html,../index.html,' \
476 -e "s,!--JOBID--,a target='_blank' href='${jobu}${jobid}'>Job</a," \
477 < $i > index.html
478 cp index.html $i
479 done
480
481 if test ! -f index.html ; then
482 echo "No index file found"
483 ret=1
484 else
485 fix_perm index.html
486 fix_perm . > /dev/null 2>&1
487 fi
488
489 copy_style
5c75ba4f 490 ) 2>> $redir
bae153e5 491 return $ret
492}
493
494# --- Make index file ------------------------------------------------
495make_index()
496{
497 local dir=$1 ; shift
498 local title=$1 ; shift
499 local desc=$1 ; shift
5c75ba4f 500 mess 1 "Making index in $dir ($title)"
bae153e5 501
502 (cd $dir
503 local date=`date`
bae153e5 504
505 rm -f index.html
506
507 cat <<EOF > index.html
508<html>
509 <head>
510 <title>$title</title>
511 <link rel='stylesheet' href='style.css'>
512 </head>
513 <body>
514 <h1>$title</h1>
515EOF
516 if test ! "x$desc" = "x" ; then
517 echo "$desc" >> index.html
518 fi
519 echo " <ul>" >> index.html
520 for i in * ; do
521 if test ! -d $i ; then continue ; fi
5c75ba4f 522 echo " <li><a href='$i'>$i</a></li>" >> index.html
bae153e5 523 done
524 echo " </ul>" >> index.html
525 if test "x$desc" = "x" ; then
526 echo " <div class='back'><a href='../'>Back</a></div>" \
527 >> index.html
528 fi
529 cat <<EOF >> index.html
530 <div class='change'>Last update: $date</div>
531 </body>
532</html>
533EOF
534 copy_style
535 fix_perm index.html
536 fix_perm . > /dev/null 2>&1
537 )
538}
539
540
541# --- Pass command line options --------------------------------------
542redir=/dev/null
543maxf=-1
544top=.
545while test $# -gt 0 ; do
546 case $1 in
547 -h|--help) usage ; exit 0 ;;
548 -v|--verbose) let verb=$verb+1 ;;
549 -j|--jobid) jobid=$2 ; shift ;;
550 -m|--max-files) maxf=$2 ; shift ;;
551 -M|--max-jobs) maxjobs=$2 ; shift ;;
552 -t|--top) top=$2 ; shift ;;
5c75ba4f 553 -R|--also-results) also_results=1 ;;
bae153e5 554 -Q|--qa-number) qanumber=$2 ; shift ;;
555 -p|--production)
556 prodfull=$2
557 shift
558 parse_prod
559 year=20${prodyear}
560 ;;
561 -P|--pass)
562 passfull=$2
563 shift
564 parse_pass
565 ;;
e18cb8bd 566 -l|--log-file) redir= ; shift ;;
4077f3e8 567 -b|--barrel) barrel=$2; shift ;;
568
bae153e5 569 *) echo "$0: Unknown argument: $1" > /dev/stderr ; exit 1 ;;
570 esac
571 shift
572done
bae153e5 573# --- Initial setup --------------------------------------------------
574# First, check we have a valid AliEn token, then retrieve the job
575# information to parse out the location of the files we need, and
576# finally make our output directory and check the lock
577check_token
578
579if test ! "x$jobid" = x ; then
580 if test ! "x$prodfull" = "x" || test ! "x$passfull" = "x" ; then
581 cat <<EOF > /dev/stderr
582Option -j ${jobid} and options -p and -P are mutually exclusive
583EOF
584 exit 1
585 fi
586 get_job
587else
588 if test "x$prodfull" = "x" || test "x$passfull" = "x" ; then
589 cat<<EOF > /dev/stderr
590When specifying prodcution and/or pass both options -p and -P _must_
591be specified.
592EOF
593 exit 1
594 elif test ! "x$jobid" = "x" ; then
595 cat <<EOF > /dev/stderr
596Option -j and options -p ${prodfull} and -P ${passfull} are mutually exclusive
597EOF
598 exit 1
599 fi
600fi
601
602proddir=LHC${prodyear}${prodletter}
603store=${proddir}
604if test ! "x$passno" = "x" ; then
605 store=${store}/pass${passno}
606elif test ! "x$prodpost" = "x" ; then
607 proddir=${proddir}${prodpost}
608 store=${proddir}/sim
609fi
610if test ! "x$qanumber" = "x" && test $qanumber -gt 0 ; then
611 store=${store}_QA${qanumber}
612fi
613mkdir -p ${top}/$store
614fix_perm ${top}/${proddir}
615fix_perm ${top}/$store
616
e18cb8bd 617if test "x$redir" = "x" ; then
618 redir=${top}/$store/qa.log
619 rm -f $redir
620 fix_perm $redir
621fi
622
623check_lock ${top}/$store
bae153e5 624
625cat <<EOF
626 Year: $year
627 Production: $prodfull
628 Year: $prodyear
629 Letter: $prodletter
630 Suffix: $prodpost
631 Pass: $passfull
632 Number: $passno
633 Prefix: $passpre
634 Postfix: $passpost
635 Remainder $remainder
636 QA number $qanumber
637 Output directory: ${store}
638 Lock file: ${lock}
e18cb8bd 639 Log: ${redir}
bae153e5 640EOF
641# --- Do a search to find our files ----------------------------------
642get_filelist
643
644if test $maxf -gt 0 && test $maxf -lt $numf ; then
645 numf=$maxf
646fi
647
648# --- Now get and analyse each run -----------------------------------
649analyse_runs ${top}/$store $numf $files
650
651# --- Now analyse all runs -------------------------------------------
bd6f5206 652style=$ALICE_ROOT/PWGLF/FORWARD/analysis2/qa/style.css
bae153e5 653make_trend ${top}/$store
654
655# --- Make index files -----------------------------------------------
656make_index ${top}/${proddir} ${proddir}
657make_index ${top} "QA for the FMD" \
658 "For more information see <a href='https://twiki.cern.ch/twiki/bin/viewauth/ALICE/FMDQA'>TWiki pages</a>."
659
660#
661# EOF
662#