]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGLF/FORWARD/analysis2/liteAnalysis.sh
Achieved a factor 2-3 speed-up of the AOD filtering.
[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=ALIEN_DIR   Directory holding real data ($real_dir)
125   -p,--real-pattern=PATTERN Glob pattern to match when searching ($real_pat)
126   -D,--mc-dir=ALIEN_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     if test $m -gt 0 ; then 
210         n="&mc"
211     fi
212     aliroot -l -b <<EOF
213 .L $ALICE_ROOT/PWGLF/FORWARD/trains/ChainBuilder.C++
214 ChainBuilder::CreateCollection("${o}", "file://${d}?recursive&scan&pattern=${p}${n}#esdTree");
215 .q
216 EOF
217     
218 }
219  
220 # --- Extract corrections --------------------------------------------
221 extract()
222 {
223     test -f .extract && return 0 
224     script Extract.C 
225     touch .extract
226 }
227 # --- Upload a file --------------------------------------------------
228 upload()
229 {
230     if test -f .upload ; then 
231         echo "Already uploaded in `basename $PWD`"
232         return 0 
233     fi
234     echo "= Uploading"
235     script Upload.C \"file://${here}/${name}_corrs_${now}/\" >/dev/null 2>&1
236     touch .upload 
237 }
238 # --- Extract and upload ---------------------------------------------
239 extract_upload()
240 {
241     extract
242     upload
243 }
244
245 # --- Draw -----------------------------------------------------------
246 draw()
247 {
248     script $@
249 }
250 dndeta_draw()
251 {
252     local d=$1 
253     echo "=== $d ================================================"
254     (cd $d && \
255         draw ${fwd_dir}/DrawdNdetaSummary.C && \
256         draw Draw.C)
257 }
258
259 # --- Get the grid home dir ------------------------------------------
260 outputs()
261 {
262     l=`pwd`
263     my_real_dir="$l/${name}_aod_${now}"
264     my_mc_dir="$l/${name}_mcaod_${now}"
265     real_idx="$l/${name}_index_${now}.root"
266     mc_idx="$l/${name}_mcindex_${now}.root"
267 }
268
269 # === Trains =========================================================
270 # --- Run set-ups ----------------------------------------------------
271 setup()
272 {
273     if test x$run = "x" || test $run -lt 1; then 
274         echo "No run for acceptance correction specified" > /dev/stderr 
275         exit 1
276     fi
277
278    now=`date '+%Y%m%d_%H%M'` 
279    outputs
280
281    # Write settings to a file, which we later can source 
282    dumpvar=
283    if test $par -gt 0 ; then dumpvar="--par " ; fi 
284    cat > ${dotconf} <<EOF
285 # Settings:
286 name="$name"
287 run=${run}
288 sys=$sys
289 snn=$snn
290 field=$field
291 real_dir=${real_dir}
292 real_pat=${real_pat}
293 real_idx=${real_idx}
294 mc_dir=${mc_dir}
295 mc_pat=${mc_pat}
296 mc_idx=${mc_idx}
297 my_real_dir=${my_real_dir}
298 my_mc_dir=${my_mc_dir}
299 par=${par}
300 now=${now}
301 uuopts="${uuopts}"
302 # Trigger efficiencies - edit here to set them 
303 inel_eff=$inel_eff
304 inelgt0_eff=$inelgt0_eff
305 nsd_eff=$nsd_eff
306 # Options
307 if false ; then 
308   $0 --what=setup --name="$name" --run="$run" \
309   --sys="$sys" --snn="$snn" --field="$field" \
310   --real-dir="${real_dir}" --real-pattern="${real_pat}" \
311   --mc-dir="${mc_dir}" --mc-pattern="${mc_pat}" \
312   --now=${now} --url-opts="${uuopts}" ${dumpvar}
313 fi
314 EOF
315    corrdir=${name}_corrs_${now}
316    if test "x$corrs" != "x" && test -d ${corrs} ; then 
317        echo "Linking ${corrs} to ${corrdir}"
318        ln -sf $corrs ${corrdir}
319        ln -sf $corrs last_${name}_corrs        
320        corrdir=$corrs
321    elif test $noact -lt 1 ; then 
322         mkdir -p ${name}_acc_${now}
323         mkdir -p ${corrdir}
324         rm -f last_${name}_acc last_${name}_corrs
325         ln -sf ${name}_acc_${now} last_${name}_acc
326         ln -sf ${name}_corrs_${now} last_${name}_corrs
327         cat <<-EOF > ${corrdir}/Browse.C
328         TObject* Browse()
329         {
330           const char* fwd = "$ALICE_ROOT/PWGLF/FORWARD/analysis2";
331           if (!gROOT->GetClass("AliOADBForward"))
332             gROOT->Macro(Form("%s/scripts/LoadLibs.C", fwd));
333           gROOT->LoadMacro(Form("%s/corrs/ForwardOADBGui.C++g", fwd));
334           
335           AliOADBForward* db = new AliOADBForward;
336           db->Open("fmd_corrections.root", "*");
337           
338           ForwardOADBGui(db);
339
340           return db;
341         }
342         EOF
343         echo "Make acceptance corrections" 
344         (cd ${name}_acc_${now} && \
345             accGen $run_for_acc && \
346             upload )
347    fi
348    for i in fmd_corrections.root spd_corrections.root deadstrips.C ; do 
349        if test ! -f ${corrdir}/$i ; then continue ; fi 
350        echo "Linking ${corrdir}/$i here"
351        ln -fs ${corrdir}/$i . 
352    done
353
354    # create index - unless there's one in the input directory - then 
355    # take that and link here 
356    if test -f ${real_dir}/index.root ; then 
357        ln -fs ${real_dir}/index.root ${real_idx} 
358    else
359        if test ! -f ${real_idx} ; then 
360            index ${real_idx} ${real_dir} "${real_pat}" 0
361        fi
362    fi
363
364    # create index - unless there's one in the input directory - then 
365    # take that and link here 
366    if test -f ${mc_dir}/index.root ; then 
367        ln -fs ${mc_dir}/index.root ${mc_idx}
368    else
369        if test ! -f ${mc_idx} ; then 
370            index ${mc_idx} ${mc_dir} "${mc_pat}" 0
371        fi
372    fi
373
374 }    
375
376 # --- Run set-ups ----------------------------------------------------
377 cleanup()
378 {
379     rm -rf \
380         ${name}_acc_${now} \
381         ${name}_mccorr_${now} \
382         ${name}_mceloss_${now} \
383         ${name}_eloss_${now} \
384         ${name}_mcaod_${now} \
385         ${name}_aod_${now} \
386         ${name}_mcdndeta_${now} \
387         ${name}_dndeta_${now} \
388         ${name}_corrs_${now} \
389         ${real_idx} \
390         ${mc_idx} 
391 }
392
393
394 # --- Check settings -------------------------------------------------
395 check()
396 {
397     local w=$1
398     if test "x$run" = "x" || test $run -lt 1 ; then 
399         echo "Run not specified, or invalid ($run)" > /dev/stderr 
400         exit 1
401     fi
402     if test "X$name" = X ; then 
403         echo "No name specified" > /dev/stderr 
404         exit 1
405     fi
406     # if test "x$sys" = "x" ; then 
407     #     echo "No collision system specified" > /dev/stderr 
408     #     exit 1
409     # fi
410     # if test "x$snn" = "x" ; then 
411     #     echo "No center of mass energy specified" > /dev/stderr 
412     #     exit 1
413     # fi
414     # if test "x$field" = "x" ; then 
415     #     echo "No L3 field setting specified" > /dev/stderr 
416     #     exit 1
417     # fi
418     if test "x$real_dir" = "x" ; then 
419         echo "No real data directory specified" > /dev/stderr 
420         exit 1
421     fi
422     if test "x$mc_dir" = "x" ; then 
423         echo "No MC data directory specified" > /dev/stderr 
424         exit 1
425     fi
426     if test "x$real_pat" = "x" ; then 
427         echo "No real data pattern specified" > /dev/stderr 
428         exit 1
429     fi
430     if test "x$mc_pat" = "x" ; then 
431         echo "No MC data pattern specified" > /dev/stderr 
432         exit 1
433     fi
434     if test "X$w" != "Xsetup" && test "x$now" = "x" ; then 
435         echo "No date/time specified" > /dev/stderr 
436         exit 1
437     fi
438     # sys==0 is OK - autoselect
439     case x$sys in 
440         xpp|xp-p)              sys=1 ;; 
441         xpbpb|xpb-pb|xaa|xa-a) sys=2 ;; 
442         xppb|xp-pb|xpa|xp-a)   sys=3 ;;
443         x0|x1|x2|x3)                 ;; 
444         x)                     sys=0 ;;
445         *) echo "$0: Unknown system: $sys" ; exit 1 ;;
446     esac
447     
448     ncpu=`cat /proc/cpuinfo|sed -n 's/^processor[ \t]*: \(.*\)/\1/p'|wc -l`
449     if test "x$nwrks" = "x" || test $nwrks -lt 1 ; then 
450         let nwrks=7*$ncpu/10
451         echo "Setting number of workers to $nwrks / $ncpu"
452     fi
453 }
454
455 # --- Show the setup -------------------------------------------------
456 print_setup()
457 {
458     cat <<EOF
459 Name:                   $name
460 Run:                    ${run}
461 Collision system:       $sys
462 sqrt(s_NN):             ${snn}GeV
463 L3 Field:               ${field}kG
464 Real input directory:   ${real_dir}
465 Real file pattern:      ${real_pat}
466 MC input directory:     ${mc_dir}
467 MC file pattern:        ${mc_pat}
468 Real output:            ${my_real_dir}
469 MC output directory:    ${my_mc_dir}
470 Use PAR files:          ${par}
471 Date & time:            ${now}
472 Additional URL options: ${uuopts}
473 Number of workers:      ${nwrks}/${ncpu}
474 EOF
475 }
476
477 # --- Run the train --------------------------------------------------
478 # Usage:
479
480 allAboard()
481 {
482     type=$1 ; shift 
483     trig=$1 ; shift
484     cl=
485     nme=${name}_${type}
486     tree=esdTree
487     opts=""
488     # opts="--batch"
489     uopt="mode=default&workers=${nwrks}"
490     mc=0
491     inp=${real_idx}
492     # dir=$real_dir
493     # pat=$real_pat
494     rl=$runs
495
496     case $type in 
497         mc*) 
498             mc=1  
499             # Default dirs are production dirs 
500             inp=${mc_idx}
501             ;;
502         *) ;;
503     esac
504     case $type in 
505         *corr)  cl=MakeMCCorrTrain ; mc=1 ;;
506         *eloss) cl=MakeFMDELossTrain ;;  
507         *aod)   cl=MakeAODTrain 
508             opts="${opts} --corr=."
509             # opts="--corr=${name}_corrs_${now} --cent"
510             # if test $sys -gt 0 && test $snn -gt 0 ; then 
511             #   opts="$opts --sys=${sys} --snn=${snn} --field=${field}"
512             # fi
513             ;;
514         *dndeta) cl=MakedNdetaTrain 
515             tree=aodTree 
516             opts="${opts} --cut-edges"
517             case x$trig in 
518                 xinel)    
519                     opts="$opts --scheme=trigger,event,background" 
520                     opts="$opts --trig=INEL" 
521                     ;;
522                 xnsd)     
523                     opts="$opts --scheme=trigger,event"
524                     opts="$opts --trig=V0AND"
525                     ;;
526                 xinelgt0) 
527                     opts="$opts --scheme=trigger,event"
528                     opts="$opts --trig=INELGT0"
529                     ;;
530                 x*) trig= ;;
531             esac
532             if test "x$trig" != "x" ; then 
533                 nme="${nme}_${trig}"
534             fi
535             # Modify for input dir for our files
536             inp=$my_real_dir/AliAOD.root
537             if test $mc -gt 0 ; then 
538                 inp=$my_mc_dir/AliAOD.root
539                 opts="$opts --mc"
540             fi
541             ;;
542         *multdists) 
543             cl=MakeMultDistsTrain 
544             tree=aodTree 
545             # Modify for input dir for our files
546             inp=$my_real_dir/AliAOD.root
547             if test $mc -gt 0 ; then 
548                 inp=$my_mc_dir/AliAOD.root
549             fi
550             ;;
551         *) echo "$0: Unknown type of train: $type" > /dev/stderr ; exit 1 ;;
552     esac
553     # add centrality flag if we do not know what collision system we're 
554     # looking at, or it's PbPb or pPb. 
555     case $sys in 
556         0|2|3) opts="$opts --cent" ;; 
557         1)                         ;;
558     esac
559     if test $mc -gt 0; then 
560         uopt="${uopt}&mc"
561     fi
562     if test $par -gt 0 ; then 
563         uopt="${uopt}&par"
564     fi
565     if test x$uuopts != x ; then 
566         uopt="${uopt}&${uuopts}"
567     fi
568     # PROOF-lite URL form:
569     # 
570     #  lite://<datadir_or_list>[?<options>][#<treeName]
571     # 
572     # Options:
573     #  clear=PKGS                 Clear packages ','-separated
574     #  mc                         Assume simulation input
575     #  mode=default|rec|sim       AliROOT mode 
576     #  par=tasks|all              Use par files 
577     #  pattern=GLOB               File name pattern 
578     #  recursive                  Recursive scan [true]
579     #  reset=soft|hard            Reset cluster [hard]
580     #  workers=N[x]               Number of workers to use [8]
581     #  wrapper=CMD                Wrapper command []
582
583     url="lite://${inp}?${uopt}#${tree}"
584     opts="${opts} --include=$ALICE_ROOT/PWGLF/FORWARD/analysis2/trains"
585     opts="${opts} --date=${now} --class=$cl --name=$nme --verbose=0"
586     
587     echo "Running train: runTrain ${opts} --url=${url} $@" 
588     if test $noact -gt 0 ; then return ; fi
589
590     runTrain ${opts} --url=${url} $@ 
591 }
592
593
594 # === Wrappers =======================================================
595 # --- Run all correction jobs ----------------------------------------
596 corrs()
597 {
598     allAboard mccorr "" $@
599     allAboard mceloss "" $@
600     allAboard eloss "" $@
601 }
602 corrs_upload() 
603 {
604     (cd ${name}_mccorr_${now}  && extract_upload)
605     (cd ${name}_mceloss_${now} && extract_upload)
606     (cd ${name}_eloss_${now}   && extract_upload)
607     rm -f fmd_corrections.root spd_corrections.root 
608     ln -s ${name}_corrs_${now}/fmd_corrections.root .
609     ln -s ${name}_corrs_${now}/spd_corrections.root .
610 }
611 corrs_draw()
612 {
613     (cd ${name}_mccorr_${now}  && draw ${fwd_dir}/DrawMCCorrSummary.C)
614     (cd ${name}_mceloss_${now} && draw ${fwd_dir}/corrs/DrawCorrELoss.C 1)
615     (cd ${name}_eloss_${now}   && draw ${fwd_dir}/corrs/DrawCorrELoss.C 0)
616 }
617 # --- Run all AOD jobs -----------------------------------------------
618 aods()
619 {
620     allAboard mcaod "" $@
621     allAboard aod "" $@
622 }
623 aods_upload()
624 {
625     echo "Upload does not make sense for AOD jobs"
626 }
627 aods_draw() 
628 {
629     (cd ${name}_mcaod_${now} && draw Summarize.C)
630     (cd ${name}_aod_${now}   && draw Summarize.C)
631 }
632
633 # --- Run all dN/deta jobs -------------------------------------------
634 dndetas()
635 {
636     if test $sys -eq 1 ; then 
637         allAboard mcdndeta inel    $@
638         allAboard mcdndeta nsd     $@
639         allAboard mcdndeta inelgt0 $@
640         allAboard dndeta   inel    $@
641         allAboard dndeta   nsd     $@
642         allAboard dndeta   inelgt0 $@
643     else
644         allAboard mcdndeta "" $@
645         allAboard dndeta   "" $@
646     fi
647 }
648 dndetas_upload()
649 {
650     echo "Upload does not make sense for dN/deta jobs"
651 }
652 dndetas_draw() 
653 {
654     if test $sys -eq 1 ; then 
655         dndeta_draw ${name}_mcdndeta_inel_${now}
656         dndeta_draw ${name}_mcdndeta_nsd_${now}
657         dndeta_draw ${name}_mcdndeta_inelgt0_${now}
658         dndeta_draw ${name}_dndeta_inel_${now} 
659         dndeta_draw ${name}_dndeta_nsd_${now} 
660         dndeta_draw ${name}_dndeta_inelgt0_${now} 
661     else
662         dndeta_draw ${name}_mcdndeta_${now}
663         dndeta_draw ${name}_dndeta_${now} 
664     fi
665 }
666
667 # --- Run all MultDists -------------------------------------------
668 multdists()
669 {
670     allAboard mcmultdists "" $@
671     allAboard multdists   "" $@
672 }
673 multdists_upload()
674 {
675     echo "Upload does not make sense for dN/deta jobs"
676 }
677 multdists_draw() 
678 {
679     (cd ${name}_mcmultdists_${now} && draw Summarize.C)
680     (cd ${name}_multdists_${now}   && draw Summarize.C)
681 }
682
683 # --- Collect PDFs ---------------------------------------------------
684 collect()
685 {
686     out=${name}_pdfs_${now}
687     rm -rf $out
688     mkdir -p ${out}
689     dirs="corr eloss aod dndeta dndeta_inel dndeta_nsd dndeta_inelgt0 multdists"
690     for d in ${dirs} ; do 
691         for m in "" "mc" ; do 
692             dir=${name}_${m}${d}_${now}
693             M=
694             case x$m in 
695                 x)   M=real ;; 
696                 xmc) M=simu ;;
697             esac
698             if test ! -d $dir ; then 
699                 # echo "Directory ${dir} doesn't exist"
700                 continue
701             fi
702             # echo "Will look in $dir"
703             files=
704             case $d in 
705                 corr)      files="forward_mccorr.pdf" ;; 
706                 eloss)     files="corrs*.pdf" ;; 
707                 aod)       files="forward.pdf" ;; 
708                 dndeta*)   files="forward_dndeta.pdf dndeta*.pdf" ;; 
709                 multdists) files="forward_multdists.pdf" ;;
710                 *) echo "Unknown directory type: $d" > /dev/stder 
711                     continue 
712                     ;;
713             esac
714             for f in $files ; do 
715                 ff=$dir/$f
716                 tgt=
717                 case $ff in 
718                     */forward_mccorr.pdf)    tgt=summary_mccorr.pdf ;; 
719                     */forward.pdf)           tgt=summary_${d}_${M}.pdf ;; 
720                     */forward_dndeta.pdf)    tgt=summary_${d}_${M}.pdf ;; 
721                     */forward_multdists.pdf) tgt=summary_${d}_${M}.pdf ;; 
722                     */corr*.pdf)             tgt=summary_${d}_${M}.pdf ;; 
723                     */dndeta*.pdf)           tgt=${d}_${M}.pdf ;;
724                     *) echo "Don't know how to deal with $ff" >/dev/stderr 
725                         continue
726                         ;;
727                 esac
728                 # printf "%100s -> %s\n" $ff $tgt
729                 cp $ff $out/$tgt
730             done
731         done
732     done 
733     (cd ${out} && pdfjoin -q -o tmp.pdf \
734         --pdftitle "${name} summary ($now)" \
735         --twoside summary_*.pdf dndeta_*.pdf && \
736         pdfnup -q --nup 2x1 -o ${name}_summary_${now}.pdf tmp.pdf && \
737         rm -f tmp.pdf)
738     (cd ${out} && pdfjoin -q -o tmp.pdf \
739         --pdftitle "${name} dN/deta ($now)" \
740         --twoside dndeta_*.pdf && \
741         pdfnup -q --nup 2x1 -o ${name}_dndeta_${now}.pdf tmp.pdf && \
742         rm -f tmp.pdf)
743     echo "Made ${name}_summary_${now}.pdf and ${name}_dndeta_${now}.pdf"
744 }
745 # === Procedual code =================================================
746 # --- Source settings if found ---------------------------------------
747 if test -f $dotconf ; then 
748     source $dotconf 
749 fi
750
751
752 # --- Process command line -------------------------------------------
753 what=
754 step=
755 while test $# -gt 0 ; do
756     arg=$1 
757     opt=
758     case $1 in 
759         --) shift ; break ;;
760         --*=*) 
761             arg=`echo $1 | sed 's/=.*//'` ;
762             opt=`echo $1 | sed 's/--[^=][^=]*=//'` 
763             ;;
764         --*)
765             ;;
766         -h|-N|-H|-a) ;;
767         -*) opt=$2 ; shift ;; 
768     esac
769     shift 
770
771     case $arg in 
772         -r|--run)          run=$opt      ;; 
773         -n|--name)         name=$opt     ;; 
774         -S|--sys)          sys=`echo $opt | tr '[A-Z]' '[a-z]'` ;;
775         -E|--snn)          snn=$opt      ;; 
776         -F|--field)        field=$opt    ;;
777         -d|--real-dir)     real_dir=$opt ;;
778         -p|--real-pattern) real_pat=$opt ;; 
779         -D|--mc-dir)       mc_dir=$opt   ;; 
780         -P|--mc-pattern)   mc_pat=$opt   ;; 
781         -w|--what)         what=`echo $opt | tr '[A-Z]' '[a-z]'`  ;; 
782         -s|--step)         step=`echo $opt | tr '[A-Z]' '[a-z]'`  ;; 
783         -W|--workers)      nwrks=${opt}  ;;
784         -N|--noact)        noact=1       ;;
785         -c|--corrections)  corrs=$opt    ;;
786         -a|--par)          par=1         ;;
787         -u|--url-opts)     uuopts="$opt" ;;
788         -h|--help)         usage         ; exit 0 ;; 
789         -H|--manual)       manual        ; exit 0 ;;
790         --)                break ;;
791         *) echo "$0: Unknown option $arg"  ; exit 1 ;; 
792     esac
793 done 
794
795 # --- Check settings -------------------------------------------------
796 check $what
797
798 # --- Select what to do ----------------------------------------------
799 func=
800 case $what in 
801     setup)    setup ; exit 0 ;; 
802     clean)    cleanup ; exit 0 ;;
803     corr*)    func=corrs;; 
804     aod*)     func=aods ;; 
805     dndeta*)  func=dndetas ;; 
806     multdist*)func=multdists ;;
807     collect*) func=collect ;;
808     *) echo "$0: Unknown operation: $what" > /dev/stderr ; exit 1 ;;
809 esac
810 print_setup
811
812 case x$step in 
813     x|xfull) ;; 
814     xterm*) func=${func}_terminate ;; 
815     xup*)   func=${func}_upload ;; 
816     xdr*)   func=${func}_draw ;;
817     *) echo "$0: Unknown step $step" > /dev/stderr ; exit 1 ;;
818 esac
819
820 echo "Will execute $func" 
821 $func $@ 
822
823 #
824 # EOF
825 #
826