]> Creatis software - clitk.git/blob - scripts/create_midP-2.0.sh
replaced deprecated clitk tools in midP creation
[clitk.git] / scripts / create_midP-2.0.sh
1 #!/bin/sh -x
2
3 ###############################################################################
4 #
5 # FILE: create_midP-2.0.sh
6 # AUTHOR: RĂ´mulo Pinho 05/08/2011
7 #
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)
11 #   for details.
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.
17 #
18 ###############################################################################
19
20 ######################### includes
21
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
25
26 registration()
27 {
28   echo
29   echo "----------- Registration ------------"
30   start=`date`
31   echo "start: $start"
32   echo
33
34   mkdir -p $vf_dir
35   mkdir -p $output_dir
36
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).
41   banded=""
42
43   # params read from conf file
44   use_coeffs=1
45   params="$nb_iter $nb_samples $sampling_algo $nb_hist_bins $nb_levels $bspline_spacing $metric $optimizer $interpolator"
46
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]}
51     
52     if [ "$phase_nb" != "$ref_phase_nb" ]; then
53       # inside params
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
64       fi
65
66       # outside params
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
77       fi
78
79       # registration
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
86       fi
87
88       motion_mask=$mask_dir/mm_$phase_nb.mhd
89
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
95
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
101
102       clitkZeroVF -i $vf_in -o vf_zero.mhd
103       abort_on_error registration $? clean_up_registration
104
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
109
110       rm vf_zero.*
111
112       # save for later...
113       vf_ref=$vf_in
114     fi
115   done
116
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
124
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
132
133   # create 4D vf
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}_
137
138   # create 4D coeffs
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
141
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}_
146
147   echo
148   echo "-------- Registration done ! --------"
149   end=`date`
150   echo "start: $start"
151   echo "end: $end"
152   echo
153 }
154
155 midp()
156 {
157   echo
158   echo "----------- Mid-position ------------"
159   start=`date`
160   echo "start: $start"
161   echo
162
163   mkdir -p $midp_dir
164
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
174
175   # invert the vf (why?)
176   clitkInvertVF -i $vf_midp -o $vf_midp
177   abort_on_error midp $? clean_up_midp
178
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
182
183   ref_vf_midp=$vf_midp
184   ref_midp=$midp
185   clitkImageConvert -i $ref_midp -o $ref_midp -t float
186   abort_on_error midp $? clean_up_midp
187
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
194
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
201       
202       clitkWarpImage -i $phase_file -o $midp --vf=$vf_midp -s 1
203       abort_on_error midp $? clean_up_midp
204       
205       clitkImageConvert -i $midp -o $midp -t float
206       abort_on_error midp $? clean_up_midp
207     fi
208   done
209
210   # create 4D midp
211   create_mhd_4D_pattern.sh $midp_dir/midp_
212   create_mhd_4D_pattern.sh $midp_dir/vf_midp_
213
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
218
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
222
223   # clean-up
224   #rm $midp_dir/vf_*
225       
226   echo
227   echo "-------- Mid-position done ! --------"
228   end=`date`
229   echo "start: $start"
230   echo "end: $end"
231   echo
232 }
233
234 midp_in_out()
235 {
236   echo
237   echo "----------- Mid-position ------------"
238   start=`date`
239   echo "start: $start"
240   echo
241
242   mkdir -p $midp_dir
243
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
261
262   # invert the vf 
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
269
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
279
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
284
285   clitkImageConvert -i $midp -o $midp -t float
286   abort_on_error midp $? clean_up_midp
287
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
294
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
303
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
311       
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
315       
316       clitkImageConvert -i $midp -o $midp -t float
317       abort_on_error midp $? clean_up_midp
318     fi
319   done
320
321   rm vf_zero.*
322
323   # create 4D 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_
328
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
333
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
337
338   # clean-up
339   #rm $midp_dir/vf_*
340       
341   echo
342   echo "-------- Mid-position done ! --------"
343   end=`date`
344   echo "start: $start"
345   echo "end: $end"
346   echo
347 }
348
349
350 ######################### main
351
352 if [ $# != 3 ]; then
353   echo "Usage: create_midP-2.0.sh CT_4D REF_PHASE CONF_FILE"
354   exit -1
355 fi
356
357 echo
358 echo "--------------- START ---------------"
359 begining=`date --rfc-3339=seconds`
360 # echo "beginning: $begining"
361 echo
362
363 # variable declarations
364 mhd4d=$1
365 ref_phase=$2
366 conf=$3
367 source $conf
368
369 cd `dirname $mhd4d`
370
371 mkdir -p $log_dir
372 mask_dir="MASK-${mask_interpolation_spacing}mm-$mask_interpolation_algorithm"
373
374 extract_4d_phases_ref $mhd4d $ref_phase
375
376 if [ "$step" == "mask" -o "$step" == "all" ]; then
377   motion_mask $mhd4d $mask_interpolation_spacing $mask_interpolation_algorithm 
378 fi 
379
380 if [ "$step" == "registration" -o "$step" == "all" ]; then
381   registration
382 fi 
383
384 midp_combined_vf=0
385 if [ "$step" == "midp" -o "$step" == "all" ]; then
386   if [ $midp_combined_vf = 0 ]; then
387     midp_in_out
388   else
389     midp
390   fi
391 fi 
392
393 echo
394 echo "---------------- END ----------------"
395 terminating=`date --rfc-3339=seconds`
396 echo "beginning: $begining"
397 echo "terminating: $terminating"
398 echo