]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGLF/FORWARD/analysis2/baseAnalysis.sh
Major refactoring of the code.
[u/mrichter/AliRoot.git] / PWGLF / FORWARD / analysis2 / baseAnalysis.sh
1 #
2 # This file contain common functions used by liteAnalysis.sh,
3 # gridAnalysis.sh, etc. 
4 #
5
6 # === Variables ======================================================
7 fwd_dir=$ALICE_ROOT/PWGLF/FORWARD/analysis2
8 dotconf=.config
9 here=${PWD}
10 name=
11 now=
12 sys=0
13 snn=0
14 field=0
15 corrs=
16 noact=0
17 uuopts=
18 # Latest: 0.91
19 inel_eff=1
20 # Latest: 0.94
21 nsd_eff=1
22 inelgt0_eff=1
23
24 # === Misc. ==========================================================
25 dummy()
26 {
27     local f=$1 
28     echo "$f: Dummy function. Please implement in $0" > /dev/stderr 
29     exit 1
30 }
31
32 # --- Manual ---------------------------------------------------------
33 manual()
34 {
35     prog=`basename $0`
36     grep ^# $0 | \
37         sed -n -e '/BEGIN_MANUAL/,/END_MANUAL/ p' | \
38         sed -e '/\(BEGIN\|END\)_MANUAL/ d' -e 's/^# //' \
39             -e "s,\$0,$prog,"
40 }
41 # --- Check AliEn token ----------------------------------------------
42 check_token()
43 {
44     uid=`id -u`
45     genv_file=/tmp/gclient_env_${uid}
46     
47     if test ! -f ${genv_file} ; then 
48         echo "No such file: ${genv_file}, please do alien-token-init" \
49             >/dev/stderr
50         exit 1
51     fi
52     . ${genv_file}
53     alien-token-info | grep -q "Token is still valid"
54     if test $? -ne 0 ; then 
55         echo "Token not valid, please re-new" > /dev/stderr 
56         exit 1
57     fi
58 }
59
60 # === Utilities to execute scripts ===================================
61 # --- Run script -----------------------------------------------------
62 script()
63 {
64     local scr=$1 ; shift 
65     local args=$1 ; shift
66     echo "Will run aliroot -l -b -q $scr($args)"
67     if test $noact -gt 0 ; then return ; fi
68     aliroot -l -b <<-EOF
69         .x $scr($args)
70         .q
71         EOF
72 }
73 # --- Extract corrections --------------------------------------------
74 terminate()
75 {
76     echo "Nothing to do for terminate"  
77 }
78  # --- Post processing -----------------------------------------------
79 post()
80 {
81     ./post.sh $@ 
82 }
83 # --- Extract corrections --------------------------------------------
84 _extract()
85 {
86     local scr=${1:-Extract.C}
87     if test ! -f ${scr} ; then 
88         scr="../${scr}" 
89         if test ! -f ${scr} ; then 
90             echo "Extract script not found in `pwd` or parent" > /dev/stderr 
91             exit 1
92         fi
93     fi
94     if test -f .extract ; then 
95         echo "Aldready extracted in `basename $PWD`" 
96         return 0 
97     fi
98     echo "= Extracting"
99     script $scr > /dev/null 2>&1
100     touch .extract
101 }
102 # --- Upload a file --------------------------------------------------
103 upload()
104 {
105     if test -f .upload ; then 
106         echo "Already uploaded in `basename $PWD`"
107         return 0 
108     fi
109     echo "= Uploading"
110     script Upload.C \"file://${here}/${name}_corrs_${now}/\" >/dev/null 2>&1
111     touch .upload 
112 }
113 # --- Extract and upload ---------------------------------------------
114 extract_upload()
115 {
116     echo "=== Download, extract, and uploade in `basename $PWD` ==="
117     _extract
118     upload
119 }
120 # --- Draw -----------------------------------------------------------
121 _draw()
122 {
123     script $@
124 }
125 # --- Generic draw ---------------------------------------------------
126 draw()
127 {
128     _draw $@ 
129 }
130 # --- Draw dN/deta results -------------------------------------------
131 _dndeta_draw()
132 {
133     local d=$1 ; shift
134     local scr=${1:-Draw.C}
135     echo "=== $d ================================================"
136     (cd $d && \
137         draw ${fwd_dir}/DrawdNdetaSummary.C && \
138         draw ${scr})
139     echo "Back to `pwd`"
140 }
141 # --- Draw dN/deta ---------------------------------------------------
142 dndeta_draw()
143 {
144     _dndeta_draw $@ 
145 }
146 # === Task functions =================================================
147 # --- Common options help --------------------------------------------
148 usage()
149 {
150     cat <<EOF
151 Usage: $0 --what=OPERATION [--step=STEP] [OPTIONS]
152
153 General options:
154   -s,--step=STEP            Run stage ($step)
155   -w,--what=TRAINS          What to do 
156   -M,--man                  Show the manual  
157   -N,--noact                Show what will be done 
158
159 Options for 'setup' operation:
160   -n,--name=STRING          Base name of jobs ($name)
161   -S,--sys=SYSTEM           Collision system ($sys)
162   -E,--snn=ENERGY           Center of mass energy per nuclean pair ($snn)
163   -F,--field=FIELD          L3 magnetic field ($field)
164   -c,--corrections=DIR      Directory where corrections are stored ($corrs)
165   -u,--url-opts=OPTIONS     Additional user options ($uuopts)
166   -i,--inel-eff=EFF         Set INEL efficiency (only pp - $inel_eff)
167   -0,--inelgt0-eff=EFF      Set INEL>0 efficiency (only pp - $inelgt0_eff)
168   -v,--nsd-eff=EFF          Set NSD (to V0-AND) efficiency (only pp $nsd_eff)
169 EOF
170     setup_usage
171     cat <<EOF
172
173 TRAINS is one of
174
175   clean       Clean directory
176   setup       Do intial setup 
177   corrs       Generate corrections 
178   aods        Generate AODs 
179   dndeta      Generate dNdeta 
180   multdists   Generate P(Nch)
181   flow        Generate v_n{m} - not implemented yet 
182
183 and must be executed in that order.  STEP is one of 
184
185   full        Run the analysis 
186   terminate   Terminate the job (may need iterations)
187   upload      Upload corrections (only for TRAINS=corrs)
188   draw        Draw (partial) results (not for TRAINS=corrs)
189 EOF
190     
191 }
192 setup_usage()
193 {
194     dummy setup_usage
195 }
196
197 # === Setup functions ================================================
198 # --- Common setup code ----------------------------------------------
199 _setup()
200 {
201     local lhandled=yes
202     declare -a larg=$@
203     while test $# -gt 0 ; do 
204         arg=$1 
205         opt=
206         case $1 in 
207             --*=*) 
208                 arg=`echo $1 | sed 's/=.*//'` ;
209                 opt=`echo $1 | sed 's/--[^=][^=]*=//'` 
210                 ;;
211             --*)
212                 ;;
213             -*) opt=$2 ; shift ;; 
214         esac
215         shift 
216
217         lhandled=yes
218         # echo "Base: Processing '$arg' ('$opt')"
219         case $arg in 
220             -n|--name)         name=$opt     ;; 
221             -c|--corrections)  corrs=$opt    ;;
222             -i|--inel-eff)     inel_eff=$opt ;;
223             -0|--inelgt0-eff)  inelgt0_eff=$opt ;;
224             -v|--nsd-eff)      nsd_eff=$opt ;;
225             -u|--url-opts)     uuopts="$opt" ;;
226             -S|--sys)          sys=`echo $opt | tr '[A-Z]' '[a-z]'` ;;
227             -E|--snn)          snn=$opt      ;; 
228             -F|--field)        field=$opt    ;;
229             *) lhandled=no ;;
230         esac
231         if test x$lhandled = "xno" ; then 
232             handle_setup_option "$arg" "$opt" 
233         fi
234     done
235
236     check setup
237
238     # Set the date/time string 
239     now=`date '+%Y%m%d_%H%M'` 
240
241     # define our outputs
242     echo "=== Define outputs"
243     outputs
244
245     # Dump configuration to file 
246     echo "=== Dump configuration"
247     dump_conf $larg
248
249     # Set-up for corrections 
250     corrdir=${name}_corrs_${now}
251     if test "x$corrs" != "x" && test -d ${corrs} ; then 
252         echo "Linking ${corrs} to ${corrdir}"
253         ln -sf $corrs ${corrdir}
254         ln -sf $corrs last_${name}_corrs               
255         corrdir=$corrs
256     elif test $noact -lt 1 ; then 
257         mkdir -p ${name}_acc_${now}
258         mkdir -p ${corrdir}
259         rm -f last_${name}_acc last_${name}_corrs
260         ln -sf ${name}_acc_${now} last_${name}_acc
261         ln -sf ${name}_corrs_${now} last_${name}_corrs
262         cat <<-EOF > ${corrdir}/Browse.C
263         TObject* Browse()
264         {
265           const char* fwd = "$ALICE_ROOT/PWGLF/FORWARD/analysis2";
266           if (!gROOT->GetClass("AliOADBForward"))
267             gROOT->Macro(Form("%s/scripts/LoadLibs.C", fwd));
268           gROOT->LoadMacro(Form("%s/corrs/ForwardOADBGui.C", fwd));
269           
270           AliOADBForward* db = new AliOADBForward;
271           db->Open("fmd_corrections.root", "*");
272           
273           ForwardOADBGui(db);
274
275           return db;
276         }
277         EOF
278         echo "=== Make acceptance corrections" 
279         (cd ${name}_acc_${now} && \
280             accGen `run_for_acc` && \
281             upload )
282    fi
283    for i in fmd_corrections.root spd_corrections.root deadstrips.C ; do 
284        if test ! -f ${corrdir}/$i ; then continue ; fi 
285        echo "Linking ${corrdir}/$i here"
286        ln -fs ${corrdir}/$i . 
287    done
288    print 
289
290     
291 }
292 # --- Default implementation -----------------------------------------
293 setup()
294 {
295     echo "Default implementation"
296     _setup $@ 
297 }
298 # --- dummy handler of setup options ---------------------------------
299 handle_setup_option()
300 {
301     dummy handle_setup_option
302 }
303 # --- Dump configuration to file -------------------------------------
304 dump_conf()
305 {
306    cat > ${dotconf} <<-EOF
307         # Generated by command
308         # 
309         EOF
310    echo -n "#  $0 " >> $dotconf
311    while test $# -gt 0 ; do 
312        echo -en " \\" >> $dotconf
313        case $1 in 
314            --*) echo -en "\n#\t$1"    >> $dotconf;; 
315            -*)  echo -en "\n#\t$1 $2" >> $dotconf; shift ;; 
316            *)   echo -en "\n#\t$1"    >> $dotconf;;
317        esac
318        shift 
319    done
320    cat >> ${dotconf} <<-EOF
321         
322         # Settings:
323         name="$name"
324         now=${now}
325         # Collision system and similar
326         sys=$sys
327         snn=$snn
328         field=$field
329         # Additional URI options 
330         uuopts="${uuopts}"
331         # Trigger efficiencies - edit here to set them 
332         inel_eff=$inel_eff
333         inelgt0_eff=$inelgt0_eff
334         nsd_eff=$nsd_eff
335         EOF
336    dump_setup ${dotconf}
337    echo "# EOF" >> ${dotconf}
338 }
339 # --- Get the run number to use for acceptance -----------------------
340 run_for_acc()
341 {
342     dummy run_for_acc
343 }
344 # --- Dump settings to output file -----------------------------------
345 dump_setup()
346 {
347     dummy dump_setup
348 }
349
350 # --- Run acceptance generation --------------------------------------
351 accGen()
352 {
353     check_token
354     local run=$1 
355     script ${fwd_dir}/corrs/ExtractAcceptance.C "${run}"
356     if test -f deadstrips.C ; then 
357         cp ${here}/${name}_corrs_${now}/
358     fi
359 }
360
361 # === Check function =================================================
362 check()
363 {
364     local w=$1
365
366     if test "X$name" = X ; then 
367         echo "No name specified" > /dev/stderr 
368         exit 1
369     fi
370     if test "X$w" != "Xsetup" && test "x$now" = "x" ; then 
371         echo "No date/time specified" > /dev/stderr 
372         exit 1
373     fi
374
375     check_setup $w
376
377     # sys==0 is OK - autoselect
378     case x$sys in 
379         xpp|xp-p)              sys=1 ;; 
380         xpbpb|xpb-pb|xaa|xa-a) sys=2 ;; 
381         xppb|xp-pb|xpa|xp-a)   sys=3 ;;
382         x0|x1|x2|x3)                 ;; 
383         x)                     sys=0 ;;
384         *) echo "$0: Unknown system: $sys" ; exit 1 ;;
385     esac
386
387 }
388 check_setup()
389 {
390     dummy check_setup
391 }
392
393 # --- Show the setup -------------------------------------------------
394 print()
395 {
396     cat <<-EOF
397         Name:                   ${name}
398         Collision system:       ${sys}
399         sqrt(s_NN):             ${snn}GeV
400         L3 Field:               ${field}kG
401         Date & time:            ${now}
402         Additional URL options: ${uuopts}
403         Trigger efficiencies:   
404           INEL:                 ${inel_eff}
405           INEL>0:               ${inelgt0_eff}
406           NSD:                  ${nsd_eff}
407         EOF
408     print_setup
409 }
410 print_setup()
411 {
412     dummy print_setup
413 }
414
415 # === Task functions =================================================
416 # Modifies 'opts' 
417 train_opts()
418 {
419     local mc=$1   ; shift
420     local type=$1 ; shift 
421     local trig=$1 ; shift 
422
423     nme=${name}_${type}
424
425     case $type in 
426         *corr)   cl=MakeMCCorrTrain ; mc=1 ;;
427         *eloss)  cl=MakeFMDELossTrain ;;  
428         *aod)    cl=MakeAODTrain    ; opts="${opts} --corr=." ;;
429         *dndeta) cl=MakedNdetaTrain 
430             tree=aodTree 
431             opts="${opts} --cut-edges"
432             case x$trig in 
433                 xinel)    
434                     opts="$opts --scheme=trigger,event,background" 
435                     opts="$opts --trig=INEL --trigEff=$inel_eff" 
436                     ;;
437                 xnsd)     
438                     opts="$opts --scheme=trigger,event"
439                     opts="$opts --trig=V0AND --trigEff=$nsd_eff"
440                     ;;
441                 xinelgt0) 
442                     opts="$opts --scheme=trigger,event"
443                     opts="$opts --trig=INELGT0 --trigEff=$inelgt0_eff"
444                     ;;
445                 x*) trig= ;;
446             esac
447             if test "x$trig" != "x" ; then 
448                 nme="${nme}_${trig}"
449             fi
450             if test $mc -gt 0 ; then 
451                 opts="$opts --mc"
452             fi
453             ;;
454         *multdists) 
455             cl=MakeMultDistsTrain 
456             tree=aodTree 
457             pat="*/AliAOD.root"
458             ;;
459         *) echo "$0: Unknown type of train: $type" > /dev/stderr ; exit 1 ;;
460     esac
461     # add centrality flag if we do not know what collision system we're 
462     # looking at, or it's PbPb or pPb. 
463     case $sys in 
464         0|2|3) opts="$opts --cent" ;; 
465         1)                         ;;
466     esac
467     opts="${opts} --include=$ALICE_ROOT/PWGLF/FORWARD/analysis2/trains"
468     opts="${opts} --date=${now} --class=$cl --name=$nme --verbose=0"
469 }
470
471 # --- Run the train --------------------------------------------------
472 _allAboard()
473 {
474     local type=$1 ; shift 
475     local trig=$1 ; shift 
476
477     local mc=0
478     case $type in 
479         mc*) mc=1  ;; 
480     esac
481
482     opts=
483     url=
484     train_opts $mc $type $trig 
485     url_opts $mc $type $trig
486
487     
488     echo "=== Running train: runTrain ${opts} --url=${url} $@" 
489     if test $noact -gt 0 ; then return ; fi
490
491     runTrain ${opts} --overwrite --url=${url} $@ 
492 }
493 url_opts()
494 {
495     dummy url_opts
496 }
497 allAboard()
498 {
499     local what=$1 ; shift 
500     local trig=$1 ; shift 
501     echo "=== Running _allAboard '$what' '$trig' $@" 
502     _allAboard "$what" "$trig" $@
503 }
504
505 # --- Collect PDFs ---------------------------------------------------
506 collect()
507 {
508     local out=${name}_pdfs_${now}
509     rm -rf $out
510     mkdir -p ${out}
511     dirs="corr eloss aod dndeta dndeta_inel dndeta_nsd dndeta_inelgt0 multdists"
512     # Now loop on dirs
513     for d in ${dirs} ; do 
514         for m in "" "mc" ; do 
515             dir=${name}_${m}${d}_${now}
516             M=
517             case x$m in 
518                 x)   M=real ;; 
519                 xmc) M=simu ;;
520             esac
521             if test ! -d $dir ; then 
522                 # echo "Directory ${dir} doesn't exist"
523                 continue
524             fi
525             # echo "Will look in $dir"
526             local files=
527             case $d in 
528                 corr)      files="forward_mccorr.pdf" ;; 
529                 eloss)     files="forward_elossfits.pdf" ;; 
530                 aod)       files="forward.pdf" ;; 
531                 dndeta*)   files="forward_dndeta.pdf dNdeta*.pdf" ;; 
532                 multdists) files="forward_multdists.pdf" ;;
533                 *) echo "Unknown directory type: $d" > /dev/stder 
534                     continue 
535                     ;;
536             esac
537             collect_files "$dir" "$d" "$M" "$out" "$run" "$files"
538
539         done
540     done 
541     (cd ${out} && pdfjoin -q -o tmp.pdf \
542         --pdftitle "${name} summary ($now)" \
543         --twoside summary_*.pdf dndeta_*.pdf && \
544         pdfnup -q --nup 2x1 -o ${name}_summary_${now}.pdf tmp.pdf && \
545         rm -f tmp.pdf)
546     (cd ${out} && pdfjoin -q -o tmp.pdf \
547         --pdftitle "${name} dN/deta ($now)" \
548         --twoside dndeta_*.pdf && \
549         pdfnup -q --nup 2x1 -o ${name}_dndeta_${now}.pdf tmp.pdf && \
550         rm -f tmp.pdf)
551     echo "Made ${name}_summary_${now}.pdf and ${name}_dndeta_${now}.pdf"
552     rm -f last_${name}_pdfs
553     ln -s ${out} last_${name}_pdfs
554     (cd ${out} && _pres_collect)
555 }
556
557 _pres_collect()
558 {
559     local out=results.tex
560     rm -rf $out
561     local A=`getent passwd $USER | cut -f5 -d: `
562     local D=`echo $now | sed 's,\(....\)\(..\)\(..\)_\(..\)\(..\),\1/\2/\3 \4:\5,'`
563     cat <<-EOF > $out
564         \\documentclass[compress]{beamer}
565         \\usetheme{alice}
566         \\usepackage[english,british]{babel}
567         \\mode<presentation>
568         \\title{Job ${name}}
569         \\author{$A} 
570         \\date{$D}
571         \\begin{document}
572         \\aliceTitlePage{}
573         EOF
574     dirs="dndeta dndeta_inel dndeta_nsd dndeta_inelgt0 multdists"
575     for i in ${dirs} ; do 
576         l=`ls ${i}_real_*.pdf 2>/dev/null` 
577         for r in $l ; do 
578             m=`echo $r | sed 's/real/simu/'` 
579             R=`basename $r .pdf | sed "s/${i}_real_0*//"` 
580             t=`basename $r .pdf | sed 's/dndeta_\(.*\)_real.*/\1/'` 
581             case x$t in 
582                 x) T="All";;
583                 xinel)    T="INEL" ;; 
584                 xinelgt0) T="INEL\\textgreater0" ;; 
585                 xnsd)     T="NSD" ;; 
586                 x*)       T="Unknown";;
587             esac
588             if test -f $r && test -f $m ; then 
589                 cat <<-EOF >> $out
590                 \\begin{frame}{Run $R --- $T} 
591                   \\begin{columns}
592                     \\begin{column}{.48\\linewidth}
593                       \\textbf{Real}\\\\
594                       \\includegraphics[keepaspectratio,width=\\linewidth]{%
595                         $r}
596                     \\end{column}
597                     \\begin{column}{.48\\linewidth}
598                       \\textbf{Simulated}\\\\
599                       \\includegraphics[keepaspectratio,width=\\linewidth]{%
600                         $m}
601                     \\end{column}
602                   \\end{columns}
603                 \\end{frame}
604                 EOF
605             fi
606         done
607     done
608     cat <<-EOF >> $out
609         \\end{document}
610         EOF
611     pdflatex $out
612 }
613
614 _collect_files()
615 {
616     local dir=$1 ; shift
617     local d=$1 ; shift 
618     local M=$1 ; shift 
619     local out=$1 ; shift
620     local r=$1 ; shift
621     # local files="$1"
622     for f in $@ ; do 
623         ff=$dir/$f
624         tgt=`collect_name "$ff" "$d" "$M"`
625         if test "x$tgt" = "x" ; then 
626             continue 
627         fi
628         tgt=`printf "%s_%09d.pdf" $tgt $run` 
629         # printf "%100s -> %s\n" $ff $tgt
630         if test ! -f $ff ; then 
631             echo "$ff not found - ignored"
632             continue
633         fi
634         cp $ff $out/$tgt
635     done # for f in files
636 }
637
638 collect_name()
639 {
640     local tgt=
641     local ff="$1" ; shift
642     local d="$1" ; shift 
643     local M=$1 ; shift
644     case $ff in 
645         */forward_mccorr.pdf)    tgt=summary_mccorr ;; 
646         */forward.pdf)           tgt=summary_${d}_${M} ;; 
647         */forward_dndeta.pdf)    tgt=summary_${d}_${M} ;; 
648         */forward_multdists.pdf) tgt=summary_${d}_${M} ;; 
649         */forward_elossfits.pdf) tgt=summary_${d}_${M} ;; 
650         */dNdeta*.pdf)           tgt=${d}_${M} ;;
651         *) echo "Don't know how to deal with $ff" >/dev/stderr 
652     esac
653     echo $tgt
654 }
655
656 collect_files()
657 {
658     _collect_files $@
659 }
660
661 # --- Clean up -------------------------------------------------------
662 _cleanup()
663 {
664     for i in acc aod corrs dndeta dndeta_inel dndeta_inelgt0 dndeta_nsd \
665         eloss multdist ; do 
666         for j in "" mc ; do 
667             if test ! -d ${name}_${j}${i}_${now} ; then 
668                 continue 
669             fi
670             rm -rf ${name}_${j}${i}_${now} 
671             rm -f last_${name}_${j}${i} 
672         done
673     done
674     rm -f build.log 
675     for i in fmd_corrections.root spd_corrections.root deadstrips.C ; do
676         if test ! -L $i ; then 
677             continue
678         fi
679         rm -f fmd_corrections.root
680     done
681 }
682 cleanup()
683 {
684     _cleanup
685 }
686 # === Wrappers =======================================================
687 # --- Run all correction jobs ----------------------------------------
688 # This assumes the function allAboard 
689 corrs()
690 {
691     allAboard mccorr "" $@
692     allAboard mceloss "" $@
693     allAboard eloss "" $@
694 }
695 corrs_terminate() 
696 {
697     (cd ${name}_mccorr_${now}  && terminate)
698     (cd ${name}_mceloss_${now} && terminate)
699     (cd ${name}_eloss_${now}   && terminate)
700 }
701 # Run post processing 
702 corrs_post()
703 {
704     (cd ${name}_mccorr_${now}  && post ../${name}_corrs_${now})
705     (cd ${name}_mceloss_${now} && post ../${name}_corrs_${now} )
706     (cd ${name}_eloss_${now}   && post ../${name}_corrs_${now} )
707     rm -f fmd_corrections.root spd_corrections.root 
708     ln -s ${name}_corrs_${now}/fmd_corrections.root .
709     ln -s ${name}_corrs_${now}/spd_corrections.root .
710 }
711
712 # This assumes the function extract_upload 
713 corrs_upload() 
714 {
715     corrs_post
716 }
717 corrs_draw()
718 {
719     corrs_post
720 }
721 # --- Run all AOD jobs -----------------------------------------------
722 aods()
723 {
724     allAboard mcaod "" $@
725     allAboard aod "" $@
726 }
727 aods_terminate() 
728 {
729     (cd ${name}_mcaod_${now} && terminate)
730     (cd ${name}_aod_${now}   && terminate)
731 }
732 aods_upload()
733 {
734     aods_post
735 }
736 aods_draw() 
737 {
738     aods_post
739 }
740 aods_post()
741 {
742     (cd ${name}_mcaod_${now} && post)
743     (cd ${name}_aod_${now}   && post)
744 }
745 # --- Run all dN/deta jobs -------------------------------------------
746 dndetas()
747 {
748     if test $sys -eq 1 ; then 
749         allAboard mcdndeta inel $@
750         allAboard mcdndeta nsd $@
751         allAboard mcdndeta inelgt0 $@
752         allAboard dndeta inel $@
753         allAboard dndeta nsd $@
754         allAboard dndeta inelgt0 $@
755     else
756         allAboard mcdndeta "" $@
757         allAboard dndeta   "" $@
758     fi
759 }
760 dndetas_terminate() 
761 {
762     if test $sys -eq 1 ; then 
763         (cd ${name}_mcdndeta_inel_${now}    && terminate)
764         (cd ${name}_mcdndeta_nsd_${now}     && terminate)
765         (cd ${name}_mcdndeta_inelgt0_${now} && terminate)
766         (cd ${name}_dndeta_inel_${now}      && terminate)
767         (cd ${name}_dndeta_nsd_${now}       && terminate)
768         (cd ${name}_dndeta_inelgt0_${now}   && terminate)
769     else
770         (cd ${name}_mcdndeta_${now} && terminate)
771         (cd ${name}_dndeta_${now}   && terminate)
772     fi
773 }
774 dndetas_upload()
775 {
776     dndeta_post
777 }
778 dndetas_draw() 
779 {
780     dndeta_post
781 }
782 dndetas_post() 
783 {
784     if test $sys -eq 1 ; then 
785         (cd ${name}_mcdndeta_inel_${now}    && post)
786         (cd ${name}_mcdndeta_nsd_${now}     && post)
787         (cd ${name}_mcdndeta_inelgt0_${now} && post)
788         (cd ${name}_dndeta_inel_${now}      && post)
789         (cd ${name}_dndeta_nsd_${now}       && post)
790         (cd ${name}_dndeta_inelgt0_${now}   && post)
791     else
792         (cd ${name}_mcdndeta_${now} && post)
793         (cd ${name}_dndeta_${now}   && post)
794     fi
795 }
796 # --- Run all MultDists -------------------------------------------
797 multdists()
798 {
799     allAboard mcmultdists "" $@
800     allAboard multdists   "" $@
801 }
802 multdists_terminate() 
803 {
804     (cd ${name}_mcmultdists_${now} && terminate)
805     (cd ${name}_multdists_${now}   && terminate)
806 }
807 multdists_upload()
808 {
809     multdists_posts
810 }
811 multdists_post() 
812 {
813     (cd ${name}_mcmultdists_${now} && post)
814     (cd ${name}_multdists_${now}   && post ../${name}_mcmultdists_${now})
815 }
816
817 # === Driver code ====================================================
818 # assumes functions:
819 #  
820 #  handle_option ARG [OPT]
821 #  check [WHAT]
822 #  print_setup
823 #  setup
824 #  cleanup
825 #
826 runIt()
827 {
828     # --- Source settings if found -----------------------------------
829     if test -f $dotconf ; then 
830         source $dotconf 
831     fi
832
833
834     # --- Process command line -------------------------------------------
835     what=
836     step=
837     declare -a parg
838     local iarg=0
839     while test $# -gt 0 ; do
840         local arg=$1 
841         local opt=
842         local handled_arg=1
843         local handled_opt=0
844         case $1 in 
845             --) shift ; break ;;
846             --*=*) 
847                 arg=`echo $1 | sed 's/=.*//'` ;
848                 opt=`echo $1 | sed 's/--[^=][^=]*=//'` 
849                 ;;
850             --*)
851                 ;;
852             -h|-N|-H|-a) ;;
853             -*) opt=$2 ; handled_opt=1 ;; 
854         esac
855
856         # echo "Run:  Processing '$arg' ('$opt')"
857         case $arg in 
858             -w|--what)         what=`echo $opt | tr '[A-Z]' '[a-z]'`  ;; 
859             -s|--step)         step=`echo $opt | tr '[A-Z]' '[a-z]'`  ;; 
860             -N|--noact)        noact=1       ;;
861             -h|--help)         usage         ; exit 0 ;; 
862             -H|--manual)       manual        ; exit 0 ;;
863             *) handled_arg=0 ;;
864         esac
865         if test $handled_arg -lt 1 ; then 
866             parg[$iarg]="$1"
867             let iarg=$iarg+1
868             # echo "Pushed $1 -> ${parg[@]}"
869             if test $handled_opt -gt 0 ; then 
870                 parg[$iarg]="$2"
871                 let iarg=$iarg+1
872                 # echo "Pushed $2, gobble $2 -> ${parg[@]}"
873                 shift
874             fi
875         else
876             if test $handled_opt -gt 0 ; then 
877                 shift 
878                 # echo "Gobble $1"
879             fi
880         fi
881         shift 
882     done 
883     # For backward compatibility 
884     while test $# -gt 0 ; do
885         parg[$iarg]=$1 
886         shift 
887         let iarg=$iarg+1
888     done
889     # --- Select what to do ------------------------------------------
890     func=
891     case $what in 
892         setup)    setup ${parg[@]} ; exit 0 ;; 
893         clean)    cleanup ; exit 0 ;;
894         corr*)    func=corrs;; 
895         aod*)     func=aods ;; 
896         dndeta*)  func=dndetas ;; 
897         multdist*)func=multdists ;;
898         collect*) func=collect ;;    
899         *) echo "$0: Unknown operation: $what" > /dev/stderr ; exit 1 ;;
900     esac
901
902     # --- Check settings ---------------------------------------------
903     check $what
904
905     print
906
907     case $what in 
908         setup|clean|collect) step=full ;; 
909     esac
910
911     case x$step in 
912         x|xfull) ;; 
913         xterm*) func=${func}_terminate ;; 
914         xup*)   func=${func}_upload ;; 
915         xdr*)   func=${func}_draw ;;
916         xpo*)   func=${func}_post ;;
917         *) echo "$0: Unknown step $step" > /dev/stderr ; exit 1 ;;
918     esac
919     
920     echo "Will execute $func (${parg[@]})" 
921     $func ${parg[@]}
922 }
923
924
925 # EOF
926 #
927