]> Creatis software - clitk.git/blob - scripts/create_midP-2.0.sh
4c2b41b23c5fd39d2d22673b54265a3cc75af2bc
[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
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 $coeff_in
85         registration_elastix $reference_out $target_out $mask_ref_out $mask_targ_out $vf_out $result_out $params $log_out $coeff_out
86       fi
87
88       motion_mask=$mask_dir/${mask_type}_$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/${mask_type}_${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 registration_no_motion_mask()
156 {
157   echo
158   echo "----------- Registration Without Motion Masks ------------"
159   start=`date`
160   echo "start: $start"
161   echo
162
163   mkdir -p $vf_dir
164   mkdir -p $output_dir
165
166   # banded images may be created as separate files,
167   # with the specified preffix, which is interesting for debugging. 
168   # if blank, it means that the original images (those without bands) 
169   # will be used (see create_midP_masks-2.0.sh for details).
170   banded=""
171
172   # params read from conf file
173   use_coeffs=1
174   params="$nb_iter $nb_samples $sampling_algo $nb_hist_bins $nb_levels $bspline_spacing $metric $optimizer $interpolator"
175
176   # register all phases to the reference
177   for i in $( seq 0 $((${#phase_files[@]} - 1))); do
178     phase_file=${phase_files[$i]}
179     phase_nb=${phase_nbs[$i]}
180     
181     if [ "$phase_nb" != "$ref_phase_nb" ]; then
182       # params
183       reference=$mask_dir/patient_$ref_phase_nb.mhd
184       target=$mask_dir/patient_$phase_nb.mhd
185       mask_ref=$mask_dir/patient_mask_$ref_phase_nb.mhd
186       mask_targ=$mask_dir/patient_mask_$phase_nb.mhd
187       vf=$vf_dir/vf_${ref_phase_nb}_$phase_nb.mhd
188       result=$output_dir/result_${ref_phase_nb}_$phase_nb.mhd
189       log=$log_dir/log_${ref_phase_nb}_$phase_nb.log
190       if [ $use_coeffs = 1 ]; then
191         init_coeff=$coeff_in # empty at first iteration
192         coeff=$vf_dir/coeff_${ref_phase_nb}_$phase_nb.mhd
193       fi
194
195       # registration
196       if [ "$method" == "blutdir" ]; then
197         registration_blutdir $reference $target $mask_ref $mask_targ $vf $result $params $log $coeff 
198       elif [ "$method" == "elastix" ]; then
199         registration_elastix $reference $target $mask_ref $mask_targ $vf $result $params $log
200       fi
201
202       # save for later...
203       vf_ref=$vf
204     fi
205   done
206
207   clitkZeroVF -i $vf_ref -o $vf_dir/vf_${ref_phase_nb}_${ref_phase_nb}.mhd
208
209   # create 4D vf
210   create_mhd_4D_pattern.sh $vf_dir/vf_${ref_phase_nb}_
211
212   # create 4D coeffs
213   create_mhd_4D_pattern.sh $vf_dir/coeff_${ref_phase_nb}_ _0
214
215   # create 4D result image
216   create_mhd_4D_pattern.sh $output_dir/result_${ref_phase_nb}_
217
218   echo
219   echo "-------- Registration done ! --------"
220   end=`date`
221   echo "start: $start"
222   echo "end: $end"
223   echo
224 }
225
226 midp()
227 {
228   echo
229   echo "----------- Mid-position ------------"
230   start=`date`
231   echo "start: $start"
232   echo
233
234   mkdir -p $midp_dir
235
236   ########### calculate the midp wrt the reference phase
237   phase_nb=$ref_phase_nb
238   echo "Calculating midp_$phase_nb.mhd..."
239   vf_midp=$midp_dir/vf_midp_$phase_nb.mhd
240   midp=$midp_dir/midp_$phase_nb.mhd
241   # average the vf's from reference phase to phase
242   #clitkAverageTemporalDimension -i $vf_dir/vf_${ref_phase_nb}_4D.mhd -o $vf_midp
243   average_temporal_dimension $vf_dir/vf_${ref_phase_nb}_4D.mhd $vf_midp
244   abort_on_error midp $? clean_up_midp
245
246   # invert the vf (why?)
247   clitkInvertVF -i $vf_midp -o $vf_midp
248   abort_on_error midp $? clean_up_midp
249
250   # create the midp by warping the reference phase with the reference vf
251   clitkWarpImage -i $ref_phase_file -o $midp --vf=$vf_midp -s 1
252   abort_on_error midp $? clean_up_midp
253
254   ref_vf_midp=$vf_midp
255   ref_midp=$midp
256   clitkImageConvert -i $ref_midp -o $ref_midp -t float
257   abort_on_error midp $? clean_up_midp
258
259   ########### calculate the midp wrt the other phases
260   for i in $( seq 0 $((${#phase_files[@]} - 1))); do
261     phase_file=${phase_files[$i]}
262     phase_nb=${phase_nbs[$i]}
263     vf_midp=$midp_dir/vf_midp_$phase_nb.mhd
264     midp=$midp_dir/midp_$phase_nb.mhd
265
266     if [ "$phase_nb" != "$ref_phase_nb" ]; then
267       echo "Calculating midp_$phase_nb.mhd..."
268       # calculate vf from phase to midp, using the vf from reference phase to midp (-i)
269       # and the vf from reference phase to phase (-j)
270       clitkComposeVF -i $ref_vf_midp -j $vf_dir/vf_$ref_phase_nb\_$phase_nb.mhd -o $vf_midp
271       abort_on_error midp $? clean_up_midp
272       
273       clitkWarpImage -i $phase_file -o $midp --vf=$vf_midp -s 1
274       abort_on_error midp $? clean_up_midp
275       
276       clitkImageConvert -i $midp -o $midp -t float
277       abort_on_error midp $? clean_up_midp
278     fi
279   done
280
281   # create 4D midp
282   create_mhd_4D_pattern.sh $midp_dir/midp_
283   create_mhd_4D_pattern.sh $midp_dir/vf_midp_
284
285   echo "Calculating midp_avg.mhd..."
286   #clitkAverageTemporalDimension -i $midp_dir/midp_4D.mhd -o $midp_dir/midp_avg.mhd
287   average_temporal_dimension $midp_dir/midp_4D.mhd $midp_dir/midp_avg.mhd
288   abort_on_error midp $? clean_up_midp
289
290   echo "Calculating midp_med.mhd..."
291   clitkMedianTemporalDimension -i $midp_dir/midp_4D.mhd -o $midp_dir/midp_med.mhd
292   abort_on_error midp $? clean_up_midp
293
294   # clean-up
295   #rm $midp_dir/vf_*
296       
297   echo
298   echo "-------- Mid-position done ! --------"
299   end=`date`
300   echo "start: $start"
301   echo "end: $end"
302   echo
303 }
304
305 midp_in_out()
306 {
307   echo
308   echo "----------- Mid-position ------------"
309   start=`date`
310   echo "start: $start"
311   echo
312
313   mkdir -p $midp_dir
314
315   ########### calculate the midp wrt the reference phase
316   phase_nb=$ref_phase_nb
317   phase_file=$ref_phase_file
318   echo "Calculating midp_$phase_nb.mhd..."
319   vf_midp_in=$midp_dir/vf_inside_midp_$phase_nb.mhd
320   vf_midp_out=$midp_dir/vf_outside_midp_$phase_nb.mhd
321   coeff_midp_in=$midp_dir/coeff_inside_midp_$phase_nb.mhd
322   coeff_midp_out=$midp_dir/coeff_outside_midp_$phase_nb.mhd
323   # average the vf's from reference phase to phase
324   average_temporal_dimension $vf_dir/coeff_inside_${ref_phase_nb}_4D_0.mhd $coeff_midp_in
325   abort_on_error midp $? clean_up_midp
326   average_temporal_dimension $vf_dir/coeff_outside_${ref_phase_nb}_4D_0.mhd $coeff_midp_out
327   abort_on_error midp $? clean_up_midp
328
329   # invert the vf 
330   clitkInvertVF -i $coeff_midp_in -o $vf_midp_in --type 1 --like $ref_phase_file
331   abort_on_error midp $? clean_up_midp
332   clitkInvertVF -i $coeff_midp_out -o $vf_midp_out --type 1 --like $ref_phase_file
333   abort_on_error midp $? clean_up_midp
334
335   # combine in and out VF's
336   ref_vf_midp_in=$vf_midp_in
337   ref_vf_midp_out=$vf_midp_out
338   vf_midp=$midp_dir/vf_midp_$phase_nb.mhd
339   combine_image $vf_midp_in $vf_midp_out $vf_midp $mask_dir/${mask_type}_$phase_nb.mhd
340   clitkZeroVF -i $vf_midp -o vf_zero.mhd
341   combine_image $vf_midp vf_zero.mhd $vf_midp $mask_dir/patient_mask_$phase_nb.mhd
342
343   # create the midp by warping the reference phase with the reference vf
344   midp=$midp_dir/midp_$phase_nb.mhd
345   clitkWarpImage -i $phase_file -o $midp --vf=$vf_midp -s 1
346   abort_on_error midp $? clean_up_midp
347
348   clitkImageConvert -i $midp -o $midp -t float
349   abort_on_error midp $? clean_up_midp
350
351   ########### calculate the midp wrt the other phases
352   for i in $( seq 0 $((${#phase_files[@]} - 1))); do
353     phase_file=${phase_files[$i]}
354     phase_nb=${phase_nbs[$i]}
355     vf_midp_in=$midp_dir/vf_inside_midp_$phase_nb.mhd
356     vf_midp_out=$midp_dir/vf_outside_midp_$phase_nb.mhd
357
358     if [ "$phase_nb" != "$ref_phase_nb" ]; then
359       echo "Calculating midp_$phase_nb.mhd..."
360       # calculate vf from phase to midp, using the vf from reference phase to midp (-i)
361       # and the vf from reference phase to phase (-j)
362       clitkComposeVF -i $ref_vf_midp_in -j $vf_dir/vf_inside_$ref_phase_nb\_$phase_nb.mhd -o $vf_midp_in
363       abort_on_error midp $? clean_up_midp
364       clitkComposeVF -i $ref_vf_midp_out -j $vf_dir/vf_outside_$ref_phase_nb\_$phase_nb.mhd -o $vf_midp_out
365       abort_on_error midp $? clean_up_midp
366
367       # combine in and out VF's
368       vf_midp=$midp_dir/vf_midp_$phase_nb.mhd
369       combine_image $vf_midp_in $vf_midp_out $vf_midp $mask_dir/${mask_type}_$phase_nb.mhd
370       clitkZeroVF -i $vf_midp -o vf_zero.mhd
371       combine_image $vf_midp vf_zero.mhd $vf_midp $mask_dir/patient_mask_$phase_nb.mhd
372       
373       midp=$midp_dir/midp_$phase_nb.mhd
374       clitkWarpImage -i $phase_file -o $midp --vf=$vf_midp -s 1
375       abort_on_error midp $? clean_up_midp
376       
377       clitkImageConvert -i $midp -o $midp -t float
378       abort_on_error midp $? clean_up_midp
379     fi
380   done
381
382   rm vf_zero.*
383
384   # create 4D midp
385   create_mhd_4D_pattern.sh $midp_dir/midp_
386   create_mhd_4D_pattern.sh $midp_dir/vf_midp_
387   create_mhd_4D_pattern.sh $midp_dir/vf_inside_midp_
388   create_mhd_4D_pattern.sh $midp_dir/vf_outside_midp_
389
390   echo "Calculating midp_avg.mhd..."
391   average_temporal_dimension $midp_dir/midp_4D.mhd $midp_dir/midp_avg.mhd
392   abort_on_error midp $? clean_up_midp
393
394   echo "Calculating midp_med.mhd..."
395   clitkMedianTemporalDimension -i $midp_dir/midp_4D.mhd -o $midp_dir/midp_med.mhd
396   abort_on_error midp $? clean_up_midp
397
398   echo
399   echo "-------- Mid-position done ! --------"
400   end=`date`
401   echo "start: $start"
402   echo "end: $end"
403   echo
404 }
405
406
407 ######################### main
408
409 if [ $# != 3 ]; then
410   echo "Usage: create_midP-2.0.sh CT_4D REF_PHASE CONF_FILE"
411   exit -1
412 fi
413
414 echo
415 echo "--------------- START ---------------"
416 begining=`date --rfc-3339=seconds`
417 # echo "beginning: $begining"
418 echo
419
420 # variable declarations
421 mhd4d=$1
422 ref_phase=$2
423 conf=$3
424 source $conf
425
426 cd `dirname $mhd4d`
427
428 mkdir -p $log_dir
429 mask_dir="MASK-${mask_interpolation_spacing}mm-$mask_interpolation_algorithm"
430
431 extract_4d_phases_ref $mhd4d $ref_phase
432
433 if [ "$step" == "mask" -o "$step" == "all" ]; then
434     motion_mask $mhd4d $mask_type $mask_interpolation_spacing $mask_interpolation_algorithm 
435 fi 
436
437 if [ "$step" == "registration" -o "$step" == "all" ]; then
438   if [ "$mask_type" == "mm" ]; then
439     registration
440   elif [ "$mask_type" == "lungs" ]; then
441     registration
442   elif [ "$mask_type" == "patient" ]; then
443     registration_no_motion_mask
444     midp_combined_vf=1
445   fi
446 fi 
447
448 if [ "$step" == "midp" -o "$step" == "all" ]; then
449   if [ $midp_combined_vf = 0 ]; then
450     midp_in_out
451   else
452     midp
453   fi
454 fi 
455
456 echo
457 echo "---------------- END ----------------"
458 terminating=`date --rfc-3339=seconds`
459 echo "beginning: $begining"
460 echo "terminating: $terminating"
461 echo