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
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
          ;;
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
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

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}"
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}

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
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