workflow_sketch.sh 8.12 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

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

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

102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
##############################
# 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.
119
120
   -m | --maxparticles VALUE
     Get only events for which its number of particles is smaller than VALUE.
121
122
123
124
125
126
127
128
129
   -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
}
130

131
132
133
134
135
136
137
138
if [[ $HELP = "true" ]]; then
    usage
    exit
else
    echo "-------- Parsed parameters --------"
    echo "URL: $URL"
    echo "Download: $DOWNLOAD"
    echo "Default: $DEFAULT"
139
    echo "Max particles: ${MAX_PARTICLES}"
140
    echo "-----------------------------------"
141
142
143
144
145
146
fi

##############################
# Download Dataset           #
##############################
if [ "$DOWNLOAD" = "true" ]; then
147
148
149
150
151
    if [ -z $URL ]; then
        echo "Error. Must pass the dataset URL."
        usage
        exit
    fi
152
153
154
155
    echo "Downloading data."
    wget $URL
fi

156
157
158
159
######################################
# Established Unique ID based on URL #
######################################
UNIQUEID=$(echo $URL | sed \
160
161
162
163
                     -e "s#http://opendata.cern.ch/##" \
                     -e "s#/AliESDs.root##" \
                     -e "s#files/assets/##" \
                     -e "s#/#_#g")
164
165
echo "The unique ID is $UNIQUEID."

166
##############################
Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
167
# Default synthetic animation#
168
##############################
169
if [ "$DEFAULT" = "true" ]; then
170
171
172
173
174
    echo "Preparing default animation."
    ##############################
    # Phase 1: blender animate   #
    ##############################
    pushd ${BLENDER_SCRIPT_DIR}
175
    blender -noaudio --background -P animate_particles.py -- -radius=0.05 -duration=2 -camera="OverviewCamera" -datafile="d-esd-detail.dat" -simulated_t=0.02 -fps=5 -resolution=100 -stamp_note="Texto no canto"
176
    popd
177
    BLENDER_OUTPUT=.
178
179
180
181
    mkdir --verbose -p ${BLENDER_OUTPUT}
    mv --verbose /tmp/blender ${BLENDER_OUTPUT}
    echo "Done."

182
183
184
##############################
# Animation from file        #
##############################
185
elif [ "$DEFAULT" = "false" ]; then
186

187
  # Verify if AliESDs.root is here
188
189
190
  ALIESD_ROOT_FILE=$(pwd)/AliESDs.root
  if ! [[ -f "$ALIESD_ROOT_FILE" ]]
  then
Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
191
192
      echo "AliESDs.root not found."
      exit
193
194
  fi

195
196
197
  ############################
  # Phase 1: aliroot extract #
  ############################
198
  eval $(alienv -w ${ALIENV_WORK_DIR} -a ${ALIENV_OS_SPEC} load ${ALIENV_ID})
199
  pushd ${ALIROOT_SCRIPT_DIR}
200
201
202
203
204
  # 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
205
  aliroot runAnalysis.C
206

207
208
209
  #################################################
  # Phase 1: iteration for every event identifier #
  #################################################
210

Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
211
  # Create directory where animations will be saved
212
  BLENDER_OUTPUT=$(pwd)/$UNIQUEID
Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
213
214
  mkdir --verbose -p ${BLENDER_OUTPUT}

215
216
217
218
  # 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 | \
219
220
                 sed -e "s#esd_detail-event_##" \
                   -e "s#\.dat##")
221
222
      EVENT_UNIQUE_ID=${UNIQUEID}_${EVENT_ID}

Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
223
      if ! [[ -s $FILE_WITH_DATA ]]; then
224
225
226
          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
227
      fi
228

229
230
231
      ##############################
      # Phase 2: blender animate   #
      ##############################
232
233
234

      LOCAL_FILE_WITH_DATA=${EVENT_UNIQUE_ID}.dat
      cp ${ALIROOT_SCRIPT_DIR}/$FILE_WITH_DATA \
235
236
237
238
239
240
241
       ${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"
242

243
        pushd ${BLENDER_SCRIPT_DIR}
244

245
246
        for type in "BarrelCamera" "OverviewCamera" "ForwardCamera"; do
              echo "Processing ${EVENT_UNIQUE_ID} with $type Camera in blender"
247

248
249
250
251
252
              blender -noaudio --background -P animate_particles.py -- -radius=0.05 -duration=1 -camera=${type} -datafile="${LOCAL_FILE_WITH_DATA}" -n_event=${EVENT_ID} -simulated_t=0.01 -fps=5 -resolution=50 -stamp_note="${EVENT_UNIQUE_ID}"
              # Move generated file to final location
              mv /tmp/blender/* ${BLENDER_OUTPUT}
              echo "${type} for event ${EVENT_ID} done."
        done
253

254
255
        # Move processed file to final location
        mv $LOCAL_FILE_WITH_DATA ${BLENDER_OUTPUT}
256

257
258
259
260
261
262
263
        popd
        echo "EVENT ${EVENT_UNIQUE_ID} DONE with FILE $LOCAL_FILE_WITH_DATA."
      else
          echo "Too much particles (maximum accepted is $MAX_PARTICLES). Continue."
	  rm $FILE_WITH_DATA
        continue
      fi
Lucas Mello Schnorr's avatar
Lucas Mello Schnorr committed
264
  done
265
266
  popd
fi