workflow_sketch.sh 19.8 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
export PATH="/home/schnorr/install/blender-2.79-linux-glibc219-x86_64/:$PATH"

19 20 21
# Progress log file
export PROGRESS_LOG=$(pwd)/progress.log

22 23 24 25 26 27 28 29
if [[ -f $PROGRESS_LOG ]]; then
  if grep -q "JOB FINISHED" $PROGRESS_LOG; then
    rm $PROGRESS_LOG
  fi
fi

# Define a timestamp function
timestamp() {
30
  date +"%y-%m-%d, %T, $1"
31 32
}

33
##############################
34
# Command-line options       #
35
##############################
36 37 38 39 40 41 42 43 44 45 46 47 48 49
# 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

50
OPTIONS=c:hdau:m:n:t:r:
51
LONGOPTS=cameras:,mosaic,resolution:,fps:,transparency:,duration:,maxparticles:,\
52
minparticles:,numberofevents:,minavgpz:,minavgpt:,help,download,sample,url:,its,\
53
tpc,detailedtpc,trd,emcal,blendersave,picpct:
54 55 56 57 58 59 60 61 62 63 64 65 66 67

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

68 69 70
##############################
# Parse Parameters           #
##############################
71
CAMERAS=Overview
72
MOSAIC=false
73 74
DURATION=10
RESOLUTION=100
75
FPS=24
76
TRANSPARENCY=1
77 78 79
MAX_PARTICLES=1000
MIN_PARTICLES=0
N_OF_EVENTS=10
80
MIN_AVG_PZ=0
81
MIN_AVG_PT=0
82 83
HELP=false
DOWNLOAD=false
84
SAMPLE=false
85
URL=
86 87
ITS=1 # 1 means "build this detector", while 0 means "don't"
TPC=1
88
DETAILED_TPC=0
89 90
TRD=1
EMCAL=1
91
BLENDERSAVE=1
92
PICPCT=80
93 94 95
# now enjoy the options in order and nicely split until we see --
while true; do
    case "$1" in
96 97 98 99 100
      -h|--help)
          HELP=true
          shift
          break
          ;;
101
      -d|--download)
102 103 104
          DOWNLOAD=true
          shift
          ;;
105
      -a|--sample)
106 107 108
          SAMPLE=true
          shift
          ;;
109 110
      -u|--url)
          URL="$2"
111 112
            shift 2
            ;;
113 114 115 116
      -m|--maxparticles)
          MAX_PARTICLES="$2"
          shift 2
          ;;
117 118 119 120 121 122 123 124
      --minparticles)
          MIN_PARTICLES="$2"
          shift 2
          ;;
      -n|--numberofevents)
          N_OF_EVENTS="$2"
          shift 2
          ;;
125 126 127 128
      --minavgpz)
          MIN_AVG_PZ="$2"
          shift 2
          ;;
129 130 131 132
      --minavgpt)
          MIN_AVG_PT="$2"
          shift 2
          ;;
133 134 135 136 137 138 139 140
      -t|--duration)
          DURATION="$2"
          shift 2
          ;;
      -r|--resolution)
          RESOLUTION="$2"
          shift 2
          ;;
141 142 143 144
      --fps)
          FPS="$2"
          shift 2
          ;;
145 146
      --transparency)
          TRANSPARENCY="$2"
147 148
          shift 2
          ;;
149 150
      -c|--cameras)
      	  CAMERAS="$2"
151 152
      	  shift 2
      	  ;;
153 154 155 156
      --mosaic)
          MOSAIC=true
          shift
          ;;
157 158 159 160
      --picpct)
      	  PICPCT="$2"
      	  shift 2
      	  ;;
161
      --its)
162 163 164
          ITS=0
          shift
          ;;
165
      --tpc)
166 167 168
          TPC=0
          shift
          ;;
169 170 171 172
      --detailedtpc)
          DETAILED_TPC=1
          shift
          ;;
173
      --trd)
174 175 176
          TRD=0
          shift
          ;;
177
      --emcal)
178 179 180
          EMCAL=0
          shift
          ;;
181 182 183 184
      --blendersave)
          BLENDERSAVE=1
          shift
          ;;
185 186 187 188 189
        --)
            shift
            break
            ;;
        *)
190
            echo "Programming error $*"
191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212
            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.
213
   -m | --maxparticles VALUE
214 215
     Get only events for which its number of particles does not
     exceed VALUE.
216
   --minparticles VALUE
217 218
     Get only events for which its number of particles is greater than
     or equal to VALUE.
219
   -n | --numberofevents VALUE
220
     Set number of events to be animated inside chosen ESD file (defaults to 10)
221 222
   --minavgpz VALUE
     Get only events for which its absolute value of average momentum in
223 224
     the z direction is greater than or equal to VALUE, in GeV/c. Useful
     for animating events with 'boosts' of particles to the same side.
225 226
   --minavgpt VALUE
     Get only events for which its average transversal momentum is
227 228
     greater than or equal to VALUE, in GeV/c. Useful for animating
     events with 'boosts' of particles on the xy plane.
229 230 231
   -t | --duration VALUE
     Set the animation duration in seconds.
   -r | --resolution VALUE
232 233
     Set the animation resolution percentage, where
     VALUE must be an integer from 1 to 100.
234 235
   --fps VALUE
     Set number of frames per second in animation.
236 237 238
   --transparency VALUE
     Set detector transparency as a number greater than zero,
     where zero is full transparency and 1 is standard transparency
239 240
   -c | --cameras VALUE
     Which cameras to use for the animation, where VALUE
241
     is a comma-separated list (without spaces)
242
     Options: Barrel,Side,Forward,Overview (defaults to Overview)
243 244 245 246
   --mosaic
     Make animations in all four available cameras and combine them into
     a single 2x2 clip containing all perspectives, totalizing five generated
     .mp4 videos.
247
   --picpct VALUE
248 249
     Percentage of animation to take HD picture, saved along with the clip,
     where VALUE must be an integer
250
   -a | --sample
251
     Creates a sample Blender animation of Event 2 from URL
252 253
     http://opendata.cern.ch/record/1102/files/assets/alice/2010/LHC10h/000139\
038/ESD/0001/AliESDs.root
254
   --its
255
     Removes ITS detector from animation
256 257
   --detailedtpc
     Includes more detailed version of TPC in animation
258
   --tpc
259
     Removes TPC detector from animation
260
   --trd
261
     Removes TRD detector from animation
262
   --emcal
263
     Removes EMCal detector from animation
264 265
   --blendersave
     Saves Blender file along with animation clip
266 267 268

Example:
--------
269 270
$0 --url http://opendata.cern.ch/record/1103/files/assets/alice/2010/LHC10h/000\
139173/ESD/0004/AliESDs.root --download
271 272 273

END
}
274

275
# Fix CAMERA to be accepted by the for loop
276 277
if [[ $CAMERAS != "" ]]; then
    CAMERAS=$(echo $CAMERAS | sed -e 's#,#Camera #g' -e 's#$#Camera#')
278 279
fi

280
if [[ $MOSAIC == "true" ]]; then
281
    CAMERAS=$(echo "OverviewCamera BarrelCamera SideCamera ForwardCamera")
282 283
fi

284 285 286 287 288 289 290
if [[ $HELP = "true" ]]; then
    usage
    exit
else
    echo "-------- Parsed parameters --------"
    echo "URL: $URL"
    echo "Download: $DOWNLOAD"
291
    echo "Sample: $SAMPLE"
292
    echo "Transparency Parameter: $TRANSPARENCY"
293 294
    echo "Duration: $DURATION"
    echo "Resolution: $RESOLUTION"
295
    echo "FPS: $FPS"
296
    echo "Max particles: ${MAX_PARTICLES}"
297 298
    echo "Min particles: ${MIN_PARTICLES}"
    echo "Number of events: ${N_OF_EVENTS}"
299
    echo "Min Average Z Momentum: ${MIN_AVG_PZ}"
300
    echo "Min Average Transversal Momentum: ${MIN_AVG_PT}"
301
    echo "Cameras: $CAMERAS"
302
    echo "Mosaic: $MOSAIC"
303
    echo "Picture Percentage: ${PICPCT}%"
304
    echo "-----------------------------------"
305 306 307 308
    echo "------------ Detectors ------------"
    if [[ $ITS = 1 ]]; then
      echo "Building ITS"
    fi
309 310 311 312 313 314
    if [[ $DETAILED_TPC = 1 ]]; then
      echo "Building detailed TPC"
    else
      if [[ $TPC = 1 ]]; then
        echo "Building TPC"
      fi
315 316 317 318 319 320 321 322 323 324 325 326
    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 "-----------------------------------"

327 328
fi

329 330 331 332 333
# Get number of frames
FPS_DUR="$FPS $DURATION"
FPS_DUR=$(echo $FPS_DUR | awk '{print $1*$2}')


334 335 336 337 338 339 340
# 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

341

342 343 344 345
##############################
# Download Dataset           #
##############################
if [ "$DOWNLOAD" = "true" ]; then
346
    if [ -z $URL ]; then
347
        echo "Error. Must pass the dataset URL in order to download ESD file."
348 349 350
        usage
        exit
    fi
351

352
    if ! grep -q "ESD DOWNLOAD DONE" $PROGRESS_LOG; then
353 354
      echo "Downloading data."
      wget $URL
355
      timestamp "ESD DOWNLOAD DONE" >> $PROGRESS_LOG
356
    fi
357

358 359 360 361 362 363 364 365 366 367 368 369
    ######################################
    # 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
370

371
##############################
372
# Sample synthetic animation#
373
##############################
374
if [ "$SAMPLE" = "true" ]; then
375
    ##############################
376
    # Phase 1: Blender animate   #
377
    ##############################
378 379 380
    BLENDER_OUTPUT=$(pwd)/sample
    mkdir --verbose -p ${BLENDER_OUTPUT}

381
    pushd ${BLENDER_SCRIPT_DIR}
382 383 384 385
    echo "Preparing sample animation in Blender"

    blender -noaudio --background -P animate_particles.py -- -radius=0.05 \
    -duration=${DURATION} -cameras="${CAMERAS}" -datafile="d-esd-detail.dat" -simulated_t=0.03\
386 387
    -fps=${FPS} -resolution=${RESOLUTION} -transparency=${TRANSPARENCY} \
    -stamp_note="opendata.cern.ch_record_1102_alice_2010_LHC10h_000139038_ESD_0001_2" -its=${ITS}\
388
    -tpc=${TPC} -trd=${TRD} -emcal=${EMCAL} -detailed_tpc=${DETAILED_TPC} \
389 390
    -blendersave=${BLENDERSAVE} -picpct=${PICPCT} -tpc_blender_path=${BLENDER_SCRIPT_DIR} \
    -output_path="${BLENDER_OUTPUT}"
391

392 393 394
    popd
    echo "Done."

395 396 397
##############################
# Animation from file        #
##############################
398
elif [ "$SAMPLE" = "false" ]; then
399

400
  if ! grep -q "DATA_ANALYSIS, FINISHED" $PROGRESS_LOG; then
401 402 403 404 405 406 407 408 409 410 411 412

    # Verify if AliESDs.root is here
    ALIESD_ROOT_FILE=$(pwd)/AliESDs.root
    if ! [[ -f "$ALIESD_ROOT_FILE" ]]
    then
        echo "AliESDs.root not found."
        exit
    fi

    ############################
    # Phase 1: aliroot extract #
    ############################
413
    timestamp "STARTING DATA ANALYSIS" >> $PROGRESS_LOG
414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430
    eval $(alienv -w ${ALIENV_WORK_DIR} -a ${ALIENV_OS_SPEC} load ${ALIENV_ID})
    pushd ${ALIROOT_SCRIPT_DIR}
    # Remove existing symbolic link
    rm -f --verbose AliESDs.root
    # Create a symbolic link to the actual AliESDs.root
    ln --verbose -s ${ALIESD_ROOT_FILE} AliESDs.root
    # Run the extraction tool
    aliroot runAnalysis.C

    if [ "$DOWNLOAD" = "false" ]; then

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

    fi

    popd
431
    timestamp "${UNIQUEID}, DATA_ANALYSIS, FINISHED" >> $PROGRESS_LOG
432 433 434 435 436 437 438 439 440 441

  else
    if [ "$DOWNLOAD" = "false" ]; then

      pushd ${ALIROOT_SCRIPT_DIR}
      UNIQUEID=$(more uniqueid.txt)
      echo "The unique ID is $UNIQUEID."
      popd

    fi
442 443
  fi

444
  if ! grep -q "${UNIQUEID}, ANIMATION DIRECTORY CREATED" $PROGRESS_LOG ; then
445 446 447 448

    # Create directory where animations will be saved
    BLENDER_OUTPUT=$(pwd)/$UNIQUEID
    mkdir --verbose -p ${BLENDER_OUTPUT}
449

450
    timestamp "${UNIQUEID}, ANIMATION DIRECTORY CREATED" >> $PROGRESS_LOG
451 452
  else
    BLENDER_OUTPUT=$(pwd)/$UNIQUEID
453 454 455 456
  fi

  pushd ${ALIROOT_SCRIPT_DIR} # push back to aliroot directory

457
  if ! grep -q "${UNIQUEID}, DATA ANALYSIS FILES MOVED to animation directory" $PROGRESS_LOG; then
458 459 460
    #################################################
    # Phase 1: iteration for every event identifier #
    #################################################
461

462 463
    # Get all extracted files
    EXTRACTED_FILES=$(ls -1 esd_detail-event_*.dat | sort --version-sort)
464

465
    for FILE_WITH_DATA in $EXTRACTED_FILES; do
466

467 468
        if ! [[ -s $FILE_WITH_DATA ]]; then
            echo "File $FILE_WITH_DATA has zero size. Ignore and continue."
469
  	        rm -f $FILE_WITH_DATA
470 471
            continue
        fi
472

473 474
        mv ${ALIROOT_SCRIPT_DIR}/$FILE_WITH_DATA \
         ${BLENDER_SCRIPT_DIR}
475

476
    done
477

478
    timestamp "${UNIQUEID}, DATA ANALYSIS FILES MOVED to animation directory" >> $PROGRESS_LOG
479

480
  fi
481

482 483
  popd
  pushd ${BLENDER_SCRIPT_DIR}
484

485
  if ! grep -q "${UNIQUEID}, CREATED EVENT COUNTER FILE" $PROGRESS_LOG; then
486

487
    # Event counter for animating no more events than the informed amount
488
    rm -f event_counter.txt
489 490
    EVENT_COUNTER=0
    echo "$EVENT_COUNTER" > event_counter.txt
491
    timestamp "${UNIQUEID}, CREATED EVENT COUNTER FILE" >> $PROGRESS_LOG
492 493 494

  fi

495
  if ! grep -q "${UNIQUEID}, DATA FILES RENAMED according to UNIQUEID" $PROGRESS_LOG; then
496 497 498 499 500 501 502 503 504 505 506 507 508 509 510

    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 | \
                   sed -e "s#esd_detail-event_##" \
                     -e "s#\.dat##")
        EVENT_UNIQUE_ID=${UNIQUEID}_${EVENT_ID}

        LOCAL_FILE_WITH_DATA=${EVENT_UNIQUE_ID}.dat

        mv $FILE_WITH_DATA $LOCAL_FILE_WITH_DATA

    done
511

512
    timestamp "${UNIQUEID}, DATA FILES RENAMED according to UNIQUEID" >> $PROGRESS_LOG
513

514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550
  fi

  EXTRACTED_FILES=$(ls -1 ${UNIQUEID}_*.dat | sort --version-sort)

  for LOCAL_FILE_WITH_DATA in $EXTRACTED_FILES; do

    pushd ${BLENDER_SCRIPT_DIR}

    EVENT_ID=$(echo $LOCAL_FILE_WITH_DATA | \
               sed -e "s#${UNIQUEID}_##" \
                 -e "s#\.dat##")
    EVENT_UNIQUE_ID=${UNIQUEID}_${EVENT_ID}

    ##############################
    # Phase 2: blender animate   #
    ##############################

    NUMBER_OF_PARTICLES=$(wc -l $LOCAL_FILE_WITH_DATA | \
                      awk '{ print $1 }')

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

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

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

    EVENT_COUNTER=$(more event_counter.txt)

    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

551
          if ! grep -q "${UNIQUEID}, ${EVENT_ID}, SCENE, FINISHED" $PROGRESS_LOG; then
552 553

            echo "Processing ${EVENT_UNIQUE_ID} ($NUMBER_OF_PARTICLES tracks) in Blender"
554 555 556

            echo "Processing ${EVENT_UNIQUE_ID} in Blender"

557
            timestamp "${UNIQUEID}, ${EVENT_ID}, SCENE, STARTING, $NUMBER_OF_PARTICLES" >> $PROGRESS_LOG
558 559 560 561 562
            blender -noaudio --background -P animate_particles.py -- -radius=0.05 \
            -duration=${DURATION} -cameras="${CAMERAS}" -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} -detailed_tpc=${DETAILED_TPC} \
563 564
            -blendersave=${BLENDERSAVE} -picpct=${PICPCT} -tpc_blender_path=${BLENDER_SCRIPT_DIR}\
            -output_path="${BLENDER_OUTPUT}"
565
            timestamp "${UNIQUEID}, ${EVENT_ID}, SCENE, FINISHED, $NUMBER_OF_PARTICLES" >> $PROGRESS_LOG
566

567
          fi
568

569

570
          for type in $CAMERAS; do
571

572 573
            if ! grep -q "${UNIQUEID}, ${EVENT_ID}, ${type}, FINISHED" $PROGRESS_LOG; then
              timestamp "${UNIQUEID}, ${EVENT_ID}, ${type}, STARTING, $NUMBER_OF_PARTICLES" >> $PROGRESS_LOG
574 575 576
              blender -noaudio --background -P render.py -- -cam ${type} -datafile\
               "${LOCAL_FILE_WITH_DATA}" -n_event ${EVENT_ID} -pic_pct ${PICPCT} -output_path "${BLENDER_OUTPUT}"

577
              timestamp "${UNIQUEID}, ${EVENT_ID}, ${type}, FINISHED, $NUMBER_OF_PARTICLES" >> $PROGRESS_LOG
578 579 580 581 582 583
            fi

          done

          if [ "$MOSAIC" = "true" ]; then

584
            if ! grep -q "${UNIQUEID}, ${EVENT_ID}, MOSAIC, FINISHED" $PROGRESS_LOG; then
585
              pushd ${BLENDER_OUTPUT}
586

587 588
              timestamp "${UNIQUEID}, ${EVENT_ID}, MOSAIC, STARTING, $NUMBER_OF_PARTICLES" >> $PROGRESS_LOG

589 590 591 592 593
              # Delete existing incomplete .mp4 file
              if [[ -f ${EVENT_UNIQUE_ID}_Mosaic.mp4 ]]; then
                rm ${EVENT_UNIQUE_ID}_Mosaic.mp4
              fi

594
              # Setting input names for clips in order to make mosaic clip
595 596 597 598
              INPUT_ONE=$(ls *$EVENT_UNIQUE_ID*${FPS_DUR}.mp4 | awk 'NR==1')
              INPUT_TWO=$(ls *$EVENT_UNIQUE_ID*${FPS_DUR}.mp4 | awk 'NR==2')
              INPUT_THREE=$(ls *$EVENT_UNIQUE_ID*${FPS_DUR}.mp4 | awk 'NR==3')
              INPUT_FOUR=$(ls *$EVENT_UNIQUE_ID*${FPS_DUR}.mp4 | awk 'NR==4')
599

600 601 602
              ffmpeg -i ${INPUT_FOUR} -i ${INPUT_TWO} -i ${INPUT_THREE} -i ${INPUT_ONE} -filter_complex\
               "[0:v][1:v]hstack=inputs=2[top];[2:v][3:v]hstack=inputs=2[bottom];[top][bottom]vstack=inputs=2[v]"\
               -map "[v]" ${EVENT_UNIQUE_ID}_Mosaic.mp4
603

604
              timestamp "${UNIQUEID}, ${EVENT_ID}, MOSAIC, FINISHED, $NUMBER_OF_PARTICLES" >> $PROGRESS_LOG
605

606
              popd
607 608
            fi

609
          fi
610

611
          if ! grep -q "${UNIQUEID}, ${EVENT_ID}, TEXT DATA MOVED to final location" $PROGRESS_LOG; then
612 613
            # Move processed file to final location
            mv $LOCAL_FILE_WITH_DATA ${BLENDER_OUTPUT}/$LOCAL_FILE_WITH_DATA
614
            timestamp "${UNIQUEID}, ${EVENT_ID}, TEXT DATA MOVED to final location" >> $PROGRESS_LOG
615
          fi
616

617
          echo "EVENT ${EVENT_UNIQUE_ID} DONE with FILE $LOCAL_FILE_WITH_DATA."
618

619 620
          # Increment event counter
          EVENT_COUNTER=$EVENT_COUNTER+1
621
          rm -f event_counter.txt
622
          echo "$EVENT_COUNTER" > event_counter.txt
623

624
        else
625

626 627 628 629 630 631
          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."
632
          fi
633

634
          # Remove non-processed files
635
          rm -f $LOCAL_FILE_WITH_DATA
636

637 638
        fi
      else
639
        echo "Average Z Momentum too low (minimum accepted is $MIN_AVG_PZ). Continue."
640 641

        # Remove non-processed files
642
        rm -f $LOCAL_FILE_WITH_DATA
643
      fi
644 645 646 647
    else
      echo "Average Transversal Momentum too low (minimum accepted is $MIN_AVG_PT). Continue."

      # Remove non-processed files
648
      rm -f $LOCAL_FILE_WITH_DATA
649 650 651 652
    fi

    popd

Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
653
  done
654

655 656
  # Remove event counter file
  pushd ${BLENDER_SCRIPT_DIR}
657
  rm -f event_counter.txt
658
  popd
659

660
fi
661
timestamp "${UNIQUEID}, JOB FINISHED" >> $PROGRESS_LOG