4 # Script to help do PWGLF-Forward analsysis using ProofLite
5 # =========================================================
6 # First, one need to figure out what to analyse. We assume we have
7 # the ESDs from a real run in some directory - possibly in
8 # sub-directories, and similar for the MC data.
10 # Then, one needs to run this script in set-up mode e.g.,
15 # --real-dir=/data/alice/data/pp/lhc10c/000118560/pass3 \
16 # --real-pattern=AliESDs_*.root \
17 # --mc-dir=/data/alice/data/pp/lhc10c/sim/lhc13d4/118560 \
18 # --mc-pattern=root_archive.zip@AliESDs.root
20 # Note, all the settings are written to the file .config in the
21 # current directory, so you do not need to give the parameters at
22 # subsequent steps. Note, you need a valid AliEn token to at this
23 # point to get the acceptance corrections. The run number specified
24 # is only used for getting the acceptance correction.
26 # Note, the use of the ZIP archives root_archive.zip and the sub-part
27 # specification @AliESDs.root for MC data.
29 # Next, we need to generate the corrections. Do
33 # and wait for the jobs to finish and terminate. Next, we need to
34 # extract and upload the corrections to our local corrections folder
36 # $0 --what=corr --step=upload
38 # If you already have the corrections, you can pass the option
39 # --corrections in the setup phase and skip this step.
41 # Now we can submit our AOD generation jobs. Do
45 # and wait for the jobs to finish and terminate. If you need to pass
46 # additional options to the train, one can do so after the special
47 # option -- e.g., to limit the number of events to 100000, do
49 # $0 --what=aod -- --events=100000
51 # Next, we need to draw the summary results
53 # $0 --what=aod --step=draw
55 # Now, we should do the dN/deta analysis. Do
59 # and wait for the jobs to finish and terminate. Again, additional
60 # options to the train can be passed after --. if you passed the
61 # option --sys=1 in the setup phase, then this will run 3 jobs for
62 # real and MC each - one for INEL, INEL>0, and NSD (V0-AND). Next, we
63 # need to draw the summary and final plot
65 # $0 --what=dndeta --step=draw
67 # To generate the P(Nch) data, do
70 # $0 --what=multdists --step=draw
72 # To collect all PDFs into a single directory do
78 # Comments, questions, bugs, flames, suggestions, etc. should be sent
79 # to Christian Holm Christensen <cholm@nbi.dk>
94 fwd_dir=$ALICE_ROOT/PWGLF/FORWARD/analysis2
111 # === Various functions ==============================================
112 # --- Usage ----------------------------------------------------------
116 Usage: $0 --what OPERATION [OPTIONS]
119 -r,--run=NUMBER Specify run number ($run)
120 -n,--name=STRING Base name of jobs ($name)
121 -S,--sys=SYSTEM Collision system ($sys)
122 -E,--snn=ENERGY Center of mass energy per nuclean pair ($snn)
123 -F,--field=FIELD L3 magnetic field ($field)
124 -d,--real-dir=DIR Directory holding real data ($real_dir)
125 -p,--real-pattern=PATTERN Glob pattern to match when searching ($real_pat)
126 -D,--mc-dir=DIR Directory holding MC data ($mc_dir)
127 -P,--mc-pattern=PATTERN Glob pattern to match when searching ($mc_pat)
128 -s,--step=STEP Run stage ($step)
129 -w,--what=TRAINS What to do
130 -c,--corrections=DIR Directory where corrections are stored ($corrs)
131 -W,--workers=N Number of workers ($nwrks)
132 -a,--par Use par files ($par)
133 -u,--url-opts=OPTIONS Additional user options ($uuopts)
134 -M,--man Show the manual
135 -N,--noact Show what will be done
139 clean Clean directory
140 setup Do intial setup
141 corrs Generate corrections
143 dndeta Generate dNdeta
145 and must be executed in that order. STEP is one of
147 full Run the analysis
148 upload Upload corrections (only for TRAINS=corrs)
149 draw Draw (partial) results
153 # --- Manual ---------------------------------------------------------
158 sed -n -e '/BEGIN_MANUAL/,/END_MANUAL/ p' | \
159 sed -e '/\(BEGIN\|END\)_MANUAL/ d' -e 's/^# //' \
163 # === Utilities to execute scripts ===================================
164 # --- Check AliEn token ----------------------------------------------
168 genv_file=/tmp/gclient_env_${uid}
170 if test ! -f ${genv_file} ; then
171 echo "No such file: ${genv_file}, please do alien-token-init" \
176 alien-token-info | grep -q "Token is still valid"
177 if test $? -ne 0 ; then
178 echo "Token not valid, please re-new" > /dev/stderr
182 # --- Run script -----------------------------------------------------
186 local args=$1 ; shift
187 echo "Will run aliroot -l -b -q $scr($args)"
188 if test $noact -gt 0 ; then return ; fi
194 # --- Run acceptance generation --------------------------------------
199 script ${fwd_dir}/corrs/ExtractAcceptance.C "${run}"
201 # --- Create the index -----------------------------------------------
210 if test $m -gt 0 ; then
213 if test "x$d" = "x" ;then
214 echo "No input specified for index for $t data" > /dev/stderr
217 if test ! -d $d || test ! -f $d ;then
218 echo "Specified input for $t data is not a directory or file " \
222 if test $m -gt 0 ; then
226 .L $ALICE_ROOT/PWGLF/FORWARD/trains/ChainBuilder.C++
227 ChainBuilder::CreateCollection("${o}", "file://${d}?recursive&scan&pattern=${p}${n}#esdTree");
233 # --- Extract corrections --------------------------------------------
236 test -f .extract && return 0
240 # --- Upload a file --------------------------------------------------
243 if test -f .upload ; then
244 echo "Already uploaded in `basename $PWD`"
248 script Upload.C \"file://${here}/${name}_corrs_${now}/\" >/dev/null 2>&1
251 # --- Extract and upload ---------------------------------------------
258 # --- Draw -----------------------------------------------------------
266 echo "=== $d ================================================"
268 draw ${fwd_dir}/DrawdNdetaSummary.C && \
272 # --- Get the grid home dir ------------------------------------------
276 my_real_dir="$l/${name}_aod_${now}"
277 my_mc_dir="$l/${name}_mcaod_${now}"
278 real_idx="$l/${name}_index_${now}.root"
279 mc_idx="$l/${name}_mcindex_${now}.root"
282 # === Trains =========================================================
283 # --- Run set-ups ----------------------------------------------------
286 if test x$run = "x" || test $run -lt 1; then
287 echo "No run for acceptance correction specified" > /dev/stderr
291 now=`date '+%Y%m%d_%H%M'`
294 # Write settings to a file, which we later can source
296 if test $par -gt 0 ; then dumpvar="--par " ; fi
297 cat > ${dotconf} <<EOF
310 my_real_dir=${my_real_dir}
311 my_mc_dir=${my_mc_dir}
315 # Trigger efficiencies - edit here to set them
317 inelgt0_eff=$inelgt0_eff
321 $0 --what=setup --name="$name" --run="$run" \
322 --sys="$sys" --snn="$snn" --field="$field" \
323 --real-dir="${real_dir}" --real-pattern="${real_pat}" \
324 --mc-dir="${mc_dir}" --mc-pattern="${mc_pat}" \
325 --now=${now} --url-opts="${uuopts}" ${dumpvar}
328 corrdir=${name}_corrs_${now}
329 if test "x$corrs" != "x" && test -d ${corrs} ; then
330 echo "Linking ${corrs} to ${corrdir}"
331 ln -sf $corrs ${corrdir}
332 ln -sf $corrs last_${name}_corrs
334 elif test $noact -lt 1 ; then
335 mkdir -p ${name}_acc_${now}
337 rm -f last_${name}_acc last_${name}_corrs
338 ln -sf ${name}_acc_${now} last_${name}_acc
339 ln -sf ${name}_corrs_${now} last_${name}_corrs
340 cat <<-EOF > ${corrdir}/Browse.C
343 const char* fwd = "$ALICE_ROOT/PWGLF/FORWARD/analysis2";
344 if (!gROOT->GetClass("AliOADBForward"))
345 gROOT->Macro(Form("%s/scripts/LoadLibs.C", fwd));
346 gROOT->LoadMacro(Form("%s/corrs/ForwardOADBGui.C++g", fwd));
348 AliOADBForward* db = new AliOADBForward;
349 db->Open("fmd_corrections.root", "*");
356 echo "Make acceptance corrections"
357 (cd ${name}_acc_${now} && \
358 accGen $run_for_acc && \
361 for i in fmd_corrections.root spd_corrections.root deadstrips.C ; do
362 if test ! -f ${corrdir}/$i ; then continue ; fi
363 echo "Linking ${corrdir}/$i here"
364 ln -fs ${corrdir}/$i .
367 # create index - unless there's one in the input directory - then
368 # take that and copy here
369 # [We'd like to link only, but ChainBuilder needs to be updated for that]
370 if test "x$real_dir" != x && test -f ${real_dir}/index.root ; then
372 cp ${real_dir}/index.root ${real_idx}
374 if test ! -f ${real_idx} ; then
375 index ${real_idx} ${real_dir} "${real_pat}" 0
379 # create index - unless there's one in the input directory - then
380 # take that and copy here
381 # [We'd like to link only, but ChainBuilder needs to be updated for that]
382 if test "x$real_dir" != x && test -f ${mc_dir}/index.root ; then
384 cp ${mc_dir}/index.root ${mc_idx}
386 if test ! -f ${mc_idx} ; then
387 index ${mc_idx} ${mc_dir} "${mc_pat}" 0
393 # --- Run set-ups ----------------------------------------------------
398 ${name}_mccorr_${now} \
399 ${name}_mceloss_${now} \
400 ${name}_eloss_${now} \
401 ${name}_mcaod_${now} \
403 ${name}_mcdndeta_${now} \
404 ${name}_dndeta_${now} \
405 ${name}_corrs_${now} \
411 # --- Check settings -------------------------------------------------
415 if test "x$run" = "x" || test $run -lt 1 ; then
416 echo "Run not specified, or invalid ($run)" > /dev/stderr
419 if test "X$name" = X ; then
420 echo "No name specified" > /dev/stderr
423 # if test "x$sys" = "x" ; then
424 # echo "No collision system specified" > /dev/stderr
427 # if test "x$snn" = "x" ; then
428 # echo "No center of mass energy specified" > /dev/stderr
431 # if test "x$field" = "x" ; then
432 # echo "No L3 field setting specified" > /dev/stderr
435 if test "x$real_dir" = "x" ; then
436 echo "No real data directory specified" > /dev/stderr
439 if test "x$mc_dir" = "x" ; then
440 echo "No MC data directory specified" > /dev/stderr
443 if test "x$real_pat" = "x" ; then
444 echo "No real data pattern specified" > /dev/stderr
447 if test "x$mc_pat" = "x" ; then
448 echo "No MC data pattern specified" > /dev/stderr
451 if test "X$w" != "Xsetup" && test "x$now" = "x" ; then
452 echo "No date/time specified" > /dev/stderr
455 # sys==0 is OK - autoselect
458 xpbpb|xpb-pb|xaa|xa-a) sys=2 ;;
459 xppb|xp-pb|xpa|xp-a) sys=3 ;;
462 *) echo "$0: Unknown system: $sys" ; exit 1 ;;
465 ncpu=`cat /proc/cpuinfo|sed -n 's/^processor[ \t]*: \(.*\)/\1/p'|wc -l`
466 if test "x$nwrks" = "x" || test $nwrks -lt 1 ; then
468 echo "Setting number of workers to $nwrks / $ncpu"
472 # --- Show the setup -------------------------------------------------
478 Collision system: ${sys}
479 sqrt(s_NN): ${snn}GeV
481 Real input directory: ${real_dir}
482 Real file pattern: ${real_pat}
483 MC input directory: ${mc_dir}
484 MC file pattern: ${mc_pat}
485 Real output: ${my_real_dir}
486 MC output directory: ${my_mc_dir}
487 Use PAR files: ${par}
489 Additional URL options: ${uuopts}
490 Number of workers: ${nwrks}/${ncpu}
491 Trigger efficiencies:
493 INEL>0: ${inelgt0_eff}
498 # --- Run the train --------------------------------------------------
510 uopt="mode=default&workers=${nwrks}"
520 # Default dirs are production dirs
526 *corr) cl=MakeMCCorrTrain ; mc=1 ;;
527 *eloss) cl=MakeFMDELossTrain ;;
528 *aod) cl=MakeAODTrain
529 opts="${opts} --corr=."
530 # opts="--corr=${name}_corrs_${now} --cent"
531 # if test $sys -gt 0 && test $snn -gt 0 ; then
532 # opts="$opts --sys=${sys} --snn=${snn} --field=${field}"
535 *dndeta) cl=MakedNdetaTrain
537 opts="${opts} --cut-edges"
540 opts="$opts --scheme=trigger,event,background"
541 opts="$opts --trig=INEL --trigEff=$inel_eff"
544 opts="$opts --scheme=trigger,event"
545 opts="$opts --trig=V0AND --trigEff=$nsd_eff"
548 opts="$opts --scheme=trigger,event"
549 opts="$opts --trig=INELGT0 --trigEff=$inelgt0_eff"
553 if test "x$trig" != "x" ; then
556 # Modify for input dir for our files
557 inp=$my_real_dir/AliAOD.root
558 if test $mc -gt 0 ; then
559 inp=$my_mc_dir/AliAOD.root
564 cl=MakeMultDistsTrain
566 # Modify for input dir for our files
567 inp=$my_real_dir/AliAOD.root
568 if test $mc -gt 0 ; then
569 inp=$my_mc_dir/AliAOD.root
572 *) echo "$0: Unknown type of train: $type" > /dev/stderr ; exit 1 ;;
574 if test ! -f $inp ; then
575 echo "No input for $nme, giving up" > /dev/stderr
578 # add centrality flag if we do not know what collision system we're
579 # looking at, or it's PbPb or pPb.
582 *) opts="$opts --cent" ;;
584 if test $mc -gt 0; then
587 if test $par -gt 0 ; then
590 if test x$uuopts != x ; then
591 uopt="${uopt}&${uuopts}"
593 # PROOF-lite URL form:
595 # lite://<datadir_or_list>[?<options>][#<treeName]
598 # clear=PKGS Clear packages ','-separated
599 # mc Assume simulation input
600 # mode=default|rec|sim AliROOT mode
601 # par=tasks|all Use par files
602 # pattern=GLOB File name pattern
603 # recursive Recursive scan [true]
604 # reset=soft|hard Reset cluster [hard]
605 # workers=N[x] Number of workers to use [8]
606 # wrapper=CMD Wrapper command []
608 url="lite://${inp}?${uopt}#${tree}"
609 opts="${opts} --include=$ALICE_ROOT/PWGLF/FORWARD/analysis2/trains"
610 opts="${opts} --date=${now} --class=$cl --name=$nme --verbose=0"
612 echo "Running train: runTrain ${opts} --url=${url} $@"
613 if test $noact -gt 0 ; then return ; fi
615 runTrain ${opts} --url=${url} $@
619 # === Wrappers =======================================================
620 # --- Run all correction jobs ----------------------------------------
623 allAboard mccorr "" $@
624 allAboard mceloss "" $@
625 allAboard eloss "" $@
629 if test "X$mc_dir" != "X" ; then
630 (cd ${name}_mccorr_${now} && extract_upload)
631 (cd ${name}_mceloss_${now} && extract_upload)
633 (cd ${name}_eloss_${now} && extract_upload)
634 rm -f fmd_corrections.root spd_corrections.root
635 ln -s ${name}_corrs_${now}/fmd_corrections.root .
636 ln -s ${name}_corrs_${now}/spd_corrections.root .
640 if test "X$mc_dir" != "X" ; then
641 (cd ${name}_mccorr_${now} && draw ${fwd_dir}/DrawMCCorrSummary.C)
642 (cd ${name}_mceloss_${now} && draw ${fwd_dir}/corrs/DrawCorrELoss.C 1)
644 (cd ${name}_eloss_${now} && draw ${fwd_dir}/corrs/DrawCorrELoss.C 0)
646 # --- Run all AOD jobs -----------------------------------------------
649 allAboard mcaod "" $@
654 echo "Upload does not make sense for AOD jobs"
658 (cd ${name}_mcaod_${now} && draw Summarize.C)
659 (cd ${name}_aod_${now} && draw Summarize.C)
662 # --- Run all dN/deta jobs -------------------------------------------
665 if test $sys -eq 1 ; then
666 allAboard mcdndeta inel $@
667 allAboard mcdndeta nsd $@
668 allAboard mcdndeta inelgt0 $@
669 allAboard dndeta inel $@
670 allAboard dndeta nsd $@
671 allAboard dndeta inelgt0 $@
673 allAboard mcdndeta "" $@
674 allAboard dndeta "" $@
679 echo "Upload does not make sense for dN/deta jobs"
683 if test $sys -eq 1 ; then
684 dndeta_draw ${name}_mcdndeta_inel_${now}
685 dndeta_draw ${name}_mcdndeta_nsd_${now}
686 dndeta_draw ${name}_mcdndeta_inelgt0_${now}
687 dndeta_draw ${name}_dndeta_inel_${now}
688 dndeta_draw ${name}_dndeta_nsd_${now}
689 dndeta_draw ${name}_dndeta_inelgt0_${now}
691 dndeta_draw ${name}_mcdndeta_${now}
692 dndeta_draw ${name}_dndeta_${now}
696 # --- Run all MultDists -------------------------------------------
699 allAboard mcmultdists "" $@
700 allAboard multdists "" $@
704 echo "Upload does not make sense for dN/deta jobs"
708 (cd ${name}_mcmultdists_${now} && draw Summarize.C)
709 (cd ${name}_multdists_${now} && draw Summarize.C)
712 # --- Collect PDFs ---------------------------------------------------
715 out=${name}_pdfs_${now}
718 dirs="corr eloss aod dndeta dndeta_inel dndeta_nsd dndeta_inelgt0 multdists"
719 for d in ${dirs} ; do
720 for m in "" "mc" ; do
721 dir=${name}_${m}${d}_${now}
727 if test ! -d $dir ; then
728 # echo "Directory ${dir} doesn't exist"
731 # echo "Will look in $dir"
734 corr) files="forward_mccorr.pdf" ;;
735 eloss) files="corrs*.pdf" ;;
736 aod) files="forward.pdf" ;;
737 dndeta*) files="forward_dndeta.pdf dNdeta*.pdf" ;;
738 multdists) files="forward_multdists.pdf" ;;
739 *) echo "Unknown directory type: $d" > /dev/stder
747 */forward_mccorr.pdf) tgt=summary_mccorr.pdf ;;
748 */forward.pdf) tgt=summary_${d}_${M}.pdf ;;
749 */forward_dndeta.pdf) tgt=summary_${d}_${M}.pdf ;;
750 */forward_multdists.pdf) tgt=summary_${d}_${M}.pdf ;;
751 */corr*.pdf) tgt=summary_${d}_${M}.pdf ;;
752 */dNdeta*.pdf) tgt=${d}_${M}.pdf ;;
753 *) echo "Don't know how to deal with $ff" >/dev/stderr
757 # printf "%100s -> %s\n" $ff $tgt
762 (cd ${out} && pdfjoin -q -o tmp.pdf \
763 --pdftitle "${name} summary ($now)" \
764 --twoside summary_*.pdf dndeta_*.pdf && \
765 pdfnup -q --nup 2x1 -o ${name}_summary_${now}.pdf tmp.pdf && \
767 (cd ${out} && pdfjoin -q -o tmp.pdf \
768 --pdftitle "${name} dN/deta ($now)" \
769 --twoside dndeta_*.pdf && \
770 pdfnup -q --nup 2x1 -o ${name}_dndeta_${now}.pdf tmp.pdf && \
772 echo "Made ${name}_summary_${now}.pdf and ${name}_dndeta_${now}.pdf"
774 # === Procedual code =================================================
775 # --- Source settings if found ---------------------------------------
776 if test -f $dotconf ; then
781 # --- Process command line -------------------------------------------
784 while test $# -gt 0 ; do
790 arg=`echo $1 | sed 's/=.*//'` ;
791 opt=`echo $1 | sed 's/--[^=][^=]*=//'`
796 -*) opt=$2 ; shift ;;
801 -r|--run) run=$opt ;;
802 -n|--name) name=$opt ;;
803 -S|--sys) sys=`echo $opt | tr '[A-Z]' '[a-z]'` ;;
804 -E|--snn) snn=$opt ;;
805 -F|--field) field=$opt ;;
806 -d|--real-dir) real_dir=$opt ;;
807 -p|--real-pattern) real_pat=$opt ;;
808 -D|--mc-dir) mc_dir=$opt ;;
809 -P|--mc-pattern) mc_pat=$opt ;;
810 -w|--what) what=`echo $opt | tr '[A-Z]' '[a-z]'` ;;
811 -s|--step) step=`echo $opt | tr '[A-Z]' '[a-z]'` ;;
812 -W|--workers) nwrks=${opt} ;;
813 -N|--noact) noact=1 ;;
814 -c|--corrections) corrs=$opt ;;
816 -u|--url-opts) uuopts="$opt" ;;
817 -h|--help) usage ; exit 0 ;;
818 -H|--manual) manual ; exit 0 ;;
819 -i|--inel-eff) inel_eff=$opt ;;
820 -0|--inelgt0-eff) inelgt0_eff=$opt ;;
821 -v|--nsd-eff) nsd_eff=$opt ;;
823 *) echo "$0: Unknown option $arg" ; exit 1 ;;
827 # --- Check settings -------------------------------------------------
830 # --- Select what to do ----------------------------------------------
833 setup) setup ; exit 0 ;;
834 clean) cleanup ; exit 0 ;;
837 dndeta*) func=dndetas ;;
838 multdist*)func=multdists ;;
839 collect*) func=collect ;;
840 *) echo "$0: Unknown operation: $what" > /dev/stderr ; exit 1 ;;
846 xterm*) func=${func}_terminate ;;
847 xup*) func=${func}_upload ;;
848 xdr*) func=${func}_draw ;;
849 *) echo "$0: Unknown step $step" > /dev/stderr ; exit 1 ;;
852 echo "Will execute $func"