]> Creatis software - clitk.git/blobdiff - segmentation/clitkExtractLymphStationsFilter.txx
Remove warnings
[clitk.git] / segmentation / clitkExtractLymphStationsFilter.txx
index 5f9bef0c1865923b1905d2cadf641e5a467d4838..98768b278bfdaf105662efb118684db4d5c2713d 100644 (file)
 template <class TImageType>
 clitk::ExtractLymphStationsFilter<TImageType>::
 ExtractLymphStationsFilter():
-  clitk::FilterBase(),
-  clitk::FilterWithAnatomicalFeatureDatabaseManagement(),
-  itk::ImageToImageFilter<TImageType, MaskImageType>()
+  clitk::StructuresExtractionFilter<ImageType>()
 {
   this->SetNumberOfRequiredInputs(1);
   SetBackgroundValue(0);
   SetForegroundValue(1);
-  ComputeStationsSupportsFlagOn();
+  ForceSupportsFlagOn();
+  SetSupportLimitsFilename("none");
+  CheckSupportFlagOff();
 
   // Default values
-  ExtractStation_8_SetDefaultValues();
   ExtractStation_3P_SetDefaultValues();
   ExtractStation_2RL_SetDefaultValues();
   ExtractStation_3A_SetDefaultValues();
+  ExtractStation_1RL_SetDefaultValues();
+  ExtractStation_4RL_SetDefaultValues();
+  ExtractStation_5_SetDefaultValues();
+  ExtractStation_6_SetDefaultValues();
+
+  // TODO
   ExtractStation_7_SetDefaultValues();
+  ExtractStation_8_SetDefaultValues();
 }
 //--------------------------------------------------------------------
 
@@ -75,78 +81,78 @@ void
 clitk::ExtractLymphStationsFilter<TImageType>::
 GenerateOutputInformation() { 
   // Get inputs
-  LoadAFDB();
+  this->LoadAFDB();
   m_Input = dynamic_cast<const ImageType*>(itk::ProcessObject::GetInput(0));
-  m_Mediastinum = GetAFDB()->template GetImage <MaskImageType>("Mediastinum");
+  m_Mediastinum = this->GetAFDB()->template GetImage <MaskImageType>("Mediastinum");
 
   // Clean some computer landmarks to force the recomputation
-  GetAFDB()->RemoveTag("AntPostVesselsSeparation");
-
-  // Global supports for stations
-  if (GetComputeStationsSupportsFlag()) {
-    StartNewStep("Supports for stations");
-    StartSubStep(); 
-    GetAFDB()->RemoveTag("CarinaZ");
-    GetAFDB()->RemoveTag("ApexOfTheChestZ");
-    GetAFDB()->RemoveTag("ApexOfTheChest");
-    GetAFDB()->RemoveTag("RightBronchus");
-    GetAFDB()->RemoveTag("LeftBronchus");
-    GetAFDB()->RemoveTag("SuperiorBorderOfAorticArchZ");
-    GetAFDB()->RemoveTag("SuperiorBorderOfAorticArch");
-    GetAFDB()->RemoveTag("InferiorBorderOfAorticArchZ");
-    GetAFDB()->RemoveTag("InferiorBorderOfAorticArch");
-    ExtractStationSupports();
-    StopSubStep();  
-  }
-  else {
-    m_ListOfSupports["S1R"] = GetAFDB()->template GetImage<MaskImageType>("Support_S1R");
-    m_ListOfSupports["S1L"] = GetAFDB()->template GetImage<MaskImageType>("Support_S1L");
-    m_ListOfSupports["S2R"] = GetAFDB()->template GetImage<MaskImageType>("Support_S2R");
-    m_ListOfSupports["S2L"] = GetAFDB()->template GetImage<MaskImageType>("Support_S2L");
-    m_ListOfSupports["S4R"] = GetAFDB()->template GetImage<MaskImageType>("Support_S4R");
-    m_ListOfSupports["S4L"] = GetAFDB()->template GetImage<MaskImageType>("Support_S4L");
-
-    m_ListOfSupports["S3A"] = GetAFDB()->template GetImage<MaskImageType>("Support_S3A");
-    m_ListOfSupports["S3P"] = GetAFDB()->template GetImage<MaskImageType>("Support_S3P");
-    m_ListOfSupports["S5"] = GetAFDB()->template GetImage<MaskImageType>("Support_S5");
-    m_ListOfSupports["S6"] = GetAFDB()->template GetImage<MaskImageType>("Support_S6");
-    m_ListOfSupports["S7"] = GetAFDB()->template GetImage<MaskImageType>("Support_S7");
-    m_ListOfSupports["S8"] = GetAFDB()->template GetImage<MaskImageType>("Support_S8");
-    m_ListOfSupports["S9"] = GetAFDB()->template GetImage<MaskImageType>("Support_S9");
-    m_ListOfSupports["S10"] = GetAFDB()->template GetImage<MaskImageType>("Support_S10");
-    m_ListOfSupports["S11"] = GetAFDB()->template GetImage<MaskImageType>("Support_S11");
+  // FIXME -> to put elsewhere ?
+  this->GetAFDB()->RemoveTag("AntPostVesselsSeparation");
+
+  // Must I compute the supports ?
+  bool supportsExist = true;
+  if (!GetForceSupportsFlag()) {
+    try {
+      m_ListOfSupports["S1R"] = this->GetAFDB()->template GetImage<MaskImageType>("Support_S1R");
+      m_ListOfSupports["S1L"] = this->GetAFDB()->template GetImage<MaskImageType>("Support_S1L");
+      m_ListOfSupports["S2R"] = this->GetAFDB()->template GetImage<MaskImageType>("Support_S2R");
+      m_ListOfSupports["S2L"] = this->GetAFDB()->template GetImage<MaskImageType>("Support_S2L");
+      m_ListOfSupports["S4R"] = this->GetAFDB()->template GetImage<MaskImageType>("Support_S4R");
+      m_ListOfSupports["S4L"] = this->GetAFDB()->template GetImage<MaskImageType>("Support_S4L");
+      
+      m_ListOfSupports["S3A"] = this->GetAFDB()->template GetImage<MaskImageType>("Support_S3A");
+      m_ListOfSupports["S3P"] = this->GetAFDB()->template GetImage<MaskImageType>("Support_S3P");
+      m_ListOfSupports["S5"] = this->GetAFDB()->template GetImage<MaskImageType>("Support_S5");
+      m_ListOfSupports["S6"] = this->GetAFDB()->template GetImage<MaskImageType>("Support_S6");
+      m_ListOfSupports["S7"] = this->GetAFDB()->template GetImage<MaskImageType>("Support_S7");
+      m_ListOfSupports["S8"] = this->GetAFDB()->template GetImage<MaskImageType>("Support_S8");
+      m_ListOfSupports["S9"] = this->GetAFDB()->template GetImage<MaskImageType>("Support_S9");
+      m_ListOfSupports["S10"] = this->GetAFDB()->template GetImage<MaskImageType>("Support_S10");
+      m_ListOfSupports["S11"] = this->GetAFDB()->template GetImage<MaskImageType>("Support_S11");
+    } catch(clitk::ExceptionObject o) {
+      supportsExist = false;
+    }
   }
 
-  // Extract Station8
-  ExtractStation_8();
+  if (!supportsExist || GetForceSupportsFlag()) {
+    this->StartNewStep("Supports for stations");
+    this->StartSubStep(); 
+    
+    // FIXME : why should I remove theses tags ???
+    this->GetAFDB()->RemoveTag("CarinaZ");
+    this->GetAFDB()->RemoveTag("ApexOfTheChestZ");
+    this->GetAFDB()->RemoveTag("ApexOfTheChest");
+    this->GetAFDB()->RemoveTag("RightBronchus");
+    this->GetAFDB()->RemoveTag("LeftBronchus");
+    this->GetAFDB()->RemoveTag("SuperiorBorderOfAorticArchZ");
+    this->GetAFDB()->RemoveTag("SuperiorBorderOfAorticArch");
+    this->GetAFDB()->RemoveTag("InferiorBorderOfAorticArchZ");
+    this->GetAFDB()->RemoveTag("InferiorBorderOfAorticArch");
+    ExtractStationSupports();
+    this->StopSubStep();  
+  }
 
-  // Extract Station3P
+  // Extract Stations
+  ExtractStation_1RL();
+  ExtractStation_2RL();
   ExtractStation_3P();
-
-  // Extract Station3A
   ExtractStation_3A();
+  ExtractStation_4R();
+  ExtractStation_4L();
+  ExtractStation_5();
+  ExtractStation_6();
 
-  // HERE
+  // ---------- todo -----------------------
 
-  // Extract Station2RL
-  StartNewStep("Station 2RL");
-  StartSubStep(); 
-  ExtractStation_2RL();
-  StopSubStep();
+  // Extract Station8
+  //  ExtractStation_8();
 
   // Extract Station7
-  StartNewStep("Station 7");
-  StartSubStep();
-  ExtractStation_7();
-  StopSubStep();
-
-  if (0) { // temporary suppress
-    // Extract Station4RL
-    StartNewStep("Station 4RL");
-    StartSubStep();
-    //ExtractStation_4RL();
-    StopSubStep();
-  }
+  //this->StartNewStep("Station 7");
+  //this->StartSubStep();
+  //ExtractStation_7();
+  //this->StopSubStep();
+  
 }
 //--------------------------------------------------------------------
 
@@ -167,7 +173,7 @@ void
 clitk::ExtractLymphStationsFilter<TImageType>::
 GenerateData() {
   // Final Step -> graft output (if SetNthOutput => redo)
-  this->GraftOutput(m_ListOfStations["8"]);
+  // this->GraftOutput(m_ListOfStations["8"]);
 }
 //--------------------------------------------------------------------
   
@@ -182,25 +188,29 @@ CheckForStation(std::string station)
   std::string s = "Station"+station;
   
 
-  // Check if station already exist in DB
-  bool found = false;
-  if (GetAFDB()->TagExist(s)) {
-    m_ListOfStations[station] = GetAFDB()->template GetImage<MaskImageType>(s);
-    found = true;
-  }
-
   // Define the starting support 
-  if (found && GetComputeStation(station)) {
-    std::cout << "Station " << station << " already exists, but re-computation forced." << std::endl;
-  }
-  if (!found || GetComputeStation(station)) {
-    m_Working_Support = m_Mediastinum = GetAFDB()->template GetImage<MaskImageType>("Mediastinum", true);
+  // if (GetComputeStation(station)) {
+  //   std::cout << "Station " << station << " already exists, but re-computation forced." << std::endl;
+  // }
+  if (GetComputeStation(station)) {
+    m_Working_Support = m_Mediastinum = this->GetAFDB()->template GetImage<MaskImageType>("Mediastinum", true);
     return true;
   }
-  else {
-    std::cout << "Station " << station << " found. I used it" << std::endl;
-    return false;
+  else return false;
+  // else {
+  //   std::cout << "Station " << station << " found. I used it" << std::endl;
+  //   return false;
+  // }
+
+  // Check if station already exist in DB
+  
+  // FIXME -> do nothing if not on the command line. Is it what I want ?
+  //bool found = false;
+  if (this->GetAFDB()->TagExist(s)) {
+    m_ListOfStations[station] = this->GetAFDB()->template GetImage<MaskImageType>(s);
+    //found = true;
   }
+
 }
 //--------------------------------------------------------------------
 
@@ -305,23 +315,6 @@ void ComputeImageBoundariesCoordinates(typename ImageType::Pointer image,
 //--------------------------------------------------------------------
 
 
-//--------------------------------------------------------------------
-template <class TImageType>
-void 
-clitk::ExtractLymphStationsFilter<TImageType>::
-ExtractStation_4RL() {
-  DD("TODO");
-  exit(0);
-  /*
-    WARNING ONLY 4R FIRST !!! (not same inf limits)
-  */    
-  ExtractStation_4RL_SI_Limits();
-  ExtractStation_4RL_LR_Limits();
-  ExtractStation_4RL_AP_Limits();
-}
-//--------------------------------------------------------------------
-
-
 //--------------------------------------------------------------------
 template <class ImageType>
 void 
@@ -329,8 +322,8 @@ clitk::ExtractLymphStationsFilter<ImageType>::
 Remove_Structures(std::string station, std::string s)
 {
   try {
-    StartNewStep("[Station"+station+"] Remove "+s);  
-    MaskImagePointer Structure = GetAFDB()->template GetImage<MaskImageType>(s);
+    this->StartNewStep("[Station"+station+"] Remove "+s);  
+    MaskImagePointer Structure = this->GetAFDB()->template GetImage<MaskImageType>(s);
     clitk::AndNot<MaskImageType>(m_Working_Support, Structure, GetBackgroundValue());
   }
   catch(clitk::ExceptionObject e) {
@@ -415,22 +408,22 @@ FindLineForS7S8Separation(MaskImagePointType & A, MaskImagePointType & B)
   // B = lower border of bronchus intermedius (BI) or RightMiddleLobeBronchus
   
   try {
-    GetAFDB()->GetPoint3D("LineForS7S8Separation_Begin", A); 
-    GetAFDB()->GetPoint3D("LineForS7S8Separation_End", B);
+    this->GetAFDB()->GetPoint3D("LineForS7S8Separation_Begin", A); 
+    this->GetAFDB()->GetPoint3D("LineForS7S8Separation_End", B);
   }
   catch(clitk::ExceptionObject & o) {
     
     DD("FindLineForS7S8Separation");
     // Load LeftLowerLobeBronchus and get centroid point
     MaskImagePointer LeftLowerLobeBronchus = 
-      GetAFDB()->template GetImage <MaskImageType>("LeftLowerLobeBronchus");
+      this->GetAFDB()->template GetImage <MaskImageType>("LeftLowerLobeBronchus");
     std::vector<MaskImagePointType> c;
     clitk::ComputeCentroids<MaskImageType>(LeftLowerLobeBronchus, GetBackgroundValue(), c);
     A = c[1];
     
     // Load RightMiddleLobeBronchus and get superior point (not centroid here)
     MaskImagePointer RightMiddleLobeBronchus = 
-      GetAFDB()->template GetImage <MaskImageType>("RightMiddleLobeBronchus");
+      this->GetAFDB()->template GetImage <MaskImageType>("RightMiddleLobeBronchus");
     bool b = FindExtremaPointInAGivenDirection<MaskImageType>(RightMiddleLobeBronchus, 
                                                               GetBackgroundValue(), 
                                                               2, false, B);
@@ -439,8 +432,8 @@ FindLineForS7S8Separation(MaskImagePointType & A, MaskImagePointType & B)
     }
     
     // Insert into the DB
-    GetAFDB()->SetPoint3D("LineForS7S8Separation_Begin", A);
-    GetAFDB()->SetPoint3D("LineForS7S8Separation_End", B);
+    this->GetAFDB()->SetPoint3D("LineForS7S8Separation_Begin", A);
+    this->GetAFDB()->SetPoint3D("LineForS7S8Separation_End", B);
   }
 }
 //--------------------------------------------------------------------
@@ -454,24 +447,24 @@ FindCarina()
 {
   double z;
   try {
-    z = GetAFDB()->GetDouble("CarinaZ");
+    z = this->GetAFDB()->GetDouble("CarinaZ");
   }
   catch(clitk::ExceptionObject e) {
-    DD("FindCarinaSlicePosition");
+    //DD("FindCarinaSlicePosition");
     // Get Carina
-    MaskImagePointer Carina = GetAFDB()->template GetImage<MaskImageType>("Carina");
+    MaskImagePointer Carina = this->GetAFDB()->template GetImage<MaskImageType>("Carina");
     
     // Get Centroid and Z value
     std::vector<MaskImagePointType> centroids;
     clitk::ComputeCentroids<MaskImageType>(Carina, GetBackgroundValue(), centroids);
 
     // We dont need Carina structure from now
-    GetAFDB()->template ReleaseImage<MaskImageType>("Carina");
+    this->GetAFDB()->template ReleaseImage<MaskImageType>("Carina");
     
     // Put inside the AFDB
-    GetAFDB()->SetPoint3D("CarinaPoint", centroids[1]);
-    GetAFDB()->SetDouble("CarinaZ", centroids[1][2]);
-    WriteAFDB();
+    this->GetAFDB()->SetPoint3D("CarinaPoint", centroids[1]);
+    this->GetAFDB()->SetDouble("CarinaZ", centroids[1][2]);
+    this->WriteAFDB();
     z = centroids[1][2];
   }
   return z;
@@ -487,24 +480,43 @@ FindApexOfTheChest()
 {
   double z;
   try {
-    z = GetAFDB()->GetDouble("ApexOfTheChestZ");
+    z = this->GetAFDB()->GetDouble("ApexOfTheChestZ");
   }
   catch(clitk::ExceptionObject e) {
-    DD("FindApexOfTheChestPosition");
-    MaskImagePointer Lungs = GetAFDB()->template GetImage<MaskImageType>("Lungs");
+
+    /*
+    //DD("FindApexOfTheChestPosition");
+    MaskImagePointer Lungs = this->GetAFDB()->template GetImage<MaskImageType>("Lungs");
     MaskImagePointType p;
     p[0] = p[1] = p[2] =  0.0; // to avoid warning
     clitk::FindExtremaPointInAGivenDirection<MaskImageType>(Lungs, GetBackgroundValue(), 2, false, p);
 
     // We dont need Lungs structure from now
-    GetAFDB()->template ReleaseImage<MaskImageType>("Lungs");
+    this->GetAFDB()->template ReleaseImage<MaskImageType>("Lungs");
     
     // Put inside the AFDB
-    GetAFDB()->SetPoint3D("ApexOfTheChest", p);
+    this->GetAFDB()->SetPoint3D("ApexOfTheChest", p);
     p[2] -= 5; // We consider 5 mm lower 
-    GetAFDB()->SetDouble("ApexOfTheChestZ", p[2]);
-    WriteAFDB();
+    this->GetAFDB()->SetDouble("ApexOfTheChestZ", p[2]);
+    this->WriteAFDB();
     z = p[2];
+    */
+    
+    // the superior border becomes the more inferior of the two apices
+    MaskImagePointer RightLung = this->GetAFDB()->template GetImage<MaskImageType>("RightLung");
+    MaskImagePointer LeftLung = this->GetAFDB()->template GetImage<MaskImageType>("LeftLung");
+    MaskImagePointType pr;
+    MaskImagePointType pl;
+    clitk::FindExtremaPointInAGivenDirection<MaskImageType>(RightLung, GetBackgroundValue(), 2, false, pr);
+    clitk::FindExtremaPointInAGivenDirection<MaskImageType>(LeftLung, GetBackgroundValue(), 2, false, pl);
+    // We dont need Lungs structure from now
+    this->GetAFDB()->template ReleaseImage<MaskImageType>("RightLung");
+    this->GetAFDB()->template ReleaseImage<MaskImageType>("LeftLung");
+    // Put inside the AFDB
+    if (pr[2] < pl[2]) z = pr[2];
+    else z = pl[2];
+    this->GetAFDB()->SetDouble("ApexOfTheChestZ", z);
+    this->WriteAFDB();
   }
   return z;
 }
@@ -518,8 +530,8 @@ clitk::ExtractLymphStationsFilter<TImageType>::
 FindLeftAndRightBronchi()
 {
   try {
-    m_RightBronchus = GetAFDB()->template GetImage <MaskImageType>("RightBronchus");
-    m_LeftBronchus = GetAFDB()->template GetImage <MaskImageType>("LeftBronchus");
+    m_RightBronchus = this->GetAFDB()->template GetImage <MaskImageType>("RightBronchus");
+    m_LeftBronchus = this->GetAFDB()->template GetImage <MaskImageType>("LeftBronchus");
   }
   catch(clitk::ExceptionObject & o) {
 
@@ -528,7 +540,7 @@ FindLeftAndRightBronchi()
     // a Left and Right bronchus.
   
     // Get the trachea
-    MaskImagePointer Trachea = GetAFDB()->template GetImage<MaskImageType>("Trachea");
+    MaskImagePointer Trachea = this->GetAFDB()->template GetImage<MaskImageType>("Trachea");
 
     // Get the Carina position
     double m_CarinaZ = FindCarina();
@@ -595,9 +607,9 @@ FindLeftAndRightBronchi()
     LeftBronchus = clitk::AutoCrop<MaskImageType>(LeftBronchus, GetBackgroundValue()); 
 
     // Insert int AFDB if need after 
-    GetAFDB()->template SetImage <MaskImageType>("RightBronchus", "seg/rightBronchus.mhd", 
+    this->GetAFDB()->template SetImage <MaskImageType>("RightBronchus", "seg/rightBronchus.mhd", 
                                                  RightBronchus, true);
-    GetAFDB()->template SetImage <MaskImageType>("LeftBronchus", "seg/leftBronchus.mhd", 
+    this->GetAFDB()->template SetImage <MaskImageType>("LeftBronchus", "seg/leftBronchus.mhd", 
                                                  LeftBronchus, true);
   }
 }
@@ -612,23 +624,23 @@ FindSuperiorBorderOfAorticArch()
 {
   double z;
   try {
-    z = GetAFDB()->GetDouble("SuperiorBorderOfAorticArchZ");
+    z = this->GetAFDB()->GetDouble("SuperiorBorderOfAorticArchZ");
   }
   catch(clitk::ExceptionObject e) {
-    DD("FindSuperiorBorderOfAorticArch");
-    MaskImagePointer Aorta = GetAFDB()->template GetImage<MaskImageType>("Aorta");
+    //    DD("FindSuperiorBorderOfAorticArch");
+    MaskImagePointer Aorta = this->GetAFDB()->template GetImage<MaskImageType>("Aorta");
     MaskImagePointType p;
     p[0] = p[1] = p[2] =  0.0; // to avoid warning
     clitk::FindExtremaPointInAGivenDirection<MaskImageType>(Aorta, GetBackgroundValue(), 2, false, p);
     p[2] += Aorta->GetSpacing()[2]; // the slice above
     
     // We dont need Lungs structure from now
-    GetAFDB()->template ReleaseImage<MaskImageType>("Aorta");
+    this->GetAFDB()->template ReleaseImage<MaskImageType>("Aorta");
     
     // Put inside the AFDB
-    GetAFDB()->SetPoint3D("SuperiorBorderOfAorticArch", p);
-    GetAFDB()->SetDouble("SuperiorBorderOfAorticArchZ", p[2]);
-    WriteAFDB();
+    this->GetAFDB()->SetPoint3D("SuperiorBorderOfAorticArch", p);
+    this->GetAFDB()->SetDouble("SuperiorBorderOfAorticArchZ", p[2]);
+    this->WriteAFDB();
     z = p[2];
   }
   return z;
@@ -644,11 +656,11 @@ FindInferiorBorderOfAorticArch()
 {
   double z;
   try {
-    z = GetAFDB()->GetDouble("InferiorBorderOfAorticArchZ");
+    z = this->GetAFDB()->GetDouble("InferiorBorderOfAorticArchZ");
   }
   catch(clitk::ExceptionObject e) {
-    DD("FindInferiorBorderOfAorticArch");
-    MaskImagePointer Aorta = GetAFDB()->template GetImage<MaskImageType>("Aorta");
+    //DD("FindInferiorBorderOfAorticArch");
+    MaskImagePointer Aorta = this->GetAFDB()->template GetImage<MaskImageType>("Aorta");
     std::vector<MaskSlicePointer> slices;
     clitk::ExtractSlices<MaskImageType>(Aorta, 2, slices);
     bool found=false;
@@ -671,12 +683,12 @@ FindInferiorBorderOfAorticArch()
     Aorta->TransformIndexToPhysicalPoint(index, lower);
     
     // We dont need Lungs structure from now
-    GetAFDB()->template ReleaseImage<MaskImageType>("Aorta");
+    this->GetAFDB()->template ReleaseImage<MaskImageType>("Aorta");
     
     // Put inside the AFDB
-    GetAFDB()->SetPoint3D("InferiorBorderOfAorticArch", lower);
-    GetAFDB()->SetDouble("InferiorBorderOfAorticArchZ", lower[2]);
-    WriteAFDB();
+    this->GetAFDB()->SetPoint3D("InferiorBorderOfAorticArch", lower);
+    this->GetAFDB()->SetDouble("InferiorBorderOfAorticArchZ", lower[2]);
+    this->WriteAFDB();
     z = lower[2];
   }
   return z;
@@ -688,7 +700,7 @@ FindInferiorBorderOfAorticArch()
 template <class ImageType>
 typename clitk::ExtractLymphStationsFilter<ImageType>::MaskImagePointer 
 clitk::ExtractLymphStationsFilter<ImageType>::
-FindAntPostVessels()
+FindAntPostVesselsOLD()
 {
   // -----------------------------------------------------
   /* Rod says: "The anterior border, as with the Atlas – UM, is
@@ -704,11 +716,9 @@ FindAntPostVessels()
   bool found = true;
   MaskImagePointer binarizedContour;
   try {
-    DD("FindAntPostVessels try to get");
-    binarizedContour = GetAFDB()->template GetImage <MaskImageType>("AntPostVesselsSeparation");
+    binarizedContour = this->GetAFDB()->template GetImage <MaskImageType>("AntPostVesselsSeparation");
   }
   catch(clitk::ExceptionObject e) {
-    DD("not found");
     found = false;
   }
   if (found) {
@@ -733,22 +743,22 @@ FindAntPostVessels()
   */
 
   // Read structures
-  MaskImagePointer BrachioCephalicArtery = GetAFDB()->template GetImage<MaskImageType>("BrachioCephalicArtery");
-  MaskImagePointer BrachioCephalicVein = GetAFDB()->template GetImage<MaskImageType>("BrachioCephalicVein");
-  MaskImagePointer CommonCarotidArtery = GetAFDB()->template GetImage<MaskImageType>("CommonCarotidArtery");
-  MaskImagePointer SubclavianArtery = GetAFDB()->template GetImage<MaskImageType>("SubclavianArtery");
-  MaskImagePointer Thyroid = GetAFDB()->template GetImage<MaskImageType>("Thyroid");
-  MaskImagePointer Aorta = GetAFDB()->template GetImage<MaskImageType>("Aorta");
-  MaskImagePointer Trachea = GetAFDB()->template GetImage<MaskImageType>("Trachea");
+  MaskImagePointer BrachioCephalicArtery = this->GetAFDB()->template GetImage<MaskImageType>("BrachioCephalicArtery");
+  MaskImagePointer BrachioCephalicVein = this->GetAFDB()->template GetImage<MaskImageType>("BrachioCephalicVein");
+  MaskImagePointer CommonCarotidArtery = this->GetAFDB()->template GetImage<MaskImageType>("CommonCarotidArtery");
+  MaskImagePointer SubclavianArtery = this->GetAFDB()->template GetImage<MaskImageType>("SubclavianArtery");
+  MaskImagePointer Thyroid = this->GetAFDB()->template GetImage<MaskImageType>("Thyroid");
+  MaskImagePointer Aorta = this->GetAFDB()->template GetImage<MaskImageType>("Aorta");
+  MaskImagePointer Trachea = this->GetAFDB()->template GetImage<MaskImageType>("Trachea");
   
   // Create a temporay support
   // From first slice of BrachioCephalicVein to end of 3A
-  MaskImagePointer support = GetAFDB()->template GetImage<MaskImageType>("Support_Sup_Carina");
+  MaskImagePointer support = this->GetAFDB()->template GetImage<MaskImageType>("Support_Sup_Carina");
   MaskImagePointType p;
   p[0] = p[1] = p[2] =  0.0; // to avoid warning
   clitk::FindExtremaPointInAGivenDirection<MaskImageType>(BrachioCephalicVein, GetBackgroundValue(), 2, true, p);
   double inf = p [2];
-  clitk::FindExtremaPointInAGivenDirection<MaskImageType>(GetAFDB()->template GetImage<MaskImageType>("Support_S3A"), 
+  clitk::FindExtremaPointInAGivenDirection<MaskImageType>(this->GetAFDB()->template GetImage<MaskImageType>("Support_S3A"), 
                                                           GetBackgroundValue(), 2, false, p);
   double sup = p [2];  
   support = clitk::CropImageAlongOneAxis<MaskImageType>(support, 2, inf, sup, 
@@ -1009,9 +1019,9 @@ FindAntPostVessels()
   binarizedContour = clitk::CropImageAlongOneAxis<MaskImageType>(binarizedContour, 2, inf, sup, 
                                                         false, GetBackgroundValue());
   // Update the AFDB
-  writeImage<MaskImageType>(binarizedContour, "seg/AntPostVesselsSeparation.mhd");
-  GetAFDB()->SetImageFilename("AntPostVesselsSeparation", "seg/AntPostVesselsSeparation.mhd");  
-  WriteAFDB();
+  writeImage<MaskImageType>(binarizedContour, "seg/AntPostVesselsSeparation.mha");
+  this->GetAFDB()->SetImageFilename("AntPostVesselsSeparation", "seg/AntPostVesselsSeparation.mha");
+  this->WriteAFDB();
   return binarizedContour;
 
   /*
@@ -1046,21 +1056,6 @@ FindAntPostVessels()
 //--------------------------------------------------------------------
 
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
 //--------------------------------------------------------------------
 template <class ImageType>
 typename clitk::ExtractLymphStationsFilter<ImageType>::MaskImagePointer 
@@ -1081,11 +1076,9 @@ FindAntPostVessels2()
   bool found = true;
   MaskImagePointer binarizedContour;
   try {
-    DD("FindAntPostVessels try to get");
-    binarizedContour = GetAFDB()->template GetImage <MaskImageType>("AntPostVesselsSeparation");
+    binarizedContour = this->GetAFDB()->template GetImage <MaskImageType>("AntPostVesselsSeparation");
   }
   catch(clitk::ExceptionObject e) {
-    DD("not found");
     found = false;
   }
   if (found) {
@@ -1112,28 +1105,33 @@ FindAntPostVessels2()
   // Read structures
   std::map<std::string, MaskImagePointer> MapOfStructures;  
   typedef std::map<std::string, MaskImagePointer>::iterator MapIter;
-  MapOfStructures["BrachioCephalicArtery"] = GetAFDB()->template GetImage<MaskImageType>("BrachioCephalicArtery");
-  MapOfStructures["BrachioCephalicVein"] = GetAFDB()->template GetImage<MaskImageType>("BrachioCephalicVein");
-  MapOfStructures["CommonCarotidArteryLeft"] = GetAFDB()->template GetImage<MaskImageType>("CommonCarotidArteryLeft");
-  MapOfStructures["CommonCarotidArteryRight"] = GetAFDB()->template GetImage<MaskImageType>("CommonCarotidArteryRight");
-  MapOfStructures["SubclavianArteryLeft"] = GetAFDB()->template GetImage<MaskImageType>("SubclavianArteryLeft");
-  MapOfStructures["SubclavianArteryRight"] = GetAFDB()->template GetImage<MaskImageType>("SubclavianArteryRight");
-  MapOfStructures["Thyroid"] = GetAFDB()->template GetImage<MaskImageType>("Thyroid");
-  MapOfStructures["Aorta"] = GetAFDB()->template GetImage<MaskImageType>("Aorta");
-  MapOfStructures["Trachea"] = GetAFDB()->template GetImage<MaskImageType>("Trachea");
+  MapOfStructures["BrachioCephalicArtery"] = this->GetAFDB()->template GetImage<MaskImageType>("BrachioCephalicArtery");
+  MapOfStructures["BrachioCephalicVein"] = this->GetAFDB()->template GetImage<MaskImageType>("BrachioCephalicVein");
+  MapOfStructures["CommonCarotidArteryLeft"] = this->GetAFDB()->template GetImage<MaskImageType>("LeftCommonCarotidArtery");
+  MapOfStructures["CommonCarotidArteryRight"] = this->GetAFDB()->template GetImage<MaskImageType>("RightCommonCarotidArtery");
+  MapOfStructures["SubclavianArteryLeft"] = this->GetAFDB()->template GetImage<MaskImageType>("LeftSubclavianArtery");
+  MapOfStructures["SubclavianArteryRight"] = this->GetAFDB()->template GetImage<MaskImageType>("RightSubclavianArtery");
+  MapOfStructures["Thyroid"] = this->GetAFDB()->template GetImage<MaskImageType>("Thyroid");
+  MapOfStructures["Aorta"] = this->GetAFDB()->template GetImage<MaskImageType>("Aorta");
+  MapOfStructures["Trachea"] = this->GetAFDB()->template GetImage<MaskImageType>("Trachea");
   
   std::vector<std::string> ListOfStructuresNames;
 
   // Create a temporay support
-  // From first slice of BrachioCephalicVein to end of 3A
-  MaskImagePointer support = GetAFDB()->template GetImage<MaskImageType>("Support_Sup_Carina");
+  // From first slice of BrachioCephalicVein to end of 3A or end of 2RL
+  MaskImagePointer support = this->GetAFDB()->template GetImage<MaskImageType>("Support_Sup_Carina");
   MaskImagePointType p;
   p[0] = p[1] = p[2] =  0.0; // to avoid warning
   clitk::FindExtremaPointInAGivenDirection<MaskImageType>(MapOfStructures["BrachioCephalicVein"], 
                                                           GetBackgroundValue(), 2, true, p);
   double inf = p[2];
-  clitk::FindExtremaPointInAGivenDirection<MaskImageType>(GetAFDB()->template GetImage<MaskImageType>("Support_S3A"), 
+  clitk::FindExtremaPointInAGivenDirection<MaskImageType>(this->GetAFDB()->template GetImage<MaskImageType>("Support_S3A"), 
                                                           GetBackgroundValue(), 2, false, p);
+  MaskImagePointType p2;
+  clitk::FindExtremaPointInAGivenDirection<MaskImageType>(this->GetAFDB()->template GetImage<MaskImageType>("Support_S2L"), 
+                                                          GetBackgroundValue(), 2, false, p2);
+  if (p2[2] > p[2]) p = p2;
+
   double sup = p[2]+support->GetSpacing()[2];//one slice more ?
   support = clitk::CropImageAlongOneAxis<MaskImageType>(support, 2, inf, sup, 
                                                         false, GetBackgroundValue());
@@ -1380,9 +1378,9 @@ FindAntPostVessels2()
                                                         false, GetBackgroundValue());
 
   // Update the AFDB
-  writeImage<MaskImageType>(binarizedContour, "seg/AntPostVesselsSeparation.mhd");
-  GetAFDB()->SetImageFilename("AntPostVesselsSeparation", "seg/AntPostVesselsSeparation.mhd");  
-  WriteAFDB();
+  writeImage<MaskImageType>(binarizedContour, "seg/AntPostVesselsSeparation.mha");
+  this->GetAFDB()->SetImageFilename("AntPostVesselsSeparation", "seg/AntPostVesselsSeparation.mha");
+  this->WriteAFDB();
   return binarizedContour;
 
   /*
@@ -1416,6 +1414,65 @@ FindAntPostVessels2()
 }
 //--------------------------------------------------------------------
 
+//--------------------------------------------------------------------
+template <class ImageType>
+void
+clitk::ExtractLymphStationsFilter<ImageType>::
+WriteImageSupport(std::string support)
+{
+  writeImage<MaskImageType>(m_ListOfSupports[support], this->GetAFDBPath()+"/"+"seg/Support_"+support+".mha");
+  this->GetAFDB()->SetImageFilename("Support_"+support, "seg/Support_"+support+".mha");
+}
+//--------------------------------------------------------------------
 
 
+//--------------------------------------------------------------------
+template <class ImageType>
+void
+clitk::ExtractLymphStationsFilter<ImageType>::
+WriteImageStation(std::string station)
+{
+  writeImage<MaskImageType>(m_ListOfStations[station], GetAFDB()->GetPath()+"/seg/Station"+station+".mha");
+  GetAFDB()->SetImageFilename("Station"+station, "seg/Station"+station+".mha"); 
+  WriteAFDB();
+}
+//--------------------------------------------------------------------
+
+
+//--------------------------------------------------------------------
+template <class ImageType>
+void
+clitk::ExtractLymphStationsFilter<ImageType>::
+ComputeOverlapWithRef(std::string station)
+{
+  if (GetComputeStation(station)) {
+    MaskImagePointer ref = this->GetAFDB()->template GetImage <MaskImageType>("Station"+station+"_Ref");
+    typedef clitk::LabelImageOverlapMeasureFilter<MaskImageType> FilterType;
+    typename FilterType::Pointer filter = FilterType::New();
+    filter->SetInput(0, m_ListOfStations[station]);
+    filter->SetInput(1, ref);
+    filter->Update();
+  }
+}
+//--------------------------------------------------------------------
+
+//--------------------------------------------------------------------
+template <class ImageType>
+void
+clitk::ExtractLymphStationsFilter<ImageType>::
+ReadSupportLimits(std::string filename)
+{
+  m_ListOfSupportLimits.clear();
+  ifstream is;
+  openFileForReading(is, filename);
+  while (is) {
+    skipComment(is);
+    SupportLimitsType s;
+    s.Read(is);
+    if (is) m_ListOfSupportLimits.push_back(s);
+  }
+}
+//--------------------------------------------------------------------
+
 #endif //#define CLITKBOOLEANOPERATORLABELIMAGEFILTER_TXX
+