X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=cluster_tools%2Fgate_power_merge.sh;h=fc0e6aa3233fe032bf9713b1038e27315f4c9e67;hb=601de7c212105fac110883dec65f7ee24dcaf549;hp=590fcd6c3df87903962099e8b4d698d4c939a2b2;hpb=93bf44c912bc3289b7bfe25a0307446d5445dd60;p=clitk.git diff --git a/cluster_tools/gate_power_merge.sh b/cluster_tools/gate_power_merge.sh index 590fcd6..fc0e6aa 100755 --- a/cluster_tools/gate_power_merge.sh +++ b/cluster_tools/gate_power_merge.sh @@ -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" @@ -58,7 +130,7 @@ do let count++ local arguments=" -i ${partial} ${arguments}" done -${rootMerger} ${arguments} > /dev/null || warning "error while calling ${rootMerger}" +${rootMerger} ${arguments} > /dev/null || error "error while calling ${rootMerger}" echo " ${indent}merged ${count} files" } @@ -93,6 +165,37 @@ 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" +} + txtImageMerger="clitkMergeAsciiDoseActor" test -f "./clitkMergeAsciiDoseActor" && txtImageMerger="./clitkMergeAsciiDoseActor" @@ -163,12 +266,48 @@ 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" +} + function merge_dispatcher { local indent=" ** " 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 @@ -180,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" @@ -188,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" @@ -196,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}")" @@ -204,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)" @@ -230,17 +403,27 @@ function merge_dispatcher { then echo "${indent}this is a non specific txt output" local mergedfile="${outputdir}/$(basename "${firstpartialoutputfile}")" - echo " ${indent}catting ${mergedfile}" - cat ${partialoutputfiles} > "${mergedfile}" || error "error while merging" - return + 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 - warning "unknown file type" + error "unknown file type" } -echo "!!!! this is $0 v0.3g !!!!" +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" @@ -256,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 "${rundir}/output.*\.(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