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
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
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
Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
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

Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
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#')
Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
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
            blender -noaudio --background -P animate_particles.py -- -radius=0.05 \
559
            -duration=${DURATION} -datafile="${LOCAL_FILE_WITH_DATA}"\
560
561
562
             -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