workflow_sketch.sh 14.3 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
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
75
76
# now enjoy the options in order and nicely split until we see --
while true; do
    case "$1" in
77
78
79
80
81
      -h|--help)
          HELP=true
          shift
          break
          ;;
82
      -d|--download)
83
84
85
            DOWNLOAD=true
            shift
            ;;
86
87
      -a|--sample)
            SAMPLE=true
88
89
            shift
            ;;
90
91
      -u|--url)
          URL="$2"
92
93
            shift 2
            ;;
94
95
96
97
      -m|--maxparticles)
          MAX_PARTICLES="$2"
          shift 2
          ;;
98
99
100
101
102
103
104
105
      --minparticles)
          MIN_PARTICLES="$2"
          shift 2
          ;;
      -n|--numberofevents)
          N_OF_EVENTS="$2"
          shift 2
          ;;
106
107
108
109
      --minavgpz)
          MIN_AVG_PZ="$2"
          shift 2
          ;;
110
111
112
113
      --minavgpt)
          MIN_AVG_PT="$2"
          shift 2
          ;;
114
115
116
117
118
119
120
121
      -t|--duration)
          DURATION="$2"
          shift 2
          ;;
      -r|--resolution)
          RESOLUTION="$2"
          shift 2
          ;;
122
123
124
125
      --fps)
          FPS="$2"
          shift 2
          ;;
126
127
      --transparency)
          TRANSPARENCY="$2"
128
129
          shift 2
          ;;
Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
130
      -c|--camera)
131
132
133
      	  CAMERA="$2"
      	  shift 2
      	  ;;
134
      --its)
135
136
137
          ITS=0
          shift
          ;;
138
      --tpc)
139
140
141
          TPC=0
          shift
          ;;
142
      --trd)
143
144
145
          TRD=0
          shift
          ;;
146
      --emcal)
147
148
149
          EMCAL=0
          shift
          ;;
150
151
152
153
      --blendersave)
          BLENDERSAVE=1
          shift
          ;;
154
155
156
157
158
        --)
            shift
            break
            ;;
        *)
159
            echo "Programming error $*"
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
            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.
182
   -m | --maxparticles VALUE
183
184
     Get only events for which its number of particles does not
     exceed VALUE.
185
   --minparticles VALUE
186
187
     Get only events for which its number of particles is greater than
     or equal to VALUE.
188
189
   -n | --numberofevents VALUE
     Set number of events to be animated inside chosen ESD file.
190
191
192
193
   --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.
194
195
196
197
   --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.
198
199
200
201
   -t | --duration VALUE
     Set the animation duration in seconds.
   -r | --resolution VALUE
     Set the animation resolution percentage.
202
203
   --fps VALUE
     Set number of frames per second in animation.
204
205
206
   --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
207
208
209
   -c | --camera VALUE
     Which camera to use for the animation, where VALUE
     is a comma-separated list (without spaces)
210
     Options: Barrel,Forward,Overview (defaults to Overview)
211
   -a | --sample
212
213
     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
214
   --its
215
     Removes ITS detector from animation
216
   --tpc
217
     Removes TPC detector from animation
218
   --trd
219
     Removes TRD detector from animation
220
   --emcal
221
     Removes EMCal detector from animation
222
223
   --blendersave
     Saves Blender file along with animation clip
224
225
226
227
228
229
230

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

END
}
231

Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
232
233
234
235
236
# Fix CAMERA to be accepted by the for loop
if [[ $CAMERA != "" ]]; then
    CAMERA=$(echo $CAMERA | sed -e 's#,#Camera #g' -e 's#$#Camera#')
fi

237
238
239
240
241
242
243
if [[ $HELP = "true" ]]; then
    usage
    exit
else
    echo "-------- Parsed parameters --------"
    echo "URL: $URL"
    echo "Download: $DOWNLOAD"
244
    echo "Sample: $SAMPLE"
245
    echo "Transparency Parameter: $TRANSPARENCY"
246
247
    echo "Duration: $DURATION"
    echo "Resolution: $RESOLUTION"
248
    echo "FPS: $FPS"
249
    echo "Max particles: ${MAX_PARTICLES}"
250
251
    echo "Min particles: ${MIN_PARTICLES}"
    echo "Number of events: ${N_OF_EVENTS}"
252
    echo "Min Average Z Momentum: ${MIN_AVG_PZ}"
253
    echo "Min Average Transversal Momentum: ${MIN_AVG_PT}"
Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
254
    echo "Camera: $CAMERA"
255
    echo "-----------------------------------"
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
    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 "-----------------------------------"

274
275
fi

276
277
278
279
280
281
282
# 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

283
284
285
286
##############################
# Download Dataset           #
##############################
if [ "$DOWNLOAD" = "true" ]; then
287
    if [ -z $URL ]; then
288
        echo "Error. Must pass the dataset URL in order to download ESD file."
289
290
291
        usage
        exit
    fi
292
293
294
    echo "Downloading data."
    wget $URL

295
296
297
298
299
300
301
302
303
304
305
306
    ######################################
    # 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
307

308
##############################
309
# Sample synthetic animation#
310
##############################
311
if [ "$SAMPLE" = "true" ]; then
312
    ##############################
313
    # Phase 1: Blender animate   #
314
315
    ##############################
    pushd ${BLENDER_SCRIPT_DIR}
316
    for type in $CAMERA; do
317
      echo "Preparing sample animation with $type in Blender"
318
      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}
319
    done
320
    popd
321
    BLENDER_OUTPUT=.
322
323
324
325
    mkdir --verbose -p ${BLENDER_OUTPUT}
    mv --verbose /tmp/blender ${BLENDER_OUTPUT}
    echo "Done."

326
327
328
##############################
# Animation from file        #
##############################
329
elif [ "$SAMPLE" = "false" ]; then
330

331
  # Verify if AliESDs.root is here
332
333
334
  ALIESD_ROOT_FILE=$(pwd)/AliESDs.root
  if ! [[ -f "$ALIESD_ROOT_FILE" ]]
  then
Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
335
336
      echo "AliESDs.root not found."
      exit
337
338
  fi

339
340
341
  ############################
  # Phase 1: aliroot extract #
  ############################
342
  eval $(alienv -w ${ALIENV_WORK_DIR} -a ${ALIENV_OS_SPEC} load ${ALIENV_ID})
343
  pushd ${ALIROOT_SCRIPT_DIR}
344
  # Remove existing symbolic link
345
  rm -f --verbose AliESDs.root
346
347
348
  # Create a symbolic link to the actual AliESDs.root
  ln --verbose -s ${ALIESD_ROOT_FILE} AliESDs.root
  # Run the extraction tool
349
  aliroot runAnalysis.C
350

351
352
353
354
355
356
357
358
359
360
361
362
363
364
  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

365
366
367
  #################################################
  # Phase 1: iteration for every event identifier #
  #################################################
368

369
370
371
  # Event counter for animating no more events than the informed amount
  EVENT_COUNTER=0

372
373
374
375
  # 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 | \
376
377
                 sed -e "s#esd_detail-event_##" \
                   -e "s#\.dat##")
378
379
      EVENT_UNIQUE_ID=${UNIQUEID}_${EVENT_ID}

Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
380
      if ! [[ -s $FILE_WITH_DATA ]]; then
381
          echo "File $FILE_WITH_DATA has zero size. Ignore and continue."
382
	        rm $FILE_WITH_DATA
383
          continue
Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
384
      fi
385

386
387
388
      ##############################
      # Phase 2: blender animate   #
      ##############################
389
390
391

      LOCAL_FILE_WITH_DATA=${EVENT_UNIQUE_ID}.dat
      cp ${ALIROOT_SCRIPT_DIR}/$FILE_WITH_DATA \
392
393
       ${BLENDER_SCRIPT_DIR}/${LOCAL_FILE_WITH_DATA}

394
395
      rm $FILE_WITH_DATA

396
397
      NUMBER_OF_PARTICLES=$(wc -l ${BLENDER_SCRIPT_DIR}/$LOCAL_FILE_WITH_DATA | \
                        awk '{ print $1 }')
398

399
400
      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})

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

403
404
405
      echo "File $LOCAL_FILE_WITH_DATA has $NUMBER_OF_PARTICLES particles."
      echo "Average Z momentum: $AVERAGE_PZ"
      echo "Average transversal momentum $AVERAGE_PT"
406

407
408
409
      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
410

411
412
            # Increment event counter
            EVENT_COUNTER=$EVENT_COUNTER+1
413

414
            echo "Processing ${EVENT_UNIQUE_ID} ($NUMBER_OF_PARTICLES tracks) in Blender"
415

416
            pushd ${BLENDER_SCRIPT_DIR}
417

418
419
            for type in $CAMERA; do
                  echo "Processing ${EVENT_UNIQUE_ID} with $type in Blender"
420

421
422
423
424
425
                  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}
                  # Move generated file to final location
                  mv /tmp/blender/* ${BLENDER_OUTPUT}
                  echo "${type} for event ${EVENT_UNIQUE_ID} done."
            done
426

427
428
            # Move processed file to final location
            mv $LOCAL_FILE_WITH_DATA ${BLENDER_OUTPUT}/$LOCAL_FILE_WITH_DATA
429

430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
            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
448
          fi
449
450
        else
          echo "Average Z Momentum too low (minimum accepted is $MIN_AVG_PZ). Continue."
451

452
453
454
455
456
457
          # Remove non-processed files
          pushd ${BLENDER_SCRIPT_DIR}
          rm $LOCAL_FILE_WITH_DATA
          popd
        fi
      else
458
        echo "Average Transversal Momentum too low (minimum accepted is $MIN_AVG_PT). Continue."
459
460
461
462
463

        # Remove non-processed files
        pushd ${BLENDER_SCRIPT_DIR}
        rm $LOCAL_FILE_WITH_DATA
        popd
464
      fi
Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
465
  done
466
  popd
467

468
fi