]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGLF/FORWARD/analysis2/liteAnalysis.sh
Now use gSystem->Exec("gbbox ps -Ax > tmpfile") to work
[u/mrichter/AliRoot.git] / PWGLF / FORWARD / analysis2 / liteAnalysis.sh
1 #!/bin/bash
2
3 # BEGIN_MANUAL
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. 
9
10 # Then, one needs to run this script in set-up mode e.g., 
11
12 #   $0 --what=setup  \
13 #       --name=LHC10c \
14 #       --run=118560 \
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 
19
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.
25
26 # Note, the use of the ZIP archives root_archive.zip and the sub-part
27 # specification @AliESDs.root for MC data. 
28
29 # Next, we need to generate the corrections.  Do 
30
31 #   $0 --what=corr 
32
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
35
36 #   $0 --what=corr --step=upload 
37
38 # If you already have the corrections, you can pass the option
39 # --corrections in the setup phase and skip this step.
40
41 # Now we can submit our AOD generation jobs.  Do 
42
43 #   $0 --what=aod 
44
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
48
49 #   $0 --what=aod -- --events=100000
50
51 # Next, we need to draw the summary results
52
53 #   $0 --what=aod --step=draw 
54
55 # Now, we should do the dN/deta analysis.  Do 
56
57 #   $0 --what=dndeta
58
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
64
65 #   $0 --what=dndeta --step=draw 
66
67 # To generate the P(Nch) data, do 
68
69 #   $0 --what=multdists
70 #   $0 --what=multdists --step=draw 
71
72 # To collect all PDFs into a single directory do 
73
74 #   $0 --what=collect
75
76 # Enjoy.
77
78 # Comments, questions, bugs, flames, suggestions, etc. should be sent
79 # to Christian Holm Christensen <cholm@nbi.dk>
80
81 # END_MANUAL
82
83 run=
84 name=
85 sys=0
86 snn=0
87 field=0
88 corrs=
89 dotconf=.config
90 here=${PWD}
91 par=0
92 noact=0
93 nwrks=0
94 fwd_dir=$ALICE_ROOT/PWGLF/FORWARD/analysis2
95
96 real_dir=
97 real_pat=
98 real_idx=
99 mc_dir=
100 mc_pat=
101 mc_idx=
102 my_real_dir=
103 my_mc_dir=
104 uuopts=
105 # Latest: 0.91
106 inel_eff=1
107 # Latest: 0.94
108 nsd_eff=1
109 inelgt0_eff=1
110
111 # === Various functions ==============================================
112 # --- Usage ----------------------------------------------------------
113 usage()
114 {
115     cat <<EOF
116 Usage: $0 --what OPERATION [OPTIONS]
117
118 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 
136
137 TRAINS is one of
138
139   clean       Clean directory
140   setup       Do intial setup 
141   corrs       Generate corrections 
142   aods        Generate AODs 
143   dndeta      Generate dNdeta 
144
145 and must be executed in that order.  STEP is one of 
146
147   full        Run the analysis 
148   upload      Upload corrections (only for TRAINS=corrs)
149   draw        Draw (partial) results
150 EOF
151 }
152
153 # --- Manual ---------------------------------------------------------
154 manual()
155 {
156     prog=`basename $0`
157     grep ^# $0 | \
158         sed -n -e '/BEGIN_MANUAL/,/END_MANUAL/ p' | \
159         sed -e '/\(BEGIN\|END\)_MANUAL/ d' -e 's/^# //' \
160             -e "s,\$0,$prog,"
161 }
162
163 # === Utilities to execute scripts ===================================
164 # --- Check AliEn token ----------------------------------------------
165 check_token()
166 {
167     uid=`id -u`
168     genv_file=/tmp/gclient_env_${uid}
169     
170     if test ! -f ${genv_file} ; then 
171         echo "No such file: ${genv_file}, please do alien-token-init" \
172             >/dev/stderr
173         exit 1
174     fi
175     . ${genv_file}
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 
179         exit 1
180     fi
181 }
182 # --- Run script -----------------------------------------------------
183 script()
184 {
185     local scr=$1 ; shift 
186     local args=$1 ; shift
187     echo "Will run aliroot -l -b -q $scr($args)"
188     if test $noact -gt 0 ; then return ; fi
189     aliroot -l -b <<EOF
190 .x $scr($args)
191 .q
192 EOF
193 }
194 # --- Run acceptance generation --------------------------------------
195 accGen()
196 {
197     check_token
198     local run=$1 
199     script ${fwd_dir}/corrs/ExtractAcceptance.C "${run}"
200 }
201 # --- Create the index -----------------------------------------------
202 index()
203 {
204     local o=$1 ; shift
205     local d=$1 ; shift 
206     local p=$1 ; shift 
207     local m=$1 ; shift 
208
209     t=real
210     if test $m -gt 0 ; then 
211         t=MC
212     fi
213     if test "x$d" = "x" ;then 
214         echo "No input specified for index for $t data" > /dev/stderr 
215         return;
216     fi
217     if test ! -d $d || test ! -f $d ;then 
218         echo "Specified input for $t data is not a directory or file " \
219             > /dev/stderr 
220         return;
221     fi
222     if test $m -gt 0 ; then 
223         n="&mc"
224     fi
225     aliroot -l -b <<EOF
226 .L $ALICE_ROOT/PWGLF/FORWARD/trains/ChainBuilder.C++
227 ChainBuilder::CreateCollection("${o}", "file://${d}?recursive&scan&pattern=${p}${n}#esdTree");
228 .q
229 EOF
230     
231 }
232  
233 # --- Extract corrections --------------------------------------------
234 extract()
235 {
236     test -f .extract && return 0 
237     script Extract.C 
238     touch .extract
239 }
240 # --- Upload a file --------------------------------------------------
241 upload()
242 {
243     if test -f .upload ; then 
244         echo "Already uploaded in `basename $PWD`"
245         return 0 
246     fi
247     echo "= Uploading"
248     script Upload.C \"file://${here}/${name}_corrs_${now}/\" >/dev/null 2>&1
249     touch .upload 
250 }
251 # --- Extract and upload ---------------------------------------------
252 extract_upload()
253 {
254     extract
255     upload
256 }
257
258 # --- Draw -----------------------------------------------------------
259 draw()
260 {
261     script $@
262 }
263 dndeta_draw()
264 {
265     local d=$1 
266     echo "=== $d ================================================"
267     (cd $d && \
268         draw ${fwd_dir}/DrawdNdetaSummary.C && \
269         draw Draw.C)
270 }
271
272 # --- Get the grid home dir ------------------------------------------
273 outputs()
274 {
275     l=`pwd`
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"
280 }
281
282 # === Trains =========================================================
283 # --- Run set-ups ----------------------------------------------------
284 setup()
285 {
286     if test x$run = "x" || test $run -lt 1; then 
287         echo "No run for acceptance correction specified" > /dev/stderr 
288         exit 1
289     fi
290
291    now=`date '+%Y%m%d_%H%M'` 
292    outputs
293
294    # Write settings to a file, which we later can source 
295    dumpvar=
296    if test $par -gt 0 ; then dumpvar="--par " ; fi 
297    cat > ${dotconf} <<EOF
298 # Settings:
299 name="$name"
300 run=${run}
301 sys=$sys
302 snn=$snn
303 field=$field
304 real_dir=${real_dir}
305 real_pat=${real_pat}
306 real_idx=${real_idx}
307 mc_dir=${mc_dir}
308 mc_pat=${mc_pat}
309 mc_idx=${mc_idx}
310 my_real_dir=${my_real_dir}
311 my_mc_dir=${my_mc_dir}
312 par=${par}
313 now=${now}
314 uuopts="${uuopts}"
315 # Trigger efficiencies - edit here to set them 
316 inel_eff=$inel_eff
317 inelgt0_eff=$inelgt0_eff
318 nsd_eff=$nsd_eff
319 # Options
320 if false ; then 
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}
326 fi
327 EOF
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        
333        corrdir=$corrs
334    elif test $noact -lt 1 ; then 
335         mkdir -p ${name}_acc_${now}
336         mkdir -p ${corrdir}
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
341         TObject* Browse()
342         {
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));
347           
348           AliOADBForward* db = new AliOADBForward;
349           db->Open("fmd_corrections.root", "*");
350           
351           ForwardOADBGui(db);
352
353           return db;
354         }
355         EOF
356         echo "Make acceptance corrections" 
357         (cd ${name}_acc_${now} && \
358             accGen $run_for_acc && \
359             upload )
360    fi
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 . 
365    done
366
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 
371        rm -f ${real_idx}
372        cp ${real_dir}/index.root ${real_idx} 
373    else
374        if test ! -f ${real_idx} ; then 
375            index ${real_idx} ${real_dir} "${real_pat}" 0
376        fi
377    fi
378
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 
383        rm -f ${mc_idx}
384        cp ${mc_dir}/index.root ${mc_idx}
385    else
386        if test ! -f ${mc_idx} ; then 
387            index ${mc_idx} ${mc_dir} "${mc_pat}" 0
388        fi
389    fi
390
391 }    
392
393 # --- Run set-ups ----------------------------------------------------
394 cleanup()
395 {
396     rm -rf \
397         ${name}_acc_${now} \
398         ${name}_mccorr_${now} \
399         ${name}_mceloss_${now} \
400         ${name}_eloss_${now} \
401         ${name}_mcaod_${now} \
402         ${name}_aod_${now} \
403         ${name}_mcdndeta_${now} \
404         ${name}_dndeta_${now} \
405         ${name}_corrs_${now} \
406         ${real_idx} \
407         ${mc_idx} 
408 }
409
410
411 # --- Check settings -------------------------------------------------
412 check()
413 {
414     local w=$1
415     if test "x$run" = "x" || test $run -lt 1 ; then 
416         echo "Run not specified, or invalid ($run)" > /dev/stderr 
417         exit 1
418     fi
419     if test "X$name" = X ; then 
420         echo "No name specified" > /dev/stderr 
421         exit 1
422     fi
423     # if test "x$sys" = "x" ; then 
424     #     echo "No collision system specified" > /dev/stderr 
425     #     exit 1
426     # fi
427     # if test "x$snn" = "x" ; then 
428     #     echo "No center of mass energy specified" > /dev/stderr 
429     #     exit 1
430     # fi
431     # if test "x$field" = "x" ; then 
432     #     echo "No L3 field setting specified" > /dev/stderr 
433     #     exit 1
434     # fi
435     if test "x$real_dir" = "x" ; then 
436         echo "No real data directory specified" > /dev/stderr 
437         exit 1
438     fi
439     if test "x$mc_dir" = "x" ; then 
440         echo "No MC data directory specified" > /dev/stderr 
441         # exit 1
442     fi
443     if test "x$real_pat" = "x" ; then 
444         echo "No real data pattern specified" > /dev/stderr 
445         exit 1
446     fi
447     if test "x$mc_pat" = "x" ; then 
448         echo "No MC data pattern specified" > /dev/stderr 
449         # exit 1
450     fi
451     if test "X$w" != "Xsetup" && test "x$now" = "x" ; then 
452         echo "No date/time specified" > /dev/stderr 
453         exit 1
454     fi
455     # sys==0 is OK - autoselect
456     case x$sys in 
457         xpp|xp-p)              sys=1 ;; 
458         xpbpb|xpb-pb|xaa|xa-a) sys=2 ;; 
459         xppb|xp-pb|xpa|xp-a)   sys=3 ;;
460         x0|x1|x2|x3)                 ;; 
461         x)                     sys=0 ;;
462         *) echo "$0: Unknown system: $sys" ; exit 1 ;;
463     esac
464     
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 
467         let nwrks=7*$ncpu/10
468         echo "Setting number of workers to $nwrks / $ncpu"
469     fi
470 }
471
472 # --- Show the setup -------------------------------------------------
473 print_setup()
474 {
475     cat <<EOF
476 Name:                   ${name}
477 Run:                    ${run}
478 Collision system:       ${sys}
479 sqrt(s_NN):             ${snn}GeV
480 L3 Field:               ${field}kG
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}
488 Date & time:            ${now}
489 Additional URL options: ${uuopts}
490 Number of workers:      ${nwrks}/${ncpu}
491 Trigger efficiencies:   
492   INEL:                 ${inel_eff}
493   INEL>0:               ${inelgt0_eff}
494   NSD:                  ${nsd_eff}
495 EOF
496 }
497
498 # --- Run the train --------------------------------------------------
499 # Usage:
500
501 allAboard()
502 {
503     type=$1 ; shift 
504     trig=$1 ; shift
505     cl=
506     nme=${name}_${type}
507     tree=esdTree
508     opts=""
509     # opts="--batch"
510     uopt="mode=default&workers=${nwrks}"
511     mc=0
512     inp=${real_idx}
513     # dir=$real_dir
514     # pat=$real_pat
515     rl=$runs
516
517     case $type in 
518         mc*) 
519             mc=1  
520             # Default dirs are production dirs 
521             inp=${mc_idx}
522             ;;
523         *) ;;
524     esac
525     case $type in 
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}"
533             # fi
534             ;;
535         *dndeta) cl=MakedNdetaTrain 
536             tree=aodTree 
537             opts="${opts} --cut-edges"
538             case x$trig in 
539                 xinel)    
540                     opts="$opts --scheme=trigger,event,background" 
541                     opts="$opts --trig=INEL --trigEff=$inel_eff" 
542                     ;;
543                 xnsd)     
544                     opts="$opts --scheme=trigger,event"
545                     opts="$opts --trig=V0AND --trigEff=$nsd_eff"
546                     ;;
547                 xinelgt0) 
548                     opts="$opts --scheme=trigger,event"
549                     opts="$opts --trig=INELGT0 --trigEff=$inelgt0_eff"
550                     ;;
551                 x*) trig= ;;
552             esac
553             if test "x$trig" != "x" ; then 
554                 nme="${nme}_${trig}"
555             fi
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
560                 opts="$opts --mc"
561             fi
562             ;;
563         *multdists) 
564             cl=MakeMultDistsTrain 
565             tree=aodTree 
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
570             fi
571             ;;
572         *) echo "$0: Unknown type of train: $type" > /dev/stderr ; exit 1 ;;
573     esac
574     if test ! -f $inp ; then 
575         echo "No input for $nme, giving up" > /dev/stderr 
576         return 
577     fi
578     # add centrality flag if we do not know what collision system we're 
579     # looking at, or it's PbPb or pPb. 
580     case $sys in 
581         1)                     ;;
582         *) opts="$opts --cent" ;; 
583     esac
584     if test $mc -gt 0; then 
585         uopt="${uopt}&mc"
586     fi
587     if test $par -gt 0 ; then 
588         uopt="${uopt}&par"
589     fi
590     if test x$uuopts != x ; then 
591         uopt="${uopt}&${uuopts}"
592     fi
593     # PROOF-lite URL form:
594     # 
595     #  lite://<datadir_or_list>[?<options>][#<treeName]
596     # 
597     # Options:
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 []
607
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"
611     
612     echo "Running train: runTrain ${opts} --url=${url} $@" 
613     if test $noact -gt 0 ; then return ; fi
614
615     runTrain ${opts} --url=${url} $@ 
616 }
617
618
619 # === Wrappers =======================================================
620 # --- Run all correction jobs ----------------------------------------
621 corrs()
622 {
623     allAboard mccorr "" $@
624     allAboard mceloss "" $@
625     allAboard eloss "" $@
626 }
627 corrs_upload() 
628 {
629     if test "X$mc_dir" != "X" ; then 
630         (cd ${name}_mccorr_${now}  && extract_upload)
631         (cd ${name}_mceloss_${now} && extract_upload)
632     fi
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 .
637 }
638 corrs_draw()
639 {
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)
643     fi
644     (cd ${name}_eloss_${now}   && draw ${fwd_dir}/corrs/DrawCorrELoss.C 0)
645 }
646 # --- Run all AOD jobs -----------------------------------------------
647 aods()
648 {
649     allAboard mcaod "" $@
650     allAboard aod "" $@
651 }
652 aods_upload()
653 {
654     echo "Upload does not make sense for AOD jobs"
655 }
656 aods_draw() 
657 {
658     (cd ${name}_mcaod_${now} && draw Summarize.C)
659     (cd ${name}_aod_${now}   && draw Summarize.C)
660 }
661
662 # --- Run all dN/deta jobs -------------------------------------------
663 dndetas()
664 {
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 $@
672     else
673         allAboard mcdndeta "" $@
674         allAboard dndeta   "" $@
675     fi
676 }
677 dndetas_upload()
678 {
679     echo "Upload does not make sense for dN/deta jobs"
680 }
681 dndetas_draw() 
682 {
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} 
690     else
691         dndeta_draw ${name}_mcdndeta_${now}
692         dndeta_draw ${name}_dndeta_${now} 
693     fi
694 }
695
696 # --- Run all MultDists -------------------------------------------
697 multdists()
698 {
699     allAboard mcmultdists "" $@
700     allAboard multdists   "" $@
701 }
702 multdists_upload()
703 {
704     echo "Upload does not make sense for dN/deta jobs"
705 }
706 multdists_draw() 
707 {
708     (cd ${name}_mcmultdists_${now} && draw Summarize.C)
709     (cd ${name}_multdists_${now}   && draw Summarize.C)
710 }
711
712 # --- Collect PDFs ---------------------------------------------------
713 collect()
714 {
715     out=${name}_pdfs_${now}
716     rm -rf $out
717     mkdir -p ${out}
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}
722             M=
723             case x$m in 
724                 x)   M=real ;; 
725                 xmc) M=simu ;;
726             esac
727             if test ! -d $dir ; then 
728                 # echo "Directory ${dir} doesn't exist"
729                 continue
730             fi
731             # echo "Will look in $dir"
732             files=
733             case $d in 
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 
740                     continue 
741                     ;;
742             esac
743             for f in $files ; do 
744                 ff=$dir/$f
745                 tgt=
746                 case $ff in 
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 
754                         continue
755                         ;;
756                 esac
757                 # printf "%100s -> %s\n" $ff $tgt
758                 cp $ff $out/$tgt
759             done
760         done
761     done 
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 && \
766         rm -f 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 && \
771         rm -f tmp.pdf)
772     echo "Made ${name}_summary_${now}.pdf and ${name}_dndeta_${now}.pdf"
773 }
774 # === Procedual code =================================================
775 # --- Source settings if found ---------------------------------------
776 if test -f $dotconf ; then 
777     source $dotconf 
778 fi
779
780
781 # --- Process command line -------------------------------------------
782 what=
783 step=
784 while test $# -gt 0 ; do
785     arg=$1 
786     opt=
787     case $1 in 
788         --) shift ; break ;;
789         --*=*) 
790             arg=`echo $1 | sed 's/=.*//'` ;
791             opt=`echo $1 | sed 's/--[^=][^=]*=//'` 
792             ;;
793         --*)
794             ;;
795         -h|-N|-H|-a) ;;
796         -*) opt=$2 ; shift ;; 
797     esac
798     shift 
799
800     case $arg in 
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    ;;
815         -a|--par)          par=1         ;;
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 ;;
822         --)                break ;;
823         *) echo "$0: Unknown option $arg"  ; exit 1 ;; 
824     esac
825 done 
826
827 # --- Check settings -------------------------------------------------
828 check $what
829
830 # --- Select what to do ----------------------------------------------
831 func=
832 case $what in 
833     setup)    setup ; exit 0 ;; 
834     clean)    cleanup ; exit 0 ;;
835     corr*)    func=corrs;; 
836     aod*)     func=aods ;; 
837     dndeta*)  func=dndetas ;; 
838     multdist*)func=multdists ;;
839     collect*) func=collect ;;
840     *) echo "$0: Unknown operation: $what" > /dev/stderr ; exit 1 ;;
841 esac
842 print_setup
843
844 case x$step in 
845     x|xfull) ;; 
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 ;;
850 esac
851
852 echo "Will execute $func" 
853 $func $@ 
854
855 #
856 # EOF
857 #
858