workflow_sketch.sh 14.6 KB
Newer Older
1
2
3
4
5
6
7
8
9
#!/bin/bash

##############################
# Configurations             #
##############################
# Put aliBuild in the PATH env var
export PATH="/mnt/SSD/schnorr/python/bin:$PATH"
# Directory where runAnalysis.C is placed
export ALIROOT_SCRIPT_DIR=$(pwd)/aliRoot/
10
# Directory where Blender scripts are
11
12
export BLENDER_SCRIPT_DIR=$(pwd)/animate/
# alienv working directory
Breno Rilho Lemos's avatar
Breno Rilho Lemos committed
13
14
export ALIENV_WORK_DIR=/home/breno/alice/sw
export ALIENV_OS_SPEC=ubuntu1804_x86-64
15
export ALIENV_ID=AliPhysics/latest-aliroot5-user
16
# Put Blender 2.79b in the PATH env var
17
18
19
export PATH="/home/schnorr/install/blender-2.79-linux-glibc219-x86_64/:$PATH"

##############################
20
# Command-line options       #
21
##############################
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# See the following link to understand the code below
# https://stackoverflow.com/questions/192249/how-do-i-parse-command-line-arguments-in-bash

# saner programming env: these switches turn some bugs into errors
set -o errexit -o pipefail -o noclobber -o nounset

# -allow a command to fail with !’s side effect on errexit
# -use return value from ${PIPESTATUS[0]}, because ! hosed $?
! getopt --test > /dev/null
if [[ ${PIPESTATUS[0]} -ne 4 ]]; then
    echo 'I’m sorry, `getopt --test` failed in this environment.'
    exit 1
fi

36
OPTIONS=c:hdau:m:n:t:r:
37
LONGOPTS=camera:,resolution:,fps:,transparency:,duration:,maxparticles:,minparticles:,numberofevents:,minavgpz:,minavgpt:,help,download,sample,url:,its,tpc,trd,emcal,blendersave,picpct:
38
39
40
41
42
43
44
45
46
47
48
49
50
51

# -regarding ! and PIPESTATUS see above
# -temporarily store output to be able to check for errors
# -activate quoting/enhanced mode (e.g. by writing out “--options”)
# -pass arguments only via   -- "$@"   to separate them correctly
! PARSED=$(getopt --options=$OPTIONS --longoptions=$LONGOPTS --name "$0" -- "$@")
if [[ ${PIPESTATUS[0]} -ne 0 ]]; then
    # e.g. return value is 1
    #  then getopt has complained about wrong arguments to stdout
    exit 2
fi
# read getopt’s output this way to handle the quoting right:
eval set -- "$PARSED"

52
53
54
##############################
# Parse Parameters           #
##############################
55
CAMERA=Overview
56
57
DURATION=10
RESOLUTION=100
58
FPS=24
59
TRANSPARENCY=1
60
61
62
MAX_PARTICLES=1000
MIN_PARTICLES=0
N_OF_EVENTS=10
63
MIN_AVG_PZ=0
64
MIN_AVG_PT=0
65
66
HELP=false
DOWNLOAD=false
67
SAMPLE=false
68
URL=
69
70
71
72
ITS=1 # 1 means "build this detector", while 0 means "don't"
TPC=1
TRD=1
EMCAL=1
73
BLENDERSAVE=0
74
PICPCT=80
75
76
77
# now enjoy the options in order and nicely split until we see --
while true; do
    case "$1" in
78
79
80
81
82
      -h|--help)
          HELP=true
          shift
          break
          ;;
83
      -d|--download)
84
85
86
            DOWNLOAD=true
            shift
            ;;
87
88
      -a|--sample)
            SAMPLE=true
89
90
            shift
            ;;
91
92
      -u|--url)
          URL="$2"
93
94
            shift 2
            ;;
95
96
97
98
      -m|--maxparticles)
          MAX_PARTICLES="$2"
          shift 2
          ;;
99
100
101
102
103
104
105
106
      --minparticles)
          MIN_PARTICLES="$2"
          shift 2
          ;;
      -n|--numberofevents)
          N_OF_EVENTS="$2"
          shift 2
          ;;
107
108
109
110
      --minavgpz)
          MIN_AVG_PZ="$2"
          shift 2
          ;;
111
112
113
114
      --minavgpt)
          MIN_AVG_PT="$2"
          shift 2
          ;;
115
116
117
118
119
120
121
122
      -t|--duration)
          DURATION="$2"
          shift 2
          ;;
      -r|--resolution)
          RESOLUTION="$2"
          shift 2
          ;;
123
124
125
126
      --fps)
          FPS="$2"
          shift 2
          ;;
127
128
      --transparency)
          TRANSPARENCY="$2"
129
130
          shift 2
          ;;
Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
131
      -c|--camera)
132
133
134
      	  CAMERA="$2"
      	  shift 2
      	  ;;
135
136
137
138
      --picpct)
      	  PICPCT="$2"
      	  shift 2
      	  ;;
139
      --its)
140
141
142
          ITS=0
          shift
          ;;
143
      --tpc)
144
145
146
          TPC=0
          shift
          ;;
147
      --trd)
148
149
150
          TRD=0
          shift
          ;;
151
      --emcal)
152
153
154
          EMCAL=0
          shift
          ;;
155
156
157
158
      --blendersave)
          BLENDERSAVE=1
          shift
          ;;
159
160
161
162
163
        --)
            shift
            break
            ;;
        *)
164
            echo "Programming error $*"
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
            exit 3
            ;;
    esac
done

##############################
# Usage                      #
##############################
function usage()
{
    # Using a here doc with standard out.
    cat <<-END
Usage:
------
   -h | --help
     Display this help
   -d | --download
     Download the AliESDs.root file using the provided URL
   -u | --url URL
     Provide the URL to uniquely identify a AliESDs.root dataset.
     This should be in the format provided by http://opendata.cern.ch.
     See example below.
187
   -m | --maxparticles VALUE
188
189
     Get only events for which its number of particles does not
     exceed VALUE.
190
   --minparticles VALUE
191
192
     Get only events for which its number of particles is greater than
     or equal to VALUE.
193
194
   -n | --numberofevents VALUE
     Set number of events to be animated inside chosen ESD file.
195
196
197
198
   --minavgpz VALUE
     Get only events for which its absolute value of average momentum in
     the z direction is greater than or equal to VALUE. Useful for animating
     events with 'boosts' of particles to the same side.
199
200
201
202
   --minavgpt VALUE
     Get only events for which its average transversal momentum is
     greater than or equal to VALUE. Useful for animating events with
     'boosts' of particles on the xy plane.
203
204
205
206
   -t | --duration VALUE
     Set the animation duration in seconds.
   -r | --resolution VALUE
     Set the animation resolution percentage.
207
208
   --fps VALUE
     Set number of frames per second in animation.
209
210
211
   --transparency VALUE
     Set detector transparency as a number greater than zero,
     where zero is full transparency and 1 is standard transparency
Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
212
213
214
   -c | --camera VALUE
     Which camera to use for the animation, where VALUE
     is a comma-separated list (without spaces)
215
     Options: Barrel,Forward,Overview (defaults to Overview)
216
217
   --picpct VALUE
     Percentage of animation to take HD picture, saved along with the clip.
218
   -a | --sample
219
220
     Creates a sample Blender animation of Event 2 from URL
     http://opendata.cern.ch/record/1102/files/assets/alice/2010/LHC10h/000139038/ESD/0001/AliESDs.root
221
   --its
222
     Removes ITS detector from animation
223
   --tpc
224
     Removes TPC detector from animation
225
   --trd
226
     Removes TRD detector from animation
227
   --emcal
228
     Removes EMCal detector from animation
229
230
   --blendersave
     Saves Blender file along with animation clip
231
232
233
234
235
236
237

Example:
--------
$0 --url http://opendata.cern.ch/record/1103/files/assets/alice/2010/LHC10h/000139173/ESD/0004/AliESDs.root --download

END
}
238

Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
239
240
241
242
243
# Fix CAMERA to be accepted by the for loop
if [[ $CAMERA != "" ]]; then
    CAMERA=$(echo $CAMERA | sed -e 's#,#Camera #g' -e 's#$#Camera#')
fi

244
245
246
247
248
249
250
if [[ $HELP = "true" ]]; then
    usage
    exit
else
    echo "-------- Parsed parameters --------"
    echo "URL: $URL"
    echo "Download: $DOWNLOAD"
251
    echo "Sample: $SAMPLE"
252
    echo "Transparency Parameter: $TRANSPARENCY"
253
254
    echo "Duration: $DURATION"
    echo "Resolution: $RESOLUTION"
255
    echo "FPS: $FPS"
256
    echo "Max particles: ${MAX_PARTICLES}"
257
258
    echo "Min particles: ${MIN_PARTICLES}"
    echo "Number of events: ${N_OF_EVENTS}"
259
    echo "Min Average Z Momentum: ${MIN_AVG_PZ}"
260
    echo "Min Average Transversal Momentum: ${MIN_AVG_PT}"
Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
261
    echo "Camera: $CAMERA"
262
    echo "Picture Percentage: ${PICPCT}%"
263
    echo "-----------------------------------"
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
    echo "------------ Detectors ------------"
    if [[ $ITS = 1 ]]; then
      echo "Building ITS"
    fi
    if [[ $TPC = 1 ]]; then
      echo "Building TPC"
    fi
    if [[ $TRD = 1 ]]; then
      echo "Building TRD"
    fi
    if [[ $EMCAL = 1 ]]; then
      echo "Building EMCAL"
    fi
    if [[ $TPC = 0 && $TPC = 0 && $TRD = 0 && $EMCAL = 0 ]]; then
      echo "Not building any detectors"
    fi
    echo "-----------------------------------"

282
283
fi

284
285
286
287
288
289
290
# handle non-option arguments
if [[ $# -ne 0 ]]; then
    echo "$0: non-option arguments ($#, $*) are ignored."
    echo "Remove them manually as indicated between parenthesis."
    exit
fi

291
292
293
294
##############################
# Download Dataset           #
##############################
if [ "$DOWNLOAD" = "true" ]; then
295
    if [ -z $URL ]; then
296
        echo "Error. Must pass the dataset URL in order to download ESD file."
297
298
299
        usage
        exit
    fi
300
301
302
    echo "Downloading data."
    wget $URL

303
304
305
306
307
308
309
310
311
312
313
314
    ######################################
    # Established Unique ID based on URL #
    ######################################
    UNIQUEID=$(echo $URL | sed \
                         -e "s#http://opendata.cern.ch/##" \
                         -e "s#/AliESDs.root##" \
                         -e "s#files/assets/##" \
                         -e "s#/#_#g")

    echo "The unique ID is $UNIQUEID."

fi
315

316
##############################
317
# Sample synthetic animation#
318
##############################
319
if [ "$SAMPLE" = "true" ]; then
320
    ##############################
321
    # Phase 1: Blender animate   #
322
323
    ##############################
    pushd ${BLENDER_SCRIPT_DIR}
324
    for type in $CAMERA; do
325
      echo "Preparing sample animation with $type in Blender"
326
      blender -noaudio --background -P animate_particles.py -- -radius=0.05 -duration=${DURATION} -camera=${type} -datafile="d-esd-detail.dat" -simulated_t=0.03 -fps=${FPS} -resolution=${RESOLUTION} -transparency=${TRANSPARENCY} -stamp_note="opendata.cern.ch_record_1102_alice_2010_LHC10h_000139038_ESD_0001_2" -its=${ITS} -tpc=${TPC} -trd=${TRD} -emcal=${EMCAL} -blendersave=${BLENDERSAVE} -picpct=5
327
    done
328
    popd
329
    BLENDER_OUTPUT=.
330
331
332
333
    mkdir --verbose -p ${BLENDER_OUTPUT}
    mv --verbose /tmp/blender ${BLENDER_OUTPUT}
    echo "Done."

334
335
336
##############################
# Animation from file        #
##############################
337
elif [ "$SAMPLE" = "false" ]; then
338

339
  # Verify if AliESDs.root is here
340
341
342
  ALIESD_ROOT_FILE=$(pwd)/AliESDs.root
  if ! [[ -f "$ALIESD_ROOT_FILE" ]]
  then
Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
343
344
      echo "AliESDs.root not found."
      exit
345
346
  fi

347
348
349
  ############################
  # Phase 1: aliroot extract #
  ############################
350
  eval $(alienv -w ${ALIENV_WORK_DIR} -a ${ALIENV_OS_SPEC} load ${ALIENV_ID})
351
  pushd ${ALIROOT_SCRIPT_DIR}
352
  # Remove existing symbolic link
353
  rm -f --verbose AliESDs.root
354
355
356
  # Create a symbolic link to the actual AliESDs.root
  ln --verbose -s ${ALIESD_ROOT_FILE} AliESDs.root
  # Run the extraction tool
357
  aliroot runAnalysis.C
358

359
360
361
362
363
364
365
366
367
368
369
370
371
372
  if [ "$DOWNLOAD" = "false" ]; then

    UNIQUEID=$(more uniqueid.txt)
    echo "The unique ID is $UNIQUEID."
    rm uniqueid.txt

  fi

  # Create directory where animations will be saved
  popd
  BLENDER_OUTPUT=$(pwd)/$UNIQUEID
  mkdir --verbose -p ${BLENDER_OUTPUT}
  pushd ${ALIROOT_SCRIPT_DIR} # push back to aliroot directory

373
374
375
  #################################################
  # Phase 1: iteration for every event identifier #
  #################################################
376

377
378
379
  # Event counter for animating no more events than the informed amount
  EVENT_COUNTER=0

380
381
382
383
  # Get all extracted files
  EXTRACTED_FILES=$(ls -1 esd_detail-event_*.dat | sort --version-sort)
  for FILE_WITH_DATA in $EXTRACTED_FILES; do
      EVENT_ID=$(echo $FILE_WITH_DATA | \
384
385
                 sed -e "s#esd_detail-event_##" \
                   -e "s#\.dat##")
386
387
      EVENT_UNIQUE_ID=${UNIQUEID}_${EVENT_ID}

Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
388
      if ! [[ -s $FILE_WITH_DATA ]]; then
389
          echo "File $FILE_WITH_DATA has zero size. Ignore and continue."
390
	        rm $FILE_WITH_DATA
391
          continue
Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
392
      fi
393

394
395
396
      ##############################
      # Phase 2: blender animate   #
      ##############################
397
398
399

      LOCAL_FILE_WITH_DATA=${EVENT_UNIQUE_ID}.dat
      cp ${ALIROOT_SCRIPT_DIR}/$FILE_WITH_DATA \
400
401
       ${BLENDER_SCRIPT_DIR}/${LOCAL_FILE_WITH_DATA}

402
403
      rm $FILE_WITH_DATA

404
405
      NUMBER_OF_PARTICLES=$(wc -l ${BLENDER_SCRIPT_DIR}/$LOCAL_FILE_WITH_DATA | \
                        awk '{ print $1 }')
406

407
408
      AVERAGE_PZ=$(awk 'BEGIN {pzsum=0;n=0} {pzsum+=$8;n++} END {print sqrt(pzsum*pzsum/n/n)}' ${BLENDER_SCRIPT_DIR}/${LOCAL_FILE_WITH_DATA})

409
      AVERAGE_PT=$(awk 'BEGIN {ptsum=0;n=0} {ptsum+=$9;n++} END {print ptsum/n}' ${BLENDER_SCRIPT_DIR}/${LOCAL_FILE_WITH_DATA})
410

411
412
413
      echo "File $LOCAL_FILE_WITH_DATA has $NUMBER_OF_PARTICLES particles."
      echo "Average Z momentum: $AVERAGE_PZ"
      echo "Average transversal momentum $AVERAGE_PT"
414

415
416
417
      if (( $(echo "$AVERAGE_PT >= $MIN_AVG_PT" |bc -l) )); then
        if (( $(echo "$AVERAGE_PZ >= $MIN_AVG_PZ" |bc -l) )); then
          if [[ $NUMBER_OF_PARTICLES -le $MAX_PARTICLES && $NUMBER_OF_PARTICLES -ge $MIN_PARTICLES && $EVENT_COUNTER -lt $N_OF_EVENTS ]]; then
418

419
420
            # Increment event counter
            EVENT_COUNTER=$EVENT_COUNTER+1
421

422
            echo "Processing ${EVENT_UNIQUE_ID} ($NUMBER_OF_PARTICLES tracks) in Blender"
423

424
            pushd ${BLENDER_SCRIPT_DIR}
425

426
427
            for type in $CAMERA; do
                  echo "Processing ${EVENT_UNIQUE_ID} with $type in Blender"
428

429
                  blender -noaudio --background -P animate_particles.py -- -radius=0.05 -duration=${DURATION} -camera=${type} -datafile="${LOCAL_FILE_WITH_DATA}" -n_event=${EVENT_ID} -simulated_t=0.03 -fps=${FPS} -resolution=${RESOLUTION} -transparency=${TRANSPARENCY} -stamp_note="${EVENT_UNIQUE_ID}" -its=${ITS} -tpc=${TPC} -trd=${TRD} -emcal=${EMCAL} -blendersave=${BLENDERSAVE} -picpct=${PICPCT}
430
431
432
433
                  # Move generated file to final location
                  mv /tmp/blender/* ${BLENDER_OUTPUT}
                  echo "${type} for event ${EVENT_UNIQUE_ID} done."
            done
434

435
436
            # Move processed file to final location
            mv $LOCAL_FILE_WITH_DATA ${BLENDER_OUTPUT}/$LOCAL_FILE_WITH_DATA
437

438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
            popd
            echo "EVENT ${EVENT_UNIQUE_ID} DONE with FILE $LOCAL_FILE_WITH_DATA."
          else

            if [[ $NUMBER_OF_PARTICLES -lt $MIN_PARTICLES ]]; then
              echo "Too little particles (minimum accepted is $MIN_PARTICLES). Continue."
            elif [[ $NUMBER_OF_PARTICLES -gt $MAX_PARTICLES ]]; then
              echo "Too many particles (maximum accepted is $MAX_PARTICLES). Continue."
            elif [[ $EVENT_COUNTER -ge $N_OF_EVENTS ]]; then
              echo "Numbers of events set to be animated has already been reached. Continue."
            fi

            # Remove non-processed files
            pushd ${BLENDER_SCRIPT_DIR}
            rm $LOCAL_FILE_WITH_DATA
            popd

            continue
456
          fi
457
458
        else
          echo "Average Z Momentum too low (minimum accepted is $MIN_AVG_PZ). Continue."
459

460
461
462
463
464
465
          # Remove non-processed files
          pushd ${BLENDER_SCRIPT_DIR}
          rm $LOCAL_FILE_WITH_DATA
          popd
        fi
      else
466
        echo "Average Transversal Momentum too low (minimum accepted is $MIN_AVG_PT). Continue."
467
468
469
470
471

        # Remove non-processed files
        pushd ${BLENDER_SCRIPT_DIR}
        rm $LOCAL_FILE_WITH_DATA
        popd
472
      fi
Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
473
  done
474
  popd
475

476
fi