workflow_sketch.sh 8.59 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
#!/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/
# Directory where blender scripts are
export BLENDER_SCRIPT_DIR=$(pwd)/animate/
# alienv working directory
13
export ALIENV_WORK_DIR=/mnt/SSD/schnorr/ALICE/sw/
Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
14
export ALIENV_OS_SPEC=ubuntu1604_x86-64
15
16
17
18
19
export ALIENV_ID=AliPhysics/latest-aliroot5-user
# Put blender 2.79b in the PATH env var
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

Breno Rilho Lemos's avatar
Breno Rilho Lemos committed
36
OPTIONS=hdau:m:t:r:
37
LONGOPTS=resolution:,duration:,maxparticles:,help,download,default,url:
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
56
DURATION=10
RESOLUTION=100
57
MAX_PARTICLES=0
58
59
60
HELP=false
DOWNLOAD=false
DEFAULT=false
61
URL=
62
63
64
# now enjoy the options in order and nicely split until we see --
while true; do
    case "$1" in
65
66
67
68
69
      -h|--help)
          HELP=true
          shift
          break
          ;;
70
      -d|--download)
71
72
73
            DOWNLOAD=true
            shift
            ;;
74
      -a|--default)
75
76
77
            DEFAULT=true
            shift
            ;;
78
79
      -u|--url)
          URL="$2"
80
81
            shift 2
            ;;
82
83
84
85
      -m|--maxparticles)
          MAX_PARTICLES="$2"
          shift 2
          ;;
86
87
88
89
90
91
92
93
      -t|--duration)
          DURATION="$2"
          shift 2
          ;;
      -r|--resolution)
          RESOLUTION="$2"
          shift 2
          ;;
94
95
96
97
98
        --)
            shift
            break
            ;;
        *)
99
            echo "Programming error $*"
100
101
102
103
104
105
106
107
            exit 3
            ;;
    esac
done

# handle non-option arguments
if [[ $# -ne 0 ]]; then
    echo "$0: non-option arguments ($#, $*) are ignored."
108
109
    echo "Remove them manually as indicated between parenthesis."
    exit
110
111
fi

112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
##############################
# 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.
129
130
   -m | --maxparticles VALUE
     Get only events for which its number of particles is smaller than VALUE.
131
132
133
134
   -t | --duration VALUE
     Set the animation duration in seconds.
   -r | --resolution VALUE
     Set the animation resolution percentage.
135
136
137
138
139
140
141
142
143
   -a | --default
     Creates a default animation with blender.

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

END
}
144

145
146
147
148
149
150
151
152
if [[ $HELP = "true" ]]; then
    usage
    exit
else
    echo "-------- Parsed parameters --------"
    echo "URL: $URL"
    echo "Download: $DOWNLOAD"
    echo "Default: $DEFAULT"
153
    echo "Max particles: ${MAX_PARTICLES}"
154
    echo "-----------------------------------"
155
156
fi

157
158
159
160
161
if [[ $URL = "" ]]; then
    echo "URL parameter is obligatory."
    exit
    usage
fi
162
163
164
165
##############################
# Download Dataset           #
##############################
if [ "$DOWNLOAD" = "true" ]; then
166
167
168
169
170
    if [ -z $URL ]; then
        echo "Error. Must pass the dataset URL."
        usage
        exit
    fi
171
172
173
174
    echo "Downloading data."
    wget $URL
fi

175
176
177
178
######################################
# Established Unique ID based on URL #
######################################
UNIQUEID=$(echo $URL | sed \
179
180
181
182
                     -e "s#http://opendata.cern.ch/##" \
                     -e "s#/AliESDs.root##" \
                     -e "s#files/assets/##" \
                     -e "s#/#_#g")
183
184
echo "The unique ID is $UNIQUEID."

185
##############################
Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
186
# Default synthetic animation#
187
##############################
188
if [ "$DEFAULT" = "true" ]; then
189
190
191
192
193
    echo "Preparing default animation."
    ##############################
    # Phase 1: blender animate   #
    ##############################
    pushd ${BLENDER_SCRIPT_DIR}
194
    blender -noaudio --background -P animate_particles.py -- -radius=0.05 -duration=${DURATION} -camera="OverviewCamera" -datafile="d-esd-detail.dat" -simulated_t=0.03 -fps=24 -resolution=${RESOLUTION} -stamp_note="Default animation"
195
    popd
196
    BLENDER_OUTPUT=.
197
198
199
200
    mkdir --verbose -p ${BLENDER_OUTPUT}
    mv --verbose /tmp/blender ${BLENDER_OUTPUT}
    echo "Done."

201
202
203
##############################
# Animation from file        #
##############################
204
elif [ "$DEFAULT" = "false" ]; then
205

206
  # Verify if AliESDs.root is here
207
208
209
  ALIESD_ROOT_FILE=$(pwd)/AliESDs.root
  if ! [[ -f "$ALIESD_ROOT_FILE" ]]
  then
Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
210
211
      echo "AliESDs.root not found."
      exit
212
213
  fi

214
215
216
  ############################
  # Phase 1: aliroot extract #
  ############################
217
  eval $(alienv -w ${ALIENV_WORK_DIR} -a ${ALIENV_OS_SPEC} load ${ALIENV_ID})
218
  pushd ${ALIROOT_SCRIPT_DIR}
219
220
221
222
223
  # Remove existing symbolic link
  rm --verbose AliESDs.root
  # Create a symbolic link to the actual AliESDs.root
  ln --verbose -s ${ALIESD_ROOT_FILE} AliESDs.root
  # Run the extraction tool
224
  aliroot runAnalysis.C
225

226
227
228
  #################################################
  # Phase 1: iteration for every event identifier #
  #################################################
229

Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
230
  # Create directory where animations will be saved
231
  BLENDER_OUTPUT=$(pwd)/$UNIQUEID
Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
232
233
  mkdir --verbose -p ${BLENDER_OUTPUT}

234
235
236
237
  # 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 | \
238
239
                 sed -e "s#esd_detail-event_##" \
                   -e "s#\.dat##")
240
241
      EVENT_UNIQUE_ID=${UNIQUEID}_${EVENT_ID}

Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
242
      if ! [[ -s $FILE_WITH_DATA ]]; then
243
244
245
          echo "File $FILE_WITH_DATA has zero size. Ignore and continue."
	  rm $FILE_WITH_DATA
          continue
Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
246
      fi
247

248
249
250
      ##############################
      # Phase 2: blender animate   #
      ##############################
251
252
253

      LOCAL_FILE_WITH_DATA=${EVENT_UNIQUE_ID}.dat
      cp ${ALIROOT_SCRIPT_DIR}/$FILE_WITH_DATA \
254
255
256
257
258
259
260
       ${BLENDER_SCRIPT_DIR}/${LOCAL_FILE_WITH_DATA}

      NUMBER_OF_PARTICLES=$(wc -l ${BLENDER_SCRIPT_DIR}/$LOCAL_FILE_WITH_DATA | \
                        awk '{ print $1 }')
      echo "File $LOCAL_FILE_WITH_DATA has $NUMBER_OF_PARTICLES particles"
      if [[ $NUMBER_OF_PARTICLES -lt $MAX_PARTICLES ]]; then
        echo "Processing ${EVENT_UNIQUE_ID} ($NUMBER_OF_PARTICLES) in blender"
261

262
        pushd ${BLENDER_SCRIPT_DIR}
263

264
265
        for type in "BarrelCamera" "OverviewCamera" "ForwardCamera"; do
              echo "Processing ${EVENT_UNIQUE_ID} with $type Camera in blender"
266

267
              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=24 -resolution=${RESOLUTION} -stamp_note="${EVENT_UNIQUE_ID}"
268
269
270
271
              # Move generated file to final location
              mv /tmp/blender/* ${BLENDER_OUTPUT}
              echo "${type} for event ${EVENT_ID} done."
        done
272

273
274
        # Move processed file to final location
        mv $LOCAL_FILE_WITH_DATA ${BLENDER_OUTPUT}
275

276
277
278
        popd
        echo "EVENT ${EVENT_UNIQUE_ID} DONE with FILE $LOCAL_FILE_WITH_DATA."
      else
279
          echo "Too many particles (maximum accepted is $MAX_PARTICLES). Continue."
280
281
282
	  rm $FILE_WITH_DATA
        continue
      fi
Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
283
  done
284
285
  popd
fi