]> Creatis software - clitk.git/blob - cluster_tools/gate_power_merge.sh
return if any merge call fail
[clitk.git] / cluster_tools / gate_power_merge.sh
1 #!/usr/bin/env bash
2
3 set -u 
4
5 function error {
6 echo "ERROR: $1"
7 exit 1
8 }
9
10 warning_count=0
11 function warning {
12 let "warning_count++"
13 echo "WARNING: $1"
14 }
15
16 function start_bar {
17 count_max="${1:?"provide count max"}"
18 }
19
20 function update_bar {
21 local count="${1:?"provide count"}"
22 local message="${2:?"provide message"}"
23 local percent=$(echo "100*${count}/${count_max}" | bc)
24 #printf "[%03d/%03d] %3d%% %-80.80s\r" ${count} ${count_max} ${percent} "${message}"
25 printf "[%03d/%03d] %3d%% %-80.80s\n" ${count} ${count_max} ${percent} "${message}"
26 }
27
28 function end_bar {
29 unset count_max
30 #echo -ne '\n'
31 }
32
33 rootMerger="clitkMergeRootFiles"
34 test -x "./clitkMergeRootFiles" && rootMerger="./clitkMergeRootFiles"
35
36 function merge_root {
37 local merged="$1"
38 shift
39 echo "  ${indent}entering root merger"
40 echo "  ${indent}merger is ${rootMerger}"
41 echo "  ${indent}creating ${merged}"
42 local count=0
43 local arguments=" -o ${merged}"
44 while test $# -gt 0
45 do
46     local partial="$1"
47     shift
48     let count++
49     local arguments=" -i ${partial} ${arguments}"
50 done
51 ${rootMerger} ${arguments} > /dev/null || { warning "error while calling ${rootMerger}" && return; }
52 echo "  ${indent}merged ${count} files"
53 }
54
55 statMerger="mergeStatFile.py"
56 test -x "./mergeStatFile.sh" && statMerger="./mergeStatFile.sh"
57 test -x "./mergeStatFile.py" && statMerger="./mergeStatFile.py"
58
59 function merge_stat {
60 local merged="$1"
61 shift
62 echo "  ${indent}entering stat merger"
63 echo "  ${indent}merger is ${statMerger}"
64 echo "  ${indent}creating ${merged}"
65 local count=0
66 start_bar $#
67 while test $# -gt 0
68 do
69     local partial="$1"
70     shift
71     let count++
72
73     if test ! -f "${merged}"
74     then
75         update_bar ${count} "copying first partial result ${partial}"
76         cp "${partial}" "${merged}"
77         continue
78     fi
79
80     update_bar ${count} "adding ${partial}"
81     ${statMerger} -i "${merged}" -j "${partial}" -o "${merged}" 2> /dev/null > /dev/null || { warning "error while calling ${statMerger}" && return; }
82 done
83 end_bar
84 echo "  ${indent}merged ${count} files"
85 }
86
87 txtImageMerger="clitkMergeAsciiDoseActor"
88 test -f "./clitkMergeAsciiDoseActor" && txtImageMerger="./clitkMergeAsciiDoseActor"
89
90 function merge_txt_image {
91 local merged="$1"
92 shift
93 echo "  ${indent}entering text image merger"
94 echo "  ${indent}merger is ${txtImageMerger}"
95 echo "  ${indent}creating ${merged}"
96 local count=0
97 start_bar $#
98 while test $# -gt 0
99 do
100     local partial="$1"
101     shift
102     let count++
103
104     if test ! -f "${merged}"
105     then
106         update_bar ${count} "copying first partial result ${partial}"
107         cp "${partial}" "${merged}"
108         continue
109     fi
110
111     update_bar ${count} "adding ${partial}"
112     local header="$(cat "${merged}" | head -n 6)"
113     local tmp="$(mktemp)"
114     ${txtImageMerger} -i "${partial}" -j "${merged}" -o "${tmp}" 2> /dev/null > /dev/null || { warning "error while calling ${txtImageMerger}" && return; }
115     echo "${header}" > "${merged}"
116     grep -v '## Merge' "${tmp}" >> "${merged}"
117     rm "${tmp}"
118 done
119 end_bar
120 echo "  ${indent}merged ${count} files"
121 }
122
123 hdrImageMerger="clitkImageArithm"
124 test -x "./clitkImageArithm" && hdrImageMerger="./clitkImageArithm"
125
126 function merge_hdr_image {
127 local merged="$1"
128 local merged_bin="${merged%.*}.img"
129 shift
130 echo "  ${indent}entering hdr image merger"
131 echo "  ${indent}merger is ${hdrImageMerger}"
132 echo "  ${indent}creating ${merged}"
133 local count=0
134 start_bar $#
135 while test $# -gt 0
136 do
137     local partial="$1"
138     local partial_bin="${partial%.*}.img"
139     shift
140     let count++
141
142     if test ! -f "${merged}"
143     then
144         update_bar ${count} "copying first partial result ${partial}"
145         cp "${partial}" "${merged}"
146         cp "${partial_bin}" "${merged_bin}"
147         continue
148     fi
149
150     update_bar ${count} "adding ${partial}"
151     ${hdrImageMerger} -t 0 -i "${partial}" -j "${merged}" -o "${merged}" 2> /dev/null > /dev/null || { warning "error while calling ${hdrImageMerger}" && return; }
152 done
153 end_bar
154 echo "  ${indent}merged ${count} files"
155 }
156
157 function merge_dispatcher {
158     local indent="  ** "
159     local outputfile="${1:?"provide output filename"}"
160     echo "merging ${outputfile}"
161
162     local partialoutputfiles="$(find "${rundir}" -type f -name "${outputfile}")"
163     local nboutputfiles="$(echo "${partialoutputfiles}" | wc -l)"
164     if test ${nboutputdirs} -ne ${nboutputfiles}
165     then
166         warning "missing files"
167         return
168     fi
169
170     local firstpartialoutputfile="$(echo "${partialoutputfiles}" | head -n 1)"
171     local firstpartialoutputextension="${firstpartialoutputfile##*.}"
172     echo "${indent}testing file type on ${firstpartialoutputfile}"
173
174     if test "${firstpartialoutputextension}" == "hdr"
175     then
176         echo "${indent}this is a analyse image"
177         local mergedfile="${outputdir}/$(basename "${firstpartialoutputfile}")"
178         merge_hdr_image "${mergedfile}" ${partialoutputfiles} || error "error while merging"
179         return
180     fi
181
182     if test "${firstpartialoutputextension}" == "root"
183     then
184         echo "${indent}this is a root file"
185         local mergedfile="${outputdir}/$(basename "${firstpartialoutputfile}")"
186         merge_root "${mergedfile}" ${partialoutputfiles} || error "error while merging"
187         return
188     fi
189
190     if test "${firstpartialoutputextension}" == "txt" && grep 'NumberOfEvent' "${firstpartialoutputfile}" > /dev/null
191     then
192         echo "${indent}this is a stat file"
193         local mergedfile="${outputdir}/$(basename "${firstpartialoutputfile}")"
194         merge_stat "${mergedfile}" ${partialoutputfiles} || error "error while merging"
195         return
196     fi
197
198     if test "${firstpartialoutputextension}" == "txt" && grep 'Resol' "${firstpartialoutputfile}" > /dev/null
199     then
200         local resol="$(sed -nr '/Resol/s/^.*=\s+\((.+)\)\s*$/\1/p' "${firstpartialoutputfile}")"
201         local resolx="$(echo "${resol}" | cut -d',' -f1)"
202         local resoly="$(echo "${resol}" | cut -d',' -f2)"
203         local resolz="$(echo "${resol}" | cut -d',' -f3)"
204         if test "${resol}" == "1,1,1"
205         then
206             echo "${indent}this is a txt integral value"
207             local mergedfile="${outputdir}/$(basename "${firstpartialoutputfile}")"
208             merge_txt_image "${mergedfile}" ${partialoutputfiles} || error "error while merging"
209             return
210         fi
211         if test \( "${resolx}" == "1" -a "${resoly}" == "1" \) -o \( "${resoly}" == "1" -a "${resolz}" == "1" \) -o \( "${resolz}" == "1" -a "${resolx}" == "1" \)
212         then
213             echo "${indent}this is a txt profile"
214             local mergedfile="${outputdir}/$(basename "${firstpartialoutputfile}")"
215             merge_txt_image "${mergedfile}" ${partialoutputfiles} || error "error while merging"
216             return
217         fi
218     fi
219
220     warning "unknown file type"
221 }
222
223 rundir="${1?"provide run dir"}"
224 nboutputdirs="$(find "${rundir}" -mindepth 1 -type d -name 'output*' | wc -l)"
225
226 test ${nboutputdirs} -gt 0 || error "no output dir found"
227 echo "found ${nboutputdirs} partial output dirs"
228
229 outputdir="results"
230 if [ "${rundir}" != "." -a "${rundir##*.}" != "${rundir}" ]
231 then
232     outputdir="results.${rundir##*.}"
233 fi
234 outputdir="$(basename "${outputdir}")"
235 echo "output dir is ${outputdir}"
236 test -d "${outputdir}" && rm -r "${outputdir}"
237 mkdir "${outputdir}"
238
239 for outputfile in $(find "${rundir}" -regextype 'posix-extended' -type f -regex '.*\.(hdr|root|txt)' | awk -F '/' '{ print $NF }' | sort | uniq)
240 do
241         merge_dispatcher "${outputfile}"
242 done
243
244 echo "these was ${warning_count} warning(s)"