X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=cluster_tools%2Fgate_power_merge.sh;h=fc0e6aa3233fe032bf9713b1038e27315f4c9e67;hb=59d984978e620f78b60435ef88269e4ea468bd6a;hp=9710866e1e06e793de1a0fcb35daf858eb95e66a;hpb=1f9f2c7ad25fb505ca3b7a1c316a69df1ddb6324;p=clitk.git diff --git a/cluster_tools/gate_power_merge.sh b/cluster_tools/gate_power_merge.sh index 9710866..fc0e6aa 100755 --- a/cluster_tools/gate_power_merge.sh +++ b/cluster_tools/gate_power_merge.sh @@ -10,7 +10,7 @@ exit 1 warning_count=0 function warning { let "warning_count++" -echo "WARNING: $1" +echo "MERGE_WARNING: $1" } function start_bar { @@ -30,6 +30,78 @@ unset count_max #echo -ne '\n' } +function check_interfile { +local input_interfile="${1:?"provide input interfile"}" + +grep -qs '!INTERFILE :=' "${input_interfile}" || return 1 + +local header_byte_size=$(awk -F' ' ' +BEGIN { zsize = 0; } +/matrix size/ && $3 == "[1]" { xsize = $5; } +/matrix size/ && $3 == "[2]" { ysize = $5; } +/number of projections/ { zsize += $5; } +/number of bytes per pixel/ { byte_per_pixel = $7; } +END { print xsize * ysize * zsize * byte_per_pixel; }' "${input_interfile}") + +local raw_interfile="$(dirname "${input_interfile}")/$(awk -F' := ' '/name of data file/ { print $2; }' "${input_interfile}")" + +test -f "${raw_interfile}" || return 1 +test $(stat -c%s "${raw_interfile}") -eq ${header_byte_size} || return 1 +} + +function write_mhd_header { +local input_interfile="${1:?"provide input interfile"}" +local output_mhd="$(dirname "${input_interfile}")/$(basename "${input_interfile}" ".hdr").mhd" + +check_interfile "${input_interfile}" || error "${input_interfile} isn't an interfile image" + +local header_start='ObjectType = Image +NDims = 3 +AcquisitionDate = none +BinaryData = True +BinaryDataByteOrderMSB = False +CompressedData = False +TransformMatrix = 1 0 0 0 1 0 0 0 1 +Offset = 0 0 0 +CenterOfRotation = 0 0 0 +DistanceUnits = mm +AnatomicalOrientation = RIP' + +echo "${header_start}" > "${output_mhd}" + +awk -F' ' ' +/scaling factor/ && $4 == "[1]" { xspacing = $6; } +/scaling factor/ && $4 == "[2]" { yspacing = $6; } +END { print "ElementSpacing = " xspacing " " yspacing " 1"; }' "${input_interfile}" >> "${output_mhd}" + +awk -F' ' ' +BEGIN { zsize = 0; } +/matrix size/ && $3 == "[1]" { xsize = $5; } +/matrix size/ && $3 == "[2]" { ysize = $5; } +/number of projections/ { zsize += $5; } +END { print "DimSize = " xsize " " ysize " " zsize; }' "${input_interfile}" >> "${output_mhd}" + +awk -F' := ' ' +/number format/ { format = $2; } +/number of bytes per pixel/ { byte_per_pixel = $2 } +END { +if (format == "unsigned integer" && byte_per_pixel == 8) { print "ElementType = MET_ULONG"; exit }; +if (format == "unsigned integer" && byte_per_pixel == 4) { print "ElementType = MET_UINT"; exit }; +if (format == "unsigned integer" && byte_per_pixel == 2) { print "ElementType = MET_USHORT"; exit }; +if (format == "unsigned integer" && byte_per_pixel == 1) { print "ElementType = MET_UCHAR"; exit }; +if (format == "integer" && byte_per_pixel == 8) { print "ElementType = MET_LONG"; exit }; +if (format == "integer" && byte_per_pixel == 4) { print "ElementType = MET_INT"; exit }; +if (format == "integer" && byte_per_pixel == 2) { print "ElementType = MET_SHORT"; exit }; +if (format == "integer" && byte_per_pixel == 1) { print "ElementType = MET_CHAR"; exit }; +if (format == "float" && byte_per_pixel == 8) { print "ElementType = MET_FLOAT"; exit }; +if (format == "float" && byte_per_pixel == 4) { print "ElementType = MET_DOUBLE"; exit }; +print "ElementType = MET_INT"; +}' "${input_interfile}" >> "${output_mhd}" + +awk -F' := ' ' +/name of data file/ { print "ElementDataFile = " $2; }' "${input_interfile}" >> "${output_mhd}" +} + rootMerger="clitkMergeRootFiles" test -x "./clitkMergeRootFiles" && rootMerger="./clitkMergeRootFiles" @@ -39,6 +111,16 @@ shift echo " ${indent}entering root merger" echo " ${indent}merger is ${rootMerger}" echo " ${indent}creating ${merged}" +#echo "######## $#" +#echo "######## $*" + +if test $# -eq 1 +then + echo " ${indent}just one partial file => just copy it" + cp "$1" "${merged}" + return +fi + local count=0 local arguments=" -o ${merged}" while test $# -gt 0 @@ -48,13 +130,12 @@ do let count++ local arguments=" -i ${partial} ${arguments}" done -${rootMerger} ${arguments} > /dev/null || { warning "error while calling ${rootMerger}" && return; } +${rootMerger} ${arguments} > /dev/null || error "error while calling ${rootMerger}" echo " ${indent}merged ${count} files" } statMerger="mergeStatFile.py" test -x "./mergeStatFile.sh" && statMerger="./mergeStatFile.sh" -test -x "./mergeStatFile.py" && statMerger="./mergeStatFile.py" function merge_stat { local merged="$1" @@ -78,7 +159,38 @@ do fi update_bar ${count} "adding ${partial}" - ${statMerger} -i "${merged}" -j "${partial}" -o "${merged}" 2> /dev/null > /dev/null || { warning "error while calling ${statMerger}" && return; } + ${statMerger} -i "${merged}" -j "${partial}" -o "${merged}" 2> /dev/null > /dev/null || warning "error while calling ${statMerger}" +done +end_bar +echo " ${indent}merged ${count} files" +} + +doseMerger="mergeDosePerEnegryFile.sh" +test -x "./mergeDosePerEnergyFile.sh" && doseMerger="./mergeDosePerEnergyFile.sh" + +function merge_dose { +local merged="$1" +shift +echo " ${indent}entering dose merger" +echo " ${indent}merger is ${doseMerger}" +echo " ${indent}creating ${merged}" +local count=0 +start_bar $# +while test $# -gt 0 +do + local partial="$1" + shift + let count++ + + if test ! -f "${merged}" + then + update_bar ${count} "copying first partial result ${partial}" + cp "${partial}" "${merged}" + continue + fi + + update_bar ${count} "adding ${partial}" + ${doseMerger} -i "${merged}" -j "${partial}" -o "${merged}" 2> /dev/null > /dev/null || warning "error while calling ${doseMerger}" done end_bar echo " ${indent}merged ${count} files" @@ -111,7 +223,7 @@ do update_bar ${count} "adding ${partial}" local header="$(cat "${merged}" | head -n 6)" local tmp="$(mktemp)" - ${txtImageMerger} -i "${partial}" -j "${merged}" -o "${tmp}" 2> /dev/null > /dev/null || { warning "error while calling ${txtImageMerger}" && return; } + ${txtImageMerger} -i "${partial}" -j "${merged}" -o "${tmp}" 2> /dev/null > /dev/null || warning "error while calling ${txtImageMerger}" echo "${header}" > "${merged}" grep -v '## Merge' "${tmp}" >> "${merged}" rm "${tmp}" @@ -148,7 +260,43 @@ do fi update_bar ${count} "adding ${partial}" - ${hdrImageMerger} -t 0 -i "${partial}" -j "${merged}" -o "${merged}" 2> /dev/null > /dev/null || { warning "error while calling ${hdrImageMerger}" && return; } + ${hdrImageMerger} -t 0 -i "${partial}" -j "${merged}" -o "${merged}" 2> /dev/null > /dev/null || warning "error while calling ${hdrImageMerger}" +done +end_bar +echo " ${indent}merged ${count} files" +} + +mhdImageMerger="clitkImageArithm" +test -x "./clitkImageArithm" && mhdImageMerger="./clitkImageArithm" + +function merge_mhd_image { +local merged="$1" +local merged_bin="${merged%.*}.raw" +shift +echo " ${indent}entering mhd image merger" +echo " ${indent}merger is ${mhdImageMerger}" +echo " ${indent}creating ${merged}" +local count=0 +start_bar $# +while test $# -gt 0 +do + local partial="$1" + local partial_bin="$(dirname "${partial}")/$(awk -F' = ' '/ElementDataFile/ { print $2; }' "${partial}")" + shift + let count++ + + if test ! -f "${merged}" + then + update_bar ${count} "copying first partial result ${partial}" + cp "${partial}" "${merged}" + cp "${partial_bin}" "${merged_bin%.*}.${partial_bin##*.}" + continue + fi + + update_bar ${count} "adding ${partial}" + ${mhdImageMerger} -t 0 -i "${partial}" -j "${merged}" -o "${merged}" 2> /dev/null > /dev/null || warning "error while calling ${mhdImageMerger}" + mv "${merged_bin}" "${merged_bin%.*}.${partial_bin##*.}" + sed -i "s/$(basename "${merged_bin}")/$(basename "${merged_bin%.*}.${partial_bin##*.}")/" "${merged}" done end_bar echo " ${indent}merged ${count} files" @@ -159,7 +307,7 @@ function merge_dispatcher { local outputfile="${1:?"provide output filename"}" echo "merging ${outputfile}" - local partialoutputfiles="$(find "${rundir}" -type f -name "${outputfile}")" + local partialoutputfiles="$(find "${rundir}" -mindepth 2 -type f -name "${outputfile}")" local nboutputfiles="$(echo "${partialoutputfiles}" | wc -l)" if test ${nboutputdirs} -ne ${nboutputfiles} then @@ -171,6 +319,22 @@ function merge_dispatcher { local firstpartialoutputextension="${firstpartialoutputfile##*.}" echo "${indent}testing file type on ${firstpartialoutputfile}" + if test "${firstpartialoutputextension}" == "hdr" && grep -qs 'INTERFILE' "${firstpartialoutputfile}" + then + echo "${indent}this is a interfile image" + echo "${indent}creating mhd headers" + for partialoutputfile in $partialoutputfiles; do write_mhd_header "${partialoutputfile}"; done + local mhd_partialoutputfiles="$(for partialoutputfile in $partialoutputfiles; do echo "${partialoutputfile%.*}.mhd"; done)" + local mhd_mergedfile="${outputdir}/$(basename "${firstpartialoutputfile}" ".hdr").mhd" + merge_mhd_image "${mhd_mergedfile}" ${mhd_partialoutputfiles} || error "error while merging" + echo "${indent}cleaning mhd headers" + for mhd_partialoutputfile in $mhd_partialoutputfiles; do rm "${mhd_partialoutputfile}"; done + rm "${mhd_mergedfile}" + echo "${indent}copy interfile header" + cp "${firstpartialoutputfile}" "${outputdir}" + return + fi + if test "${firstpartialoutputextension}" == "hdr" then echo "${indent}this is a analyse image" @@ -179,6 +343,14 @@ function merge_dispatcher { return fi + if test "${firstpartialoutputextension}" == "mhd" + then + echo "${indent}this is a mhd image" + local mergedfile="${outputdir}/$(basename "${firstpartialoutputfile}")" + merge_mhd_image "${mergedfile}" ${partialoutputfiles} || error "error while merging" + return + fi + if test "${firstpartialoutputextension}" == "root" then echo "${indent}this is a root file" @@ -187,7 +359,7 @@ function merge_dispatcher { return fi - if test "${firstpartialoutputextension}" == "txt" && grep 'NumberOfEvent' "${firstpartialoutputfile}" > /dev/null + if test "${firstpartialoutputextension}" == "txt" && grep -qs 'NumberOfEvent' "${firstpartialoutputfile}" then echo "${indent}this is a stat file" local mergedfile="${outputdir}/$(basename "${firstpartialoutputfile}")" @@ -195,7 +367,17 @@ function merge_dispatcher { return fi - if test "${firstpartialoutputextension}" == "txt" && grep 'Resol' "${firstpartialoutputfile}" > /dev/null + if test "${firstpartialoutputextension}" == "txt" && grep -qs 'energydose' "${firstpartialoutputfile}" + then + echo "${indent}this is a dose file" + local mergedfile="${outputdir}/$(basename "${firstpartialoutputfile}")" + merge_dose "${mergedfile}" ${partialoutputfiles} || error "error while merging" + return + fi + + + + if test "${firstpartialoutputextension}" == "txt" && grep -qs 'Resol' "${firstpartialoutputfile}" then local resol="$(sed -nr '/Resol/s/^.*=\s+\((.+)\)\s*$/\1/p' "${firstpartialoutputfile}")" local resolx="$(echo "${resol}" | cut -d',' -f1)" @@ -217,10 +399,31 @@ function merge_dispatcher { fi fi - warning "unknown file type" + if test "${firstpartialoutputextension}" == "txt" + then + echo "${indent}this is a non specific txt output" + local mergedfile="${outputdir}/$(basename "${firstpartialoutputfile}")" + local nbdifferent="$(md5sum ${partialoutputfiles} | awk '{ print $1; }' | sort | uniq | wc -l)" + echo " ${indent}${nbdifferent} different files" + if test ${nbdifferent} -gt 1 + then + echo " ${indent}catting to ${mergedfile}" + cat ${partialoutputfiles} > "${mergedfile}" || error "error while merging" + return + else + echo " ${indent}moving to ${mergedfile}" + cp "${firstpartialoutputfile}" "${mergedfile}" || error "error while merging" + return + fi + fi + + error "unknown file type" } +echo "!!!! this is $0 v0.3k !!!!" + rundir="${1?"provide run dir"}" +rundir="$(echo "${rundir}" | sed 's|/*$||')" nboutputdirs="$(find "${rundir}" -mindepth 1 -type d -name 'output*' | wc -l)" test ${nboutputdirs} -gt 0 || error "no output dir found" @@ -236,7 +439,7 @@ echo "output dir is ${outputdir}" test -d "${outputdir}" && rm -r "${outputdir}" mkdir "${outputdir}" -for outputfile in $(find "${rundir}" -regextype 'posix-extended' -type f -regex '.*\.(hdr|root|txt)' | awk -F '/' '{ print $NF }' | sort | uniq) +for outputfile in $(find "${rundir}" -regextype 'posix-extended' -type f -regex "${rundir}/output.*\.(hdr|mhd|root|txt)" | awk -F '/' '{ print $NF; }' | sort | uniq) do merge_dispatcher "${outputfile}" done