]> Creatis software - clitk.git/blob - scripts/create_midP-2.0.sh
3b943d38657eeef452294836b7cfbefa007093cd
[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       abort_on_error registration $? clean_up_registration
94
95       # combine in and out vf
96       vf_result=$vf_dir/vf_${ref_phase_nb}_$phase_nb.mhd
97       clitkCombineImage -i $vf_in -j $vf_out -m $motion_mask -o $vf_result
98       abort_on_error registration $? clean_up_registration
99
100       clitkZeroVF -i $vf_in -o vf_zero.mhd
101       abort_on_error registration $? clean_up_registration
102
103       patient_mask=$mask_dir/patient_mask_$phase_nb.mhd
104       clitkCombineImage -i $vf_result -j vf_zero.mhd -m $patient_mask -o $vf_result
105       abort_on_error registration $? clean_up_registration
106
107       rm vf_zero.*
108
109       # save for later...
110       vf_ref=$vf_in
111     fi
112   done
113
114   # create (zero) vf from reference to reference and associated images
115   vf_in=$vf_dir/vf_inside_${ref_phase_nb}_${ref_phase_nb}.mhd
116   vf_out=$vf_dir/vf_outside_${ref_phase_nb}_${ref_phase_nb}.mhd
117   clitkZeroVF -i $vf_ref -o $vf_dir/vf_${ref_phase_nb}_${ref_phase_nb}.mhd
118   clitkZeroVF -i $vf_ref -o $vf_in
119   clitkZeroVF -i $vf_ref -o $vf_out
120   abort_on_error registration $? clean_up_registration
121
122   motion_mask=$mask_dir/mm_${ref_phase_nb}.mhd
123   reference_in=$mask_dir/${banded}inside_${ref_phase_nb}.mhd
124   reference_out=$mask_dir/${banded}outside_$ref_phase_nb.mhd
125   out_result=$output_dir/result_${ref_phase_nb}_${ref_phase_nb}.mhd
126   clitkCombineImage -i $reference_in -j $reference_out -m $motion_mask -o $out_result
127   abort_on_error registration $? clean_up_registration
128
129   # create 4D vf
130   create_mhd_4D_pattern.sh $vf_dir/vf_${ref_phase_nb}_
131   create_mhd_4D_pattern.sh $vf_dir/vf_inside_${ref_phase_nb}_
132   create_mhd_4D_pattern.sh $vf_dir/vf_outside_${ref_phase_nb}_
133
134   # create 4D coeffs
135   create_mhd_4D_pattern.sh $vf_dir/coeff_inside_${ref_phase_nb}_ _0
136   create_mhd_4D_pattern.sh $vf_dir/coeff_outside_${ref_phase_nb}_ _0
137
138   # create 4D result image
139   create_mhd_4D_pattern.sh $output_dir/result_inside_${ref_phase_nb}_
140   create_mhd_4D_pattern.sh $output_dir/result_outside_${ref_phase_nb}_
141   create_mhd_4D_pattern.sh $output_dir/result_${ref_phase_nb}_
142
143   echo
144   echo "-------- Registration done ! --------"
145   end=`date`
146   echo "start: $start"
147   echo "end: $end"
148   echo
149 }
150
151 midp()
152 {
153   echo
154   echo "----------- Mid-position ------------"
155   start=`date`
156   echo "start: $start"
157   echo
158
159   mkdir -p $midp_dir
160
161   ########### calculate the midp wrt the reference phase
162   phase_nb=$ref_phase_nb
163   echo "Calculating midp_$phase_nb.mhd..."
164   vf_midp=$midp_dir/vf_midp_$phase_nb.mhd
165   midp=$midp_dir/midp_$phase_nb.mhd
166   # average the vf's from reference phase to phase
167   clitkAverageTemporalDimension -i $vf_dir/vf_${ref_phase_nb}_4D.mhd -o $vf_midp
168   abort_on_error midp $? clean_up_midp
169
170   # invert the vf (why?)
171   clitkInvertVF -i $vf_midp -o $vf_midp
172   abort_on_error midp $? clean_up_midp
173
174   # create the midp by warping the reference phase with the reference vf
175   clitkWarpImage -i $ref_phase_file -o $midp --vf=$vf_midp -s 1
176   abort_on_error midp $? clean_up_midp
177
178   ref_vf_midp=$vf_midp
179   ref_midp=$midp
180   clitkImageConvert -i $ref_midp -o $ref_midp -t float
181   abort_on_error midp $? clean_up_midp
182
183   ########### calculate the midp wrt the other phases
184   for i in $( seq 0 $((${#phase_files[@]} - 1))); do
185     phase_file=${phase_files[$i]}
186     phase_nb=${phase_nbs[$i]}
187     vf_midp=$midp_dir/vf_midp_$phase_nb.mhd
188     midp=$midp_dir/midp_$phase_nb.mhd
189
190     if [ "$phase_nb" != "$ref_phase_nb" ]; then
191       echo "Calculating midp_$phase_nb.mhd..."
192       # calculate vf from phase to midp, using the vf from reference phase to midp (-i)
193       # and the vf from reference phase to phase (-j)
194       clitkComposeVF -i $ref_vf_midp -j $vf_dir/vf_$ref_phase_nb\_$phase_nb.mhd -o $vf_midp
195       abort_on_error midp $? clean_up_midp
196       
197       clitkWarpImage -i $phase_file -o $midp --vf=$vf_midp -s 1
198       abort_on_error midp $? clean_up_midp
199       
200       clitkImageConvert -i $midp -o $midp -t float
201       abort_on_error midp $? clean_up_midp
202     fi
203   done
204
205   # create 4D midp
206   create_mhd_4D_pattern.sh $midp_dir/midp_
207   create_mhd_4D_pattern.sh $midp_dir/vf_midp_
208
209   echo "Calculating midp_avg.mhd..."
210   clitkAverageTemporalDimension -i $midp_dir/midp_4D.mhd -o $midp_dir/midp_avg.mhd
211   abort_on_error midp $? clean_up_midp
212
213   echo "Calculating midp_med.mhd..."
214   clitkMedianTemporalDimension -i $midp_dir/midp_4D.mhd -o $midp_dir/midp_med.mhd
215   abort_on_error midp $? clean_up_midp
216
217   # clean-up
218   #rm $midp_dir/vf_*
219       
220   echo
221   echo "-------- Mid-position done ! --------"
222   end=`date`
223   echo "start: $start"
224   echo "end: $end"
225   echo
226 }
227
228 midp_in_out()
229 {
230   echo
231   echo "----------- Mid-position ------------"
232   start=`date`
233   echo "start: $start"
234   echo
235
236   mkdir -p $midp_dir
237
238   ########### calculate the midp wrt the reference phase
239   phase_nb=$ref_phase_nb
240   phase_file=$ref_phase_file
241   echo "Calculating midp_$phase_nb.mhd..."
242   vf_midp_in=$midp_dir/vf_inside_midp_$phase_nb.mhd
243   vf_midp_out=$midp_dir/vf_outside_midp_$phase_nb.mhd
244   coeff_midp_in=$midp_dir/coeff_inside_midp_$phase_nb.mhd
245   coeff_midp_out=$midp_dir/coeff_outside_midp_$phase_nb.mhd
246   # average the vf's from reference phase to phase
247   # clitkAverageTemporalDimension -i $vf_dir/vf_inside_${ref_phase_nb}_4D.mhd -o $vf_midp_in
248   clitkAverageTemporalDimension -i $vf_dir/coeff_inside_${ref_phase_nb}_4D_0.mhd -o $coeff_midp_in
249   abort_on_error midp $? clean_up_midp
250   # clitkAverageTemporalDimension -i $vf_dir/vf_outside_${ref_phase_nb}_4D.mhd -o $vf_midp_out
251   clitkAverageTemporalDimension -i $vf_dir/coeff_outside_${ref_phase_nb}_4D_0.mhd -o $coeff_midp_out
252   abort_on_error midp $? clean_up_midp
253
254   # invert the vf 
255   # clitkInvertVF -i $vf_midp_in -o $vf_midp_in
256   clitkInvertVF -i $coeff_midp_in -o $vf_midp_in --type 1 --like $ref_phase_file
257   abort_on_error midp $? clean_up_midp
258   # clitkInvertVF -i $vf_midp_out -o $vf_midp_out
259   clitkInvertVF -i $coeff_midp_out -o $vf_midp_out --type 1 --like $ref_phase_file
260   abort_on_error midp $? clean_up_midp
261
262   # combine in and out VF's
263   ref_vf_midp_in=$vf_midp_in
264   ref_vf_midp_out=$vf_midp_out
265   vf_midp=$midp_dir/vf_midp_$phase_nb.mhd
266   clitkCombineImage -i $vf_midp_in -j $vf_midp_out -o $vf_midp -m $mask_dir/mm_$phase_nb.mhd
267   clitkZeroVF -i $vf_midp -o vf_zero.mhd
268   clitkCombineImage -i $vf_midp -j vf_zero.mhd -o $vf_midp -m $mask_dir/patient_mask_$phase_nb.mhd
269
270   # create the midp by warping the reference phase with the reference vf
271   midp=$midp_dir/midp_$phase_nb.mhd
272   clitkWarpImage -i $phase_file -o $midp --vf=$vf_midp -s 1
273   abort_on_error midp $? clean_up_midp
274
275   clitkImageConvert -i $midp -o $midp -t float
276   abort_on_error midp $? clean_up_midp
277
278   ########### calculate the midp wrt the other phases
279   for i in $( seq 0 $((${#phase_files[@]} - 1))); do
280     phase_file=${phase_files[$i]}
281     phase_nb=${phase_nbs[$i]}
282     vf_midp_in=$midp_dir/vf_inside_midp_$phase_nb.mhd
283     vf_midp_out=$midp_dir/vf_outside_midp_$phase_nb.mhd
284
285     if [ "$phase_nb" != "$ref_phase_nb" ]; then
286       echo "Calculating midp_$phase_nb.mhd..."
287       # calculate vf from phase to midp, using the vf from reference phase to midp (-i)
288       # and the vf from reference phase to phase (-j)
289       clitkComposeVF -i $ref_vf_midp_in -j $vf_dir/vf_inside_$ref_phase_nb\_$phase_nb.mhd -o $vf_midp_in
290       abort_on_error midp $? clean_up_midp
291       clitkComposeVF -i $ref_vf_midp_out -j $vf_dir/vf_outside_$ref_phase_nb\_$phase_nb.mhd -o $vf_midp_out
292       abort_on_error midp $? clean_up_midp
293
294       # combine in and out VF's
295       vf_midp=$midp_dir/vf_midp_$phase_nb.mhd
296       clitkCombineImage -i $vf_midp_in -j $vf_midp_out -o $vf_midp -m $mask_dir/mm_$phase_nb.mhd
297       clitkZeroVF -i $vf_midp -o vf_zero.mhd
298       clitkCombineImage -i $vf_midp -j vf_zero.mhd -o $vf_midp -m $mask_dir/patient_mask_$phase_nb.mhd
299       
300       midp=$midp_dir/midp_$phase_nb.mhd
301       clitkWarpImage -i $phase_file -o $midp --vf=$vf_midp -s 1
302       abort_on_error midp $? clean_up_midp
303       
304       clitkImageConvert -i $midp -o $midp -t float
305       abort_on_error midp $? clean_up_midp
306     fi
307   done
308
309   rm vf_zero.*
310
311   # create 4D midp
312   create_mhd_4D_pattern.sh $midp_dir/midp_
313   create_mhd_4D_pattern.sh $midp_dir/vf_midp_
314   create_mhd_4D_pattern.sh $midp_dir/vf_inside_midp_
315   create_mhd_4D_pattern.sh $midp_dir/vf_outside_midp_
316
317   echo "Calculating midp_avg.mhd..."
318   clitkAverageTemporalDimension -i $midp_dir/midp_4D.mhd -o $midp_dir/midp_avg.mhd
319   abort_on_error midp $? clean_up_midp
320
321   echo "Calculating midp_med.mhd..."
322   clitkMedianTemporalDimension -i $midp_dir/midp_4D.mhd -o $midp_dir/midp_med.mhd
323   abort_on_error midp $? clean_up_midp
324
325   # clean-up
326   #rm $midp_dir/vf_*
327       
328   echo
329   echo "-------- Mid-position done ! --------"
330   end=`date`
331   echo "start: $start"
332   echo "end: $end"
333   echo
334 }
335
336
337 ######################### main
338
339 if [ $# != 3 ]; then
340   echo "Usage: create_midP-2.0.sh CT_4D REF_PHASE CONF_FILE"
341   exit -1
342 fi
343
344 echo
345 echo "--------------- START ---------------"
346 begining=`date --rfc-3339=seconds`
347 # echo "beginning: $begining"
348 echo
349
350 # variable declarations
351 mhd4d=$1
352 ref_phase=$2
353 conf=$3
354 source $conf
355
356 cd `dirname $mhd4d`
357
358 mkdir -p $log_dir
359 mask_dir="MASK-${mask_interpolation_spacing}mm-$mask_interpolation_algorithm"
360
361 extract_4d_phases_ref $mhd4d $ref_phase
362
363 if [ "$step" == "mask" -o "$step" == "all" ]; then
364   motion_mask $mhd4d $mask_interpolation_spacing $mask_interpolation_algorithm 
365 fi 
366
367 if [ "$step" == "registration" -o "$step" == "all" ]; then
368   registration
369 fi 
370
371 midp_combined_vf=0
372 if [ "$step" == "midp" -o "$step" == "all" ]; then
373   if [ $midp_combined_vf = 0 ]; then
374     midp_in_out
375   else
376     midp
377   fi
378 fi 
379
380 echo
381 echo "---------------- END ----------------"
382 terminating=`date --rfc-3339=seconds`
383 echo "beginning: $begining"
384 echo "terminating: $terminating"
385 echo