]> Creatis software - clitk.git/blob - scripts/create_midP-2.0.sh
motion masks with and without bands
[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   params="$nb_iter $nb_samples $sampling_algo $nb_hist_bins $nb_levels $bspline_spacing $metric $optimizer $interpolator"
45
46   # register all phases to the reference
47   for i in $( seq 0 $((${#phase_files[@]} - 1))); do
48     phase_file=${phase_files[$i]}
49     phase_nb=${phase_nbs[$i]}
50     
51     if [ "$phase_nb" != "$ref_phase_nb" ]; then
52       # inside params
53       reference_in=$mask_dir/${banded}inside_$ref_phase_nb.mhd
54       target_in=$mask_dir/${banded}inside_$phase_nb.mhd
55       mask_ref_in=$mask_dir/mask_inside_$ref_phase_nb.mhd
56       mask_targ_in=$mask_dir/mask_inside_$phase_nb.mhd
57       vf_in=$vf_dir/vf_inside_${ref_phase_nb}_$phase_nb.mhd
58       result_in=$output_dir/result_inside_${ref_phase_nb}_$phase_nb.mhd
59       log_in=$log_dir/log_inside_${ref_phase_nb}_$phase_nb.log
60
61       # outside params
62       reference_out=$mask_dir/${banded}outside_$ref_phase_nb.mhd
63       target_out=$mask_dir/${banded}outside_$phase_nb.mhd
64       mask_ref_out=$mask_dir/mask_outside_$ref_phase_nb.mhd
65       mask_targ_out=$mask_dir/mask_outside_$phase_nb.mhd
66       vf_out=$vf_dir/vf_outside_$ref_phase_nb\_$phase_nb.mhd
67       result_out=$output_dir/result_outside_$ref_phase_nb\_$phase_nb.mhd
68       log_out=$log_dir/log_outside_${ref_phase_nb}_$phase_nb.log
69
70       # registration
71       if [ "$method" == "blutdir" ]; then
72         registration_blutdir $reference_in $target_in $mask_ref_in $mask_targ_in $vf_in $result_in $params $log_in
73         registration_blutdir $reference_out $target_out $mask_ref_out $mask_targ_out $vf_out $result_out $params $log_out
74       elif [ "$method" == "elastix" ]; then
75         registration_elastix $reference_in $target_in $mask_ref_in $mask_targ_in $vf_in $result_in $params $log_in
76         registration_elastix $reference_out $target_out $mask_ref_out $mask_targ_out $vf_out $result_out $params $log_out
77       fi
78
79       motion_mask=$mask_dir/mm_$phase_nb.mhd
80
81       # combine in and out results
82       out_result=$output_dir/result_${ref_phase_nb}_$phase_nb.mhd
83       clitkCombineImage -i $result_in -j $result_out -m $motion_mask -o $out_result
84       abort_on_error registration $? clean_up_registration
85
86       # combine in and out vf
87       vf_result=$vf_dir/vf_${ref_phase_nb}_$phase_nb.mhd
88       clitkCombineImage -i $vf_in -j $vf_out -m $motion_mask -o $vf_result
89       abort_on_error registration $? clean_up_registration
90
91       clitkZeroVF -i $vf_in -o vf_zero.mhd
92       abort_on_error registration $? clean_up_registration
93
94       patient_mask=$mask_dir/patient_mask_$phase_nb.mhd
95       clitkCombineImage -i $vf_result -j vf_zero.mhd -m $patient_mask -o $vf_result
96       abort_on_error registration $? clean_up_registration
97
98       rm vf_zero.*
99
100       # save for later...
101       vf_ref=$vf_in
102     fi
103   done
104
105   # create (zero) vf from reference to reference and associated images
106   vf_in=$vf_dir/vf_inside_${ref_phase_nb}_${ref_phase_nb}.mhd
107   vf_out=$vf_dir/vf_outside_${ref_phase_nb}_${ref_phase_nb}.mhd
108   clitkZeroVF -i $vf_ref -o $vf_dir/vf_${ref_phase_nb}_${ref_phase_nb}.mhd
109   clitkZeroVF -i $vf_ref -o $vf_in
110   clitkZeroVF -i $vf_ref -o $vf_out
111   abort_on_error registration $? clean_up_registration
112
113   motion_mask=$mask_dir/mm_${ref_phase_nb}.mhd
114   reference_in=$mask_dir/${banded}inside_${ref_phase_nb}.mhd
115   reference_out=$mask_dir/${banded}outside_$ref_phase_nb.mhd
116   out_result=$output_dir/result_${ref_phase_nb}_${ref_phase_nb}.mhd
117   clitkCombineImage -i $reference_in -j $reference_out -m $motion_mask -o $out_result
118   abort_on_error registration $? clean_up_registration
119
120   # create 4D vf
121   create_mhd_4D_pattern.sh $vf_dir/vf_${ref_phase_nb}_
122   create_mhd_4D_pattern.sh $vf_dir/vf_inside_${ref_phase_nb}_
123   create_mhd_4D_pattern.sh $vf_dir/vf_outside_${ref_phase_nb}_
124
125   # create 4D result image
126   create_mhd_4D_pattern.sh $output_dir/result_inside_${ref_phase_nb}_
127   create_mhd_4D_pattern.sh $output_dir/result_outside_${ref_phase_nb}_
128   create_mhd_4D_pattern.sh $output_dir/result_${ref_phase_nb}_
129
130   echo
131   echo "-------- Registration done ! --------"
132   end=`date`
133   echo "start: $start"
134   echo "end: $end"
135   echo
136 }
137
138 midp()
139 {
140   echo
141   echo "----------- Mid-position ------------"
142   start=`date`
143   echo "start: $start"
144   echo
145
146   mkdir -p $midp_dir
147
148   ########### calculate the midp wrt the reference phase
149   phase_nb=$ref_phase_nb
150   echo "Calculating midp_$phase_nb.mhd..."
151   vf_midp=$midp_dir/vf_midp_$phase_nb.mhd
152   midp=$midp_dir/midp_$phase_nb.mhd
153   # average the vf's from reference phase to phase
154   clitkAverageTemporalDimension -i $vf_dir/vf_${ref_phase_nb}_4D.mhd -o $vf_midp
155   abort_on_error midp $? clean_up_midp
156
157   # invert the vf (why?)
158   clitkInvertVF -i $vf_midp -o $vf_midp
159   abort_on_error midp $? clean_up_midp
160
161   # create the midp by warping the reference phase with the reference vf
162   clitkWarpImage -i $ref_phase_file -o $midp --vf=$vf_midp -s 1
163   abort_on_error midp $? clean_up_midp
164
165   ref_vf_midp=$vf_midp
166   ref_midp=$midp
167   clitkImageConvert -i $ref_midp -o $ref_midp -t float
168   abort_on_error midp $? clean_up_midp
169
170   ########### calculate the midp wrt the other phases
171   for i in $( seq 0 $((${#phase_files[@]} - 1))); do
172     phase_file=${phase_files[$i]}
173     phase_nb=${phase_nbs[$i]}
174     vf_midp=$midp_dir/vf_midp_$phase_nb.mhd
175     midp=$midp_dir/midp_$phase_nb.mhd
176
177     if [ "$phase_nb" != "$ref_phase_nb" ]; then
178       echo "Calculating midp_$phase_nb.mhd..."
179       # calculate vf from phase to midp, using the vf from reference phase to midp (-i)
180       # and the vf from reference phase to phase (-j)
181       clitkComposeVF -i $ref_vf_midp -j $vf_dir/vf_$ref_phase_nb\_$phase_nb.mhd -o $vf_midp
182       abort_on_error midp $? clean_up_midp
183       
184       clitkWarpImage -i $phase_file -o $midp --vf=$vf_midp -s 1
185       abort_on_error midp $? clean_up_midp
186       
187       clitkImageConvert -i $midp -o $midp -t float
188       abort_on_error midp $? clean_up_midp
189     fi
190   done
191
192   # create 4D midp
193   create_mhd_4D_pattern.sh $midp_dir/midp_
194   create_mhd_4D_pattern.sh $midp_dir/vf_midp_
195
196   echo "Calculating midp_avg.mhd..."
197   clitkAverageTemporalDimension -i $midp_dir/midp_4D.mhd -o $midp_dir/midp_avg.mhd
198   abort_on_error midp $? clean_up_midp
199
200   echo "Calculating midp_med.mhd..."
201   clitkMedianTemporalDimension -i $midp_dir/midp_4D.mhd -o $midp_dir/midp_med.mhd
202   abort_on_error midp $? clean_up_midp
203
204   # clean-up
205   #rm $midp_dir/vf_*
206       
207   echo
208   echo "-------- Mid-position done ! --------"
209   end=`date`
210   echo "start: $start"
211   echo "end: $end"
212   echo
213 }
214
215
216
217 ######################### main
218
219 if [ $# != 3 ]; then
220   echo "Usage: create_midP-2.0.sh CT_4D REF_PHASE CONF_FILE"
221   exit -1
222 fi
223
224 echo
225 echo "--------------- START ---------------"
226 begining=`date --rfc-3339=seconds`
227 # echo "beginning: $begining"
228 echo
229
230 # variable declarations
231 mhd4d=$1
232 ref_phase=$2
233 conf=$3
234 source $conf
235
236 cd `dirname $mhd4d`
237
238 mkdir -p $log_dir
239 mask_dir="MASK-${mask_interpolation_spacing}mm-$mask_interpolation_algorithm"
240
241 extract_4d_phases_ref $mhd4d $ref_phase
242
243 if [ "$step" == "mask" -o "$step" == "all" ]; then
244   motion_mask $mhd4d $mask_interpolation_spacing $mask_interpolation_algorithm 
245 fi 
246
247 if [ "$step" == "registration" -o "$step" == "all" ]; then
248   registration
249 fi 
250
251 if [ "$step" == "midp" -o "$step" == "all" ]; then
252   midp
253 fi 
254
255 echo
256 echo "---------------- END ----------------"
257 terminating=`date --rfc-3339=seconds`
258 echo "beginning: $begining"
259 echo "terminating: $terminating"
260 echo