3 ###############################################################################
5 # FILE: create_midP-2.0.sh
6 # AUTHOR: RĂ´mulo Pinho 05/08/2011
8 # Version 2.0 of the create_midP.sh script. The most relevant changes are:
9 # * receives a .conf file as input, with variables related to the registration
10 # parameters and to paramters of the script itself (see accompanying midp_template.conf)
12 # * separates execution steps: it's now possible to choose which operation to execute
13 # (mask, registration, midp, or all).
14 # * some steps are now in different modules, to facilitate re-use (see "includes" section).
15 # * minor modifications on output file names.
16 # * attempt to simplify the code a bit.
18 ###############################################################################
20 ######################### includes
22 source `dirname $0`/create_midP_masks-2.0.sh using-as-lib 2 nn
23 source `dirname $0`/registration.sh
24 source `dirname $0`/midp_common.sh
29 echo "----------- Registration ------------"
37 # banded images may be created as separate files,
38 # with the specified preffix, which is interesting for debugging.
39 # if blank, it means that the original images (those without bands)
40 # will be used (see create_midP_masks-2.0.sh for details).
43 # params read from conf file
45 params="$nb_iter $nb_samples $sampling_algo $nb_hist_bins $nb_levels $bspline_spacing $metric $optimizer $interpolator"
47 # register all phases to the reference
48 for i in $( seq 0 $((${#phase_files[@]} - 1))); do
49 phase_file=${phase_files[$i]}
50 phase_nb=${phase_nbs[$i]}
52 if [ "$phase_nb" != "$ref_phase_nb" ]; then
54 reference_in=$mask_dir/${banded}inside_$ref_phase_nb.mhd
55 target_in=$mask_dir/${banded}inside_$phase_nb.mhd
56 mask_ref_in=$mask_dir/mask_inside_$ref_phase_nb.mhd
57 mask_targ_in=$mask_dir/mask_inside_$phase_nb.mhd
58 vf_in=$vf_dir/vf_inside_${ref_phase_nb}_$phase_nb.mhd
59 result_in=$output_dir/result_inside_${ref_phase_nb}_$phase_nb.mhd
60 log_in=$log_dir/log_inside_${ref_phase_nb}_$phase_nb.log
61 if [ $use_coeffs = 1 ]; then
62 init_coeff_in=$coeff_in # empty at first iteration
63 coeff_in=$vf_dir/coeff_inside_${ref_phase_nb}_$phase_nb.mhd
67 reference_out=$mask_dir/${banded}outside_$ref_phase_nb.mhd
68 target_out=$mask_dir/${banded}outside_$phase_nb.mhd
69 mask_ref_out=$mask_dir/mask_outside_$ref_phase_nb.mhd
70 mask_targ_out=$mask_dir/mask_outside_$phase_nb.mhd
71 vf_out=$vf_dir/vf_outside_$ref_phase_nb\_$phase_nb.mhd
72 result_out=$output_dir/result_outside_$ref_phase_nb\_$phase_nb.mhd
73 log_out=$log_dir/log_outside_${ref_phase_nb}_$phase_nb.log
74 if [ $use_coeffs = 1 ]; then
75 init_coeff_out=$coeff_out # empty at first iteration
76 coeff_out=$vf_dir/coeff_outside_${ref_phase_nb}_$phase_nb.mhd
80 if [ "$method" == "blutdir" ]; then
81 registration_blutdir $reference_in $target_in $mask_ref_in $mask_targ_in $vf_in $result_in $params $log_in $coeff_in
82 registration_blutdir $reference_out $target_out $mask_ref_out $mask_targ_out $vf_out $result_out $params $log_out $coeff_out
83 elif [ "$method" == "elastix" ]; then
84 registration_elastix $reference_in $target_in $mask_ref_in $mask_targ_in $vf_in $result_in $params $log_in
85 registration_elastix $reference_out $target_out $mask_ref_out $mask_targ_out $vf_out $result_out $params $log_out
88 motion_mask=$mask_dir/mm_$phase_nb.mhd
90 # combine in and out results
91 out_result=$output_dir/result_${ref_phase_nb}_$phase_nb.mhd
92 # clitkCombineImage -i $result_in -j $result_out -m $motion_mask -o $out_result
93 combine_image $result_in $result_out $out_result $motion_mask
94 abort_on_error registration $? clean_up_registration
96 # combine in and out vf
97 vf_result=$vf_dir/vf_${ref_phase_nb}_$phase_nb.mhd
98 #clitkCombineImage -i $vf_in -j $vf_out -m $motion_mask -o $vf_result
99 combine_image $vf_in $vf_out $vf_result $motion_mask
100 abort_on_error registration $? clean_up_registration
102 clitkZeroVF -i $vf_in -o vf_zero.mhd
103 abort_on_error registration $? clean_up_registration
105 patient_mask=$mask_dir/patient_mask_$phase_nb.mhd
106 #clitkCombineImage -i $vf_result -j vf_zero.mhd -m $patient_mask -o $vf_result
107 combine_image $vf_result vf_zero.mhd $vf_result $patient_mask
108 abort_on_error registration $? clean_up_registration
117 # create (zero) vf from reference to reference and associated images
118 vf_in=$vf_dir/vf_inside_${ref_phase_nb}_${ref_phase_nb}.mhd
119 vf_out=$vf_dir/vf_outside_${ref_phase_nb}_${ref_phase_nb}.mhd
120 clitkZeroVF -i $vf_ref -o $vf_dir/vf_${ref_phase_nb}_${ref_phase_nb}.mhd
121 clitkZeroVF -i $vf_ref -o $vf_in
122 clitkZeroVF -i $vf_ref -o $vf_out
123 abort_on_error registration $? clean_up_registration
125 motion_mask=$mask_dir/mm_${ref_phase_nb}.mhd
126 reference_in=$mask_dir/${banded}inside_${ref_phase_nb}.mhd
127 reference_out=$mask_dir/${banded}outside_$ref_phase_nb.mhd
128 out_result=$output_dir/result_${ref_phase_nb}_${ref_phase_nb}.mhd
129 #clitkCombineImage -i $reference_in -j $reference_out -m $motion_mask -o $out_result
130 combine_image $reference_in $reference_out $out_result $motion_mask
131 abort_on_error registration $? clean_up_registration
134 create_mhd_4D_pattern.sh $vf_dir/vf_${ref_phase_nb}_
135 create_mhd_4D_pattern.sh $vf_dir/vf_inside_${ref_phase_nb}_
136 create_mhd_4D_pattern.sh $vf_dir/vf_outside_${ref_phase_nb}_
139 create_mhd_4D_pattern.sh $vf_dir/coeff_inside_${ref_phase_nb}_ _0
140 create_mhd_4D_pattern.sh $vf_dir/coeff_outside_${ref_phase_nb}_ _0
142 # create 4D result image
143 create_mhd_4D_pattern.sh $output_dir/result_inside_${ref_phase_nb}_
144 create_mhd_4D_pattern.sh $output_dir/result_outside_${ref_phase_nb}_
145 create_mhd_4D_pattern.sh $output_dir/result_${ref_phase_nb}_
148 echo "-------- Registration done ! --------"
158 echo "----------- Mid-position ------------"
165 ########### calculate the midp wrt the reference phase
166 phase_nb=$ref_phase_nb
167 echo "Calculating midp_$phase_nb.mhd..."
168 vf_midp=$midp_dir/vf_midp_$phase_nb.mhd
169 midp=$midp_dir/midp_$phase_nb.mhd
170 # average the vf's from reference phase to phase
171 #clitkAverageTemporalDimension -i $vf_dir/vf_${ref_phase_nb}_4D.mhd -o $vf_midp
172 average_temporal_dimension $vf_dir/vf_${ref_phase_nb}_4D.mhd $vf_midp
173 abort_on_error midp $? clean_up_midp
175 # invert the vf (why?)
176 clitkInvertVF -i $vf_midp -o $vf_midp
177 abort_on_error midp $? clean_up_midp
179 # create the midp by warping the reference phase with the reference vf
180 clitkWarpImage -i $ref_phase_file -o $midp --vf=$vf_midp -s 1
181 abort_on_error midp $? clean_up_midp
185 clitkImageConvert -i $ref_midp -o $ref_midp -t float
186 abort_on_error midp $? clean_up_midp
188 ########### calculate the midp wrt the other phases
189 for i in $( seq 0 $((${#phase_files[@]} - 1))); do
190 phase_file=${phase_files[$i]}
191 phase_nb=${phase_nbs[$i]}
192 vf_midp=$midp_dir/vf_midp_$phase_nb.mhd
193 midp=$midp_dir/midp_$phase_nb.mhd
195 if [ "$phase_nb" != "$ref_phase_nb" ]; then
196 echo "Calculating midp_$phase_nb.mhd..."
197 # calculate vf from phase to midp, using the vf from reference phase to midp (-i)
198 # and the vf from reference phase to phase (-j)
199 clitkComposeVF -i $ref_vf_midp -j $vf_dir/vf_$ref_phase_nb\_$phase_nb.mhd -o $vf_midp
200 abort_on_error midp $? clean_up_midp
202 clitkWarpImage -i $phase_file -o $midp --vf=$vf_midp -s 1
203 abort_on_error midp $? clean_up_midp
205 clitkImageConvert -i $midp -o $midp -t float
206 abort_on_error midp $? clean_up_midp
211 create_mhd_4D_pattern.sh $midp_dir/midp_
212 create_mhd_4D_pattern.sh $midp_dir/vf_midp_
214 echo "Calculating midp_avg.mhd..."
215 #clitkAverageTemporalDimension -i $midp_dir/midp_4D.mhd -o $midp_dir/midp_avg.mhd
216 average_temporal_dimension $midp_dir/midp_4D.mhd $midp_dir/midp_avg.mhd
217 abort_on_error midp $? clean_up_midp
219 echo "Calculating midp_med.mhd..."
220 clitkMedianTemporalDimension -i $midp_dir/midp_4D.mhd -o $midp_dir/midp_med.mhd
221 abort_on_error midp $? clean_up_midp
227 echo "-------- Mid-position done ! --------"
237 echo "----------- Mid-position ------------"
244 ########### calculate the midp wrt the reference phase
245 phase_nb=$ref_phase_nb
246 phase_file=$ref_phase_file
247 echo "Calculating midp_$phase_nb.mhd..."
248 vf_midp_in=$midp_dir/vf_inside_midp_$phase_nb.mhd
249 vf_midp_out=$midp_dir/vf_outside_midp_$phase_nb.mhd
250 coeff_midp_in=$midp_dir/coeff_inside_midp_$phase_nb.mhd
251 coeff_midp_out=$midp_dir/coeff_outside_midp_$phase_nb.mhd
252 # average the vf's from reference phase to phase
253 # clitkAverageTemporalDimension -i $vf_dir/vf_inside_${ref_phase_nb}_4D.mhd -o $vf_midp_in
254 #clitkAverageTemporalDimension -i $vf_dir/coeff_inside_${ref_phase_nb}_4D_0.mhd -o $coeff_midp_in
255 average_temporal_dimension $vf_dir/coeff_inside_${ref_phase_nb}_4D_0.mhd $coeff_midp_in
256 abort_on_error midp $? clean_up_midp
257 # clitkAverageTemporalDimension -i $vf_dir/vf_outside_${ref_phase_nb}_4D.mhd -o $vf_midp_out
258 #clitkAverageTemporalDimension -i $vf_dir/coeff_outside_${ref_phase_nb}_4D_0.mhd -o $coeff_midp_out
259 average_temporal_dimension $vf_dir/coeff_outside_${ref_phase_nb}_4D_0.mhd $coeff_midp_out
260 abort_on_error midp $? clean_up_midp
263 # clitkInvertVF -i $vf_midp_in -o $vf_midp_in
264 clitkInvertVF -i $coeff_midp_in -o $vf_midp_in --type 1 --like $ref_phase_file
265 abort_on_error midp $? clean_up_midp
266 # clitkInvertVF -i $vf_midp_out -o $vf_midp_out
267 clitkInvertVF -i $coeff_midp_out -o $vf_midp_out --type 1 --like $ref_phase_file
268 abort_on_error midp $? clean_up_midp
270 # combine in and out VF's
271 ref_vf_midp_in=$vf_midp_in
272 ref_vf_midp_out=$vf_midp_out
273 vf_midp=$midp_dir/vf_midp_$phase_nb.mhd
274 #clitkCombineImage -i $vf_midp_in -j $vf_midp_out -o $vf_midp -m $mask_dir/mm_$phase_nb.mhd
275 combine_image $vf_midp_in $vf_midp_out $vf_midp $mask_dir/mm_$phase_nb.mhd
276 clitkZeroVF -i $vf_midp -o vf_zero.mhd
277 #clitkCombineImage -i $vf_midp -j vf_zero.mhd -o $vf_midp -m $mask_dir/patient_mask_$phase_nb.mhd
278 combine_image $vf_midp vf_zero.mhd $vf_midp $mask_dir/patient_mask_$phase_nb.mhd
280 # create the midp by warping the reference phase with the reference vf
281 midp=$midp_dir/midp_$phase_nb.mhd
282 clitkWarpImage -i $phase_file -o $midp --vf=$vf_midp -s 1
283 abort_on_error midp $? clean_up_midp
285 clitkImageConvert -i $midp -o $midp -t float
286 abort_on_error midp $? clean_up_midp
288 ########### calculate the midp wrt the other phases
289 for i in $( seq 0 $((${#phase_files[@]} - 1))); do
290 phase_file=${phase_files[$i]}
291 phase_nb=${phase_nbs[$i]}
292 vf_midp_in=$midp_dir/vf_inside_midp_$phase_nb.mhd
293 vf_midp_out=$midp_dir/vf_outside_midp_$phase_nb.mhd
295 if [ "$phase_nb" != "$ref_phase_nb" ]; then
296 echo "Calculating midp_$phase_nb.mhd..."
297 # calculate vf from phase to midp, using the vf from reference phase to midp (-i)
298 # and the vf from reference phase to phase (-j)
299 clitkComposeVF -i $ref_vf_midp_in -j $vf_dir/vf_inside_$ref_phase_nb\_$phase_nb.mhd -o $vf_midp_in
300 abort_on_error midp $? clean_up_midp
301 clitkComposeVF -i $ref_vf_midp_out -j $vf_dir/vf_outside_$ref_phase_nb\_$phase_nb.mhd -o $vf_midp_out
302 abort_on_error midp $? clean_up_midp
304 # combine in and out VF's
305 vf_midp=$midp_dir/vf_midp_$phase_nb.mhd
306 #clitkCombineImage -i $vf_midp_in -j $vf_midp_out -o $vf_midp -m $mask_dir/mm_$phase_nb.mhd
307 combine_image $vf_midp_in $vf_midp_out $vf_midp $mask_dir/mm_$phase_nb.mhd
308 clitkZeroVF -i $vf_midp -o vf_zero.mhd
309 #clitkCombineImage -i $vf_midp -j vf_zero.mhd -o $vf_midp -m $mask_dir/patient_mask_$phase_nb.mhd
310 combine_image $vf_midp vf_zero.mhd $vf_midp $mask_dir/patient_mask_$phase_nb.mhd
312 midp=$midp_dir/midp_$phase_nb.mhd
313 clitkWarpImage -i $phase_file -o $midp --vf=$vf_midp -s 1
314 abort_on_error midp $? clean_up_midp
316 clitkImageConvert -i $midp -o $midp -t float
317 abort_on_error midp $? clean_up_midp
324 create_mhd_4D_pattern.sh $midp_dir/midp_
325 create_mhd_4D_pattern.sh $midp_dir/vf_midp_
326 create_mhd_4D_pattern.sh $midp_dir/vf_inside_midp_
327 create_mhd_4D_pattern.sh $midp_dir/vf_outside_midp_
329 echo "Calculating midp_avg.mhd..."
330 #clitkAverageTemporalDimension -i $midp_dir/midp_4D.mhd -o $midp_dir/midp_avg.mhd
331 average_temporal_dimension $midp_dir/midp_4D.mhd $midp_dir/midp_avg.mhd
332 abort_on_error midp $? clean_up_midp
334 echo "Calculating midp_med.mhd..."
335 clitkMedianTemporalDimension -i $midp_dir/midp_4D.mhd -o $midp_dir/midp_med.mhd
336 abort_on_error midp $? clean_up_midp
342 echo "-------- Mid-position done ! --------"
350 ######################### main
353 echo "Usage: create_midP-2.0.sh CT_4D REF_PHASE CONF_FILE"
358 echo "--------------- START ---------------"
359 begining=`date --rfc-3339=seconds`
360 # echo "beginning: $begining"
363 # variable declarations
372 mask_dir="MASK-${mask_interpolation_spacing}mm-$mask_interpolation_algorithm"
374 extract_4d_phases_ref $mhd4d $ref_phase
376 if [ "$step" == "mask" -o "$step" == "all" ]; then
377 motion_mask $mhd4d $mask_interpolation_spacing $mask_interpolation_algorithm
380 if [ "$step" == "registration" -o "$step" == "all" ]; then
385 if [ "$step" == "midp" -o "$step" == "all" ]; then
386 if [ $midp_combined_vf = 0 ]; then
394 echo "---------------- END ----------------"
395 terminating=`date --rfc-3339=seconds`
396 echo "beginning: $begining"
397 echo "terminating: $terminating"