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