workflow_sketch.sh 8.6 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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
            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.
122
123
   -m | --maxparticles VALUE
     Get only events for which its number of particles is smaller than VALUE.
124
125
126
127
   -t | --duration VALUE
     Set the animation duration in seconds.
   -r | --resolution VALUE
     Set the animation resolution percentage.
128
129
130
131
132
133
134
135
136
   -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
}
137

138
139
140
141
142
143
144
145
if [[ $HELP = "true" ]]; then
    usage
    exit
else
    echo "-------- Parsed parameters --------"
    echo "URL: $URL"
    echo "Download: $DOWNLOAD"
    echo "Default: $DEFAULT"
146
    echo "Max particles: ${MAX_PARTICLES}"
147
    echo "-----------------------------------"
148
149
fi

150
151
152
153
154
if [[ $URL = "" ]]; then
    echo "URL parameter is obligatory."
    exit
    usage
fi
155
156
157
158
159
160
161
162

# 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

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

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

186
##############################
Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
187
# Default synthetic animation#
188
##############################
189
if [ "$DEFAULT" = "true" ]; then
190
191
192
193
194
    echo "Preparing default animation."
    ##############################
    # Phase 1: blender animate   #
    ##############################
    pushd ${BLENDER_SCRIPT_DIR}
195
    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"
196
    popd
197
    BLENDER_OUTPUT=.
198
199
200
201
    mkdir --verbose -p ${BLENDER_OUTPUT}
    mv --verbose /tmp/blender ${BLENDER_OUTPUT}
    echo "Done."

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

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

215
216
217
  ############################
  # Phase 1: aliroot extract #
  ############################
218
  eval $(alienv -w ${ALIENV_WORK_DIR} -a ${ALIENV_OS_SPEC} load ${ALIENV_ID})
219
  pushd ${ALIROOT_SCRIPT_DIR}
220
221
222
223
224
  # 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
225
  aliroot runAnalysis.C
226

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

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

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

Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
243
      if ! [[ -s $FILE_WITH_DATA ]]; then
244
245
246
          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
247
      fi
248

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

      LOCAL_FILE_WITH_DATA=${EVENT_UNIQUE_ID}.dat
      cp ${ALIROOT_SCRIPT_DIR}/$FILE_WITH_DATA \
255
256
257
258
259
260
261
       ${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"
262

263
        pushd ${BLENDER_SCRIPT_DIR}
264

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

268
              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}"
269
270
              # Move generated file to final location
              mv /tmp/blender/* ${BLENDER_OUTPUT}
Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
271
              echo "${type} for event ${EVENT_UNIQUE_ID} done."
272
        done
273

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

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