]> Creatis software - clitk.git/commitdiff
more refined abort-on-exception mechanism
authorRomulo Pinho <pinho@lyon.fnclcc.fr>
Thu, 3 Nov 2011 15:56:52 +0000 (16:56 +0100)
committerRomulo Pinho <pinho@lyon.fnclcc.fr>
Thu, 3 Nov 2011 15:56:52 +0000 (16:56 +0100)
- new macro defined in clitkCommon.h
- abort execution with a proper return code
- only used in tools related to mid-P calculation, for now
- mid-P scripts interpret return codes

23 files changed:
common/clitkCommon.h
scripts/create_midP-2.0.sh
scripts/create_midP_masks-2.0.sh
scripts/midp_common.sh
scripts/registration.sh
segmentation/clitkExtractBones.cxx
segmentation/clitkExtractLung.cxx
segmentation/clitkExtractPatient.cxx
segmentation/clitkExtractPatientGenericFilter.cxx
segmentation/clitkMorphoMath.cxx
segmentation/clitkMotionMask.cxx
tools/clitkAverageTemporalDimension.cxx
tools/clitkBinarizeImage.cxx
tools/clitkCombineImage.cxx
tools/clitkComposeVF.cxx
tools/clitkImageArithm.cxx
tools/clitkImageConvert.cxx
tools/clitkInvertVF.cxx
tools/clitkMedianTemporalDimension.cxx
tools/clitkResampleImage.cxx
tools/clitkSetBackground.cxx
tools/clitkWarpImage.cxx
tools/clitkZeroVF.cxx

index 31f28dc40637bd95e91dfec7974f23183edd43ac..51258e66fc3abd5c418dfc480bdba43debd32442 100644 (file)
@@ -48,6 +48,24 @@ namespace clitk {
   typedef unsigned char uchar;
   typedef unsigned short ushort;
   typedef unsigned int uint;
+  
+#define CLITK_TRY_CATCH_EXIT(func) \
+  try { \
+    func; \
+  } \
+  catch (const itk::ExceptionObject& e) { \
+    e.Print(std::cout); \
+    exit(-1);\
+  } \
+  catch (const std::exception& e) { \
+    std::cout << e.what() << std::endl; \
+    exit(-2);\
+  } \
+  catch (...) { \
+    std::cout << "Unknown excpetion" << std::endl; \
+    exit(-3); \
+  }
+    
 
   //--------------------------------------------------------------------
   // when everything goes wrong
index 8ea7e2c3903935ffc16c3927c5ce7a42b037916a..0b3947be5ddb94d1a16d0a7540db3cd0e67f2c80 100755 (executable)
@@ -1,4 +1,4 @@
-#!/bin/sh -x
+#!/bin/sh 
 
 ###############################################################################
 #
@@ -80,8 +80,14 @@ registration()
       motion_mask=$mask_dir/mm_$phase_nb.mhd
       vf_result=$vf_dir/vf_${ref_phase_nb}_$phase_nb.mhd
       clitkCombineImage -i $vf_in -j $vf_out -m $motion_mask -o $vf_result
+      abort_on_error registration $? clean_up_registration
+
       clitkZeroVF -i $vf_in -o vf_zero.mhd
+      abort_on_error registration $? clean_up_registration
+
       clitkCombineImage -i $vf_result -j vf_zero.mhd -m $patient_mask -o $vf_result
+      abort_on_error registration $? clean_up_registration
+
       rm vf_zero.*
 
       # save for later...
@@ -91,6 +97,7 @@ registration()
 
   # create (zero) vf from reference to reference
   clitkZeroVF -i $vf_ref -o $vf_dir/vf_${ref_phase_nb}_${ref_phase_nb}.mhd
+  abort_on_error registration $? clean_up_registration
 
   # create 4D vf
   create_mhd_4D_pattern.sh $vf_dir/vf_${ref_phase_nb}_
@@ -120,14 +127,20 @@ midp()
   midp=$midp_dir/midp_$phase_nb.mhd
   # average the vf's from reference phase to phase
   clitkAverageTemporalDimension -i $vf_dir/vf_${ref_phase_nb}_4D.mhd -o $vf_midp
+  abort_on_error midp $? clean_up_midp
+
   # invert the vf (why?)
   clitkInvertVF -i $vf_midp -o $vf_midp
+  abort_on_error midp $? clean_up_midp
+
   # create the midp by warping the reference phase with the reference vf
   clitkWarpImage -i $ref_phase_file -o $midp --vf=$vf_midp -s 1
+  abort_on_error midp $? clean_up_midp
 
   ref_vf_midp=$vf_midp
   ref_midp=$midp
   clitkImageConvert -i $ref_midp -o $ref_midp -t float
+  abort_on_error midp $? clean_up_midp
 
   ########### calculate the midp wrt the other phases
   for i in $( seq 0 $((${#phase_files[@]} - 1))); do
@@ -141,16 +154,25 @@ midp()
       # calculate vf from phase to midp, using the vf from reference phase to midp (-i)
       # and the vf from reference phase to phase (-j)
       clitkComposeVF -i $ref_vf_midp -j $vf_dir/vf_$ref_phase_nb\_$phase_nb.mhd -o $vf_midp
+      abort_on_error midp $? clean_up_midp
+      
       clitkWarpImage -i $phase_file -o $midp --vf=$vf_midp -s 1
+      abort_on_error midp $? clean_up_midp
+      
       clitkImageConvert -i $midp -o $midp -t float
+      abort_on_error midp $? clean_up_midp
     fi
   done
 
   create_mhd_4D_pattern.sh $midp_dir/midp_
+
   echo "Calculating midp_avg.mhd..."
   clitkAverageTemporalDimension -i $midp_dir/midp_4D.mhd -o $midp_dir/midp_avg.mhd
+  abort_on_error midp $? clean_up_midp
+
   echo "Calculating midp_med.mhd..."
   clitkMedianTemporalDimension -i $midp_dir/midp_4D.mhd -o $midp_dir/midp_med.mhd
+  abort_on_error midp $? clean_up_midp
 
   # clean-up
   rm $midp_dir/vf_*
index f5738e0107c464a68fd0e97cba98a7e2719bd193..6fadeec15d28f2b612982e95857ca8dc48e28915 100755 (executable)
@@ -1,5 +1,5 @@
-#! /bin/bash -x
-
+#! /bin/bash 
+  
 ###############################################################################
 #
 # FILE: create_midP-2.0.sh
@@ -21,7 +21,10 @@ extract_patient()
 {
   echo "$phase_file -> Extracting patient..."
   clitkExtractPatient -i $phase_file -o $mask_dir_tmp/patient_mask_$phase_nb.mhd --noAutoCrop -a $afdb_file $ExtractPatientExtra
+#   abort_on_error clitkExtractPatient $?
+
   clitkSetBackground -i $phase_file -o $mask_dir_tmp/patient_$phase_nb.mhd --mask $mask_dir_tmp/patient_mask_$phase_nb.mhd --outsideValue -1000
+#   abort_on_error clitkSetBackground $?
 }
 
 extract_bones()
@@ -47,7 +50,6 @@ resample()
 {
   echo "$phase_file -> Resampling..."
   clitkResampleImage -i $mask_dir_tmp/patient_$phase_nb.mhd -o $mask_dir_tmp/patient_$phase_nb.mhd --spacing $resample_spacing --interp $resample_algo
-
   clitkResampleImage -i $mask_dir_tmp/lungs_$phase_nb.mhd -o $mask_dir_tmp/lungs_$phase_nb.mhd --like $mask_dir_tmp/patient_$phase_nb.mhd
 }
 
@@ -60,7 +62,7 @@ compute_motion_mask()
     FillingLevel=94
   fi
 
-  clitkMotionMask -i $mask_dir_tmp/patient_$phase_nb.mhd -o $mask_dir_tmp/mm_$phase_nb.mhd --featureLungs $mask_dir_tmp/lungs_$phase_nb.mhd --upperThresholdLungs -400 --fillingLevel $FillingLevel --offsetDetect $MotionMaskOffsetDetect --pad --writeFeature=$mask_dir_tmp/feature_$phase_nb.mhd $MotionMaskExtra 
+  clitkMotionMask -i $mask_dir_tmp/patient_$phase_nb.mh -o $mask_dir_tmp/mm_$phase_nb.mhd --featureLungs $mask_dir_tmp/lungs_$phase_nb.mhd --upperThresholdLungs -400 --fillingLevel $FillingLevel --offsetDetect $MotionMaskOffsetDetect --pad --writeFeature=$mask_dir_tmp/feature_$phase_nb.mhd $MotionMaskExtra 
   #--monitor=$mask_dir_tmp/monitor_$phase_nb.mhd
 }
 
@@ -198,6 +200,7 @@ motion_mask()
     mkdir -p $mask_log_dir
 
     # multi-threaded pre-processing for motion mask calcs
+    pids=( )
     for i in $( seq 0 $((${#phase_nbs[@]} - 1))); do
       phase_nb=${phase_nbs[$i]}
       phase_file=${phase_files[$i]}
@@ -205,6 +208,12 @@ motion_mask()
 
       check_threads $MAX_THREADS
       mm_preprocessing &
+      pids=( "${pids[@]}" "$!" )
+    done
+
+    wait_pids ${pids[@]}
+    for ret in $ret_codes; do
+      abort_on_error mm_preprocessing $ret clean_up_masks
     done
 
     # single-threaded motion mask calc
@@ -215,17 +224,26 @@ motion_mask()
       check_threads 1
       echo "$phase_file -> Computing motion mask..."
       compute_motion_mask > $mask_log_dir/motion_mask_$phase_file.log
+      abort_on_error compute_motion_mask $? clean_up_masks
     done
 
     # multi-threaded post-processing of motion mask calcs
+    pids=( )
     for i in $( seq 0 $((${#phase_nbs[@]} - 1))); do
       phase_nb=${phase_nbs[$i]}
       phase_file=${phase_files[$i]}
 
       check_threads $MAX_THREADS 
       mm_postprocessing &
+      pids=( "${pids[@]}" "$!" )
+    done
+  
+    wait_pids ${pids[@]}
+    for ret in $ret_codes; do
+      abort_on_error mm_postprocessing $ret clean_up_masks
     done
 
+
     # rename tmp mask directory after mask creation
     check_threads 1
     mv -f $mask_dir_tmp $mask_dir
index 0f767070e217639fc5b2548db0e2b315610f6608..aa500ae9a959885bd66eb8ee1cbf82426565e8ea 100755 (executable)
@@ -1,4 +1,4 @@
-#! /bin/sh +x
+#! /bin/sh -x
 
 ###############################################################################
 #
@@ -9,7 +9,72 @@
 #
 ###############################################################################
 
+#
+# check return value passed and abort if it represents an error (ie, ret != 0)
+# optionally, a function can be passed as a 3rd parameter, to be called just
+# before exiting. this is useful for cleaning up, for example.
+#
+abort_on_error()
+{
+  if [ $2 != 0 ]; then
+    echo Aborted at $1 with code $2
+    if [ $# = 3 ]; then
+      eval $3
+    fi
 
+    exit $2
+  fi
+}
+
+#
+# wait for all processes in the list and return their exit codes
+# in the ret_codes variable.
+#
+# OBS: this function must always be called in the same shell
+# that launched the processes.
+#
+wait_pids()
+{
+  local pids=$*
+  local ret=
+  local rets=
+#   echo PIDS: $pids
+  for p in $pids; do
+#     echo waiting $p
+    wait $p > /dev/null 2> /dev/null
+    ret=$?
+    if [ ret != 127 ]; then
+      rets=$rets" "$ret
+    else
+      rets=$rets" "0
+    fi
+      
+  done
+
+  ret_codes=$rets
+}
+
+#
+# clean-up functions for maks, registration, and midp
+#
+clean_up_masks()
+{
+  rm -fr $mask_dir_tmp
+}
+
+clean_up_midp()
+{
+  rm -fr $midp_dir
+}
+
+clean_up_registration()
+{
+  rm -fr $vf_dir
+  rm -fr $output_dir
+}
+
+
+#
 # block execution untill the number of threads (jobs) launched by the
 # current process is below the given number of threads. 
 MAX_THREADS=2
index 40d5fbe41dc7e0467faf028caab8bcffcb636f5d..724e3ac392f804e842e408bc67e92733fd52c6fa 100755 (executable)
@@ -31,6 +31,8 @@
 #
 ###############################################################################
 
+source `dirname $0`/midp_common.sh
+
 
 ################# BLUTDIR #####################
 registration_blutdir()
@@ -56,6 +58,8 @@ registration_blutdir()
   blutdir_params="--levels $nb_levels  --metric $metric --optimizer $optimizer --samples $nb_samples --spacing $spacing,$spacing,$spacing --bins $hist_bins --maxIt $nb_iter --interp $interpolator --verbose"
   cmd="clitkBLUTDIR -r $reference -t $target -m $mask_ref --targetMask $mask_targ --vf $vf -o $result $blutdir_params"
   $cmd > $log
+
+  abort_on_error registration_blutdir $? clean_up_registration
 }
 
 ################# ELASTIX #####################
@@ -105,10 +109,12 @@ registration_elastix()
   # image registration
   cmd="elastix -f $reference -m $target -fMask $mask_ref -mMask $mask_targ -out $result_dir -p params_BSpline_${suffix}.txt"
   $cmd  > /dev/null
+  abort_on_error registration_elastix $? clean_up_registration
 
   # generate vector field
   cmd="transformix -tp $result_dir/TransformParameters.0.txt -out $vf_dir -def all"
   $cmd  > /dev/null
+  abort_on_error registration_elastix $? clean_up_registration
 
   # post-processing
   mv $vf_dir/deformationField.mhd $vf
index 3e27657c57aa7250eaa9cd2c6950294ba3da05a4..4d3302fa502ca18f97eeabc6d1e03f0d8ffde396 100644 (file)
@@ -34,11 +34,7 @@ int main(int argc, char * argv[])
 
   filter->SetArgsInfo(args_info);
   
-  try {
-    filter->Update();
-  } catch(std::runtime_error e) {
-    std::cout << e.what() << std::endl;
-  }
+  CLITK_TRY_CATCH_EXIT(filter->Update());
 
   return EXIT_SUCCESS;
 } // This is the end, my friend
index 36fa4e84be349ebc4277f5d9eadc954cc90df487..1b5fda927f4caf78a975afac9617b85ce58780e1 100644 (file)
@@ -33,11 +33,7 @@ int main(int argc, char * argv[])
 
   filter->SetArgsInfo(args_info);
   
-  try {
-    filter->Update();
-  } catch(std::runtime_error e) {
-    std::cerr << e.what() << std::endl;
-  }
+  CLITK_TRY_CATCH_EXIT(filter->Update());
 
   return EXIT_SUCCESS;
 } // This is the end, my friend
index 43a086388a9b138e1e75d3d57c31b74a7c1227d5..ebbd3ade15618efb6dfaad1a3834a9100edfb046 100644 (file)
@@ -33,11 +33,7 @@ int main(int argc, char * argv[]) {
   
   filter->SetArgsInfo(args_info);
   
-  try {
-    filter->Update();
-  } catch(std::runtime_error e) {
-    std::cout << e.what() << std::endl;
-  }
+  CLITK_TRY_CATCH_EXIT(filter->Update());
 
   return EXIT_SUCCESS;
 } // This is the end, my friend
index 3dfde0d0d46c180c2c9603c8920602fbd894303a..88c9cb8ea99e7bb4eb3906a501f2ba72ac3be6e7 100644 (file)
@@ -37,7 +37,7 @@ namespace clitk
   //-----------------------------------------------------------
   // Constructor
   //-----------------------------------------------------------
-  ExtractPatientGenericFilter::ExtractPatientGenericFilter()
+  ExtractPatientGenericFilter:::ExtractPatientGenericFilter()
   {
     m_Verbose=false;
     m_InputFileName="";
index 46e348971e8242433f42f7d6b755ec12c247278e..25c40df134f496ec960fab8db3032ae2dead8430 100644 (file)
@@ -36,11 +36,7 @@ int main(int argc, char * argv[]) {
   // Passing the arguments to the generic filter
   filter->SetArgsInfo(args_info);
  
-  try {
-    filter->Update();
-  } catch(std::runtime_error e) {
-    std::cout << e.what() << std::endl;
-  }
+  CLITK_TRY_CATCH_EXIT(filter->Update());
 
   return EXIT_SUCCESS;
 } // This is the end, my friend
index fdc31c7024976b10a93f730918978d5e75fc86b4..fd65c6457b173ca4a02ec71e2edef7b9336a96b7 100644 (file)
@@ -43,7 +43,7 @@ int main(int argc, char * argv[]) {
   clitk::MotionMaskGenericFilter::Pointer genericFilter=clitk::MotionMaskGenericFilter::New();
   
   genericFilter->SetArgsInfo(args_info);
-  genericFilter->Update();
+  CLITK_TRY_CATCH_EXIT(genericFilter->Update());
 
   return EXIT_SUCCESS;
 }// end main
index d6434547711f2da9763a7ea9833836efa6f021c9..6304aed44d0fdd0e578c9c1cc1f29af8dd4224e2 100644 (file)
@@ -45,7 +45,7 @@ int main(int argc, char * argv[])
   FilterType::Pointer genericFilter = FilterType::New();
 
   genericFilter->SetArgsInfo(args_info);
-  genericFilter->Update();
+  CLITK_TRY_CATCH_EXIT(genericFilter->Update());
 
   return EXIT_SUCCESS;
 }// end main
index 1bfc8386b96eb0f78bb4762bccfb227bb25e3e1a..70d99926cab3c705e05204ea34709f7805998890 100644 (file)
@@ -34,11 +34,7 @@ int main(int argc, char * argv[])
 
   filter->SetArgsInfo(args_info);
 
-  try {
-    filter->Update();
-  } catch(std::runtime_error e) {
-    std::cout << e.what() << std::endl;
-  }
+  CLITK_TRY_CATCH_EXIT(filter->Update());
 
   return EXIT_SUCCESS;
 } // This is the end, my friend
index a78b131a7b3962f45ac7db46edb8813fa5419728..ee8de0ded1c3cf502a8050bf3ac345be504bd4bb 100644 (file)
@@ -43,7 +43,7 @@ int main(int argc, char * argv[]) {
   clitk::CombineImageGenericFilter::Pointer genericFilter=clitk::CombineImageGenericFilter::New();
   
   genericFilter->SetArgsInfo(args_info);
-  genericFilter->Update();
+  CLITK_TRY_CATCH_EXIT(genericFilter->Update());
 
   return EXIT_SUCCESS;
 }// end main
index 08cff6585d0e52022ad4ac23e83be208b36b7c4d..72b95cf3f0fce8d02792232b05e89a0c915b2d38 100644 (file)
@@ -39,7 +39,7 @@ int main( int argc, char *argv[] )
   //JV how to pass for different dims?
   //ComposeVFGenericFilter->SetEdgePaddingValue(args_info.pad_arg);
   ComposeVFGenericFilter->SetVerbose(args_info.verbose_flag);
-  ComposeVFGenericFilter->Update();  
+  CLITK_TRY_CATCH_EXIT(ComposeVFGenericFilter->Update());  
 
   return EXIT_SUCCESS;
 }
index 61dbcb1de2e7dc7cd53cd5318a327c75e451cc19..4cb22ca85c806ae1bb0d9f941913e8e91a152b01 100644 (file)
@@ -43,7 +43,7 @@ int main(int argc, char * argv[])
 
   // Go !
   filter->SetArgsInfo(args_info);
-  filter->Update();
+  CLITK_TRY_CATCH_EXIT(filter->Update());
 
   // this is the end my friend
   return EXIT_SUCCESS;
index 297b63711f6c107f389ea487b9049221582a4b44..64bcfe180a32a50f9f8759341e6e63d0d1b3efba 100644 (file)
@@ -60,7 +60,7 @@ int main(int argc, char * argv[])
   if (args_info.type_given) filter->SetOutputPixelType(args_info.type_arg);
 
   // Go !
-  filter->Update();
+  CLITK_TRY_CATCH_EXIT(filter->Update());
 
   // this is the end my friend
   return 0;
index 0aec22548c64b5d7d6251bfbcec52cf61c0080ec..145863a93670c6c4d5afab0628a7bb35124ff33c 100644 (file)
@@ -45,7 +45,7 @@ int main(int argc, char * argv[])
   FilterType::Pointer genericFilter = FilterType::New();
 
   genericFilter->SetArgsInfo(args_info);
-  genericFilter->Update();
+  CLITK_TRY_CATCH_EXIT(genericFilter->Update());
 
   return EXIT_SUCCESS;
 }// end main
index 5af8a7fb44c117bcfb9cdb513c145d5ea736d351..cf50f6852797bdcb4c00af396229c5e1f95a568a 100644 (file)
@@ -45,7 +45,7 @@ int main(int argc, char * argv[])
   FilterType::Pointer genericFilter = FilterType::New();
 
   genericFilter->SetArgsInfo(args_info);
-  genericFilter->Update();
+  CLITK_TRY_CATCH_EXIT(genericFilter->Update());
 
   return EXIT_SUCCESS;
 }// end main
index 661e1839a86f5a9a4a3969d13a2ea0478a472b09..bd2f3747cc5e5d5c042eb6face19c04e7756b4fe 100644 (file)
@@ -33,7 +33,7 @@ int main(int argc, char * argv[])
   FilterType::Pointer filter = FilterType::New();
 
   filter->SetArgsInfo(args_info);
-  filter->Update();
+  CLITK_TRY_CATCH_EXIT(filter->Update());
 
   // this is the end my friend
   return EXIT_SUCCESS;
index a44b4eb00f7c9599231a1adf91947e9d2f04018c..b70799990b4044f0db55c468fb831bdf41d9742f 100644 (file)
@@ -34,7 +34,7 @@ int main(int argc, char * argv[])
   clitk::SetBackgroundGenericFilter::Pointer genericFilter=clitk::SetBackgroundGenericFilter::New();
 
   genericFilter->SetArgsInfo(args_info);
-  genericFilter->Update();
+  CLITK_TRY_CATCH_EXIT(genericFilter->Update());
 
   return EXIT_SUCCESS;
 }// end main
index cf1dec0fd8b07a814cc62f6a047db23a8a9357d2..3360661b1a74a0a76a0c0d33164e54d9f0b67fb6 100644 (file)
@@ -44,7 +44,7 @@ int main(int argc, char * argv[])
   clitk::WarpImageGenericFilter::Pointer genericFilter=clitk::WarpImageGenericFilter::New();
 
   genericFilter->SetArgsInfo(args_info);
-  genericFilter->Update();
+  CLITK_TRY_CATCH_EXIT(genericFilter->Update());
 
   return EXIT_SUCCESS;
 }// end main
index f19e567fc5ab8e348cc81e7764790d80fe21e6c7..52b3a2af40784981ae0068bbaa52dccb86b4c533 100644 (file)
@@ -50,7 +50,7 @@ int main( int argc, char *argv[] )
   zeroVFGenericFilter->SetVerbose(args_info.verbose_flag);
 
   //update
-  zeroVFGenericFilter->Update();
+  CLITK_TRY_CATCH_EXIT(zeroVFGenericFilter->Update());
   return EXIT_SUCCESS;
 }
 #endif