• Manuel Grizonnet's avatar
    ENH: rename files with txx extension to hxx · 3a1fd1fc
    Manuel Grizonnet authored
    OTB followed since the beginning the ITK convention and use .txx extension for all
    template classes. Nevertheless, some development tools do not recognize .txx
    file extension. Other tool like GitHub can't do in-browser syntax highlighting for
    txx files I think.
    
    The root problem is the use of the txx which should be changed to hxx (or hpp).
    
    In 2011, after an in-depth discussion near April 20, 2011 on the
    Insight-Developers mailing list, ITK rename all txx files to hxx (and event
    prevent the push of .txx files with a pre-commit hook). It happens is major release v4.
    
    You can find some arguments in the discussion about the change and also in other
    projects related to ITK which applied the same modification, see for instance VXL:
    
    https://github.com/vxl/vxl/issues/209
    
    This commit apply now the same modification for OTB.
    
    I understand that it will change some habit for developers and don't bring new
    features but I think that in general it is better to stay align w...
    3a1fd1fc
otbCacheLessLabelImageToVectorData.txx 9.79 KiB
/*=========================================================================
  Copyright (c) Remi Cresson (IRSTEA). All rights reserved.
     This software is distributed WITHOUT ANY WARRANTY; without even
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
     PURPOSE.  See the above copyright notices for more information.
=========================================================================*/
#ifndef MODULES_REMOTE_SIMPLEEXTRACTIONTOOLS_INCLUDE_OTBCACHELESSLABELIMAGETOVECTORDATA_txx_
#define MODULES_REMOTE_SIMPLEEXTRACTIONTOOLS_INCLUDE_OTBCACHELESSLABELIMAGETOVECTORDATA_txx_
#include "otbCacheLessLabelImageToVectorData.h"
#include "itkObjectFactoryBase.h"
#include "itkImageRegionMultidimensionalSplitter.h"
#include "itkImageRegionIterator.h"
#include "otbNumberOfDivisionsStrippedStreamingManager.h"
#include "otbNumberOfDivisionsTiledStreamingManager.h"
#include "otbNumberOfLinesStrippedStreamingManager.h"
#include "otbRAMDrivenStrippedStreamingManager.h"
#include "otbTileDimensionTiledStreamingManager.h"
#include "otbRAMDrivenTiledStreamingManager.h"
#include "otbRAMDrivenAdaptativeStreamingManager.h"
namespace otb
/**
template <class TInputImagePixel>
CacheLessLabelImageToVectorData<TInputImagePixel>
::CacheLessLabelImageToVectorData()
 : m_NumberOfDivisions(0),
   m_CurrentDivision(0),
   m_DivisionProgress(0.0),
   m_IsObserving(true),
   m_ObserverID(0)
  // By default, we use tiled streaming, with automatic tile size
  // We don't set any parameter, so the memory size is retrieved from the OTB configuration options
  this->SetAutomaticAdaptativeStreaming();
/**
template <class TInputImagePixel>
CacheLessLabelImageToVectorData<TInputImagePixel>
::~CacheLessLabelImageToVectorData()
template <class TInputImagePixel>
void
CacheLessLabelImageToVectorData<TInputImagePixel>
::SetNumberOfDivisionsStrippedStreaming(unsigned int nbDivisions)
  typedef NumberOfDivisionsStrippedStreamingManager<InputImageType> NumberOfDivisionsStrippedStreamingManagerType;
  typename NumberOfDivisionsStrippedStreamingManagerType::Pointer streamingManager = NumberOfDivisionsStrippedStreamingManagerType::New();
  streamingManager->SetNumberOfDivisions(nbDivisions);
  m_StreamingManager = streamingManager;
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
} template <class TInputImagePixel> void CacheLessLabelImageToVectorData<TInputImagePixel> ::SetNumberOfDivisionsTiledStreaming(unsigned int nbDivisions) { typedef NumberOfDivisionsTiledStreamingManager<InputImageType> NumberOfDivisionsTiledStreamingManagerType; typename NumberOfDivisionsTiledStreamingManagerType::Pointer streamingManager = NumberOfDivisionsTiledStreamingManagerType::New(); streamingManager->SetNumberOfDivisions(nbDivisions); m_StreamingManager = streamingManager; } template <class TInputImagePixel> void CacheLessLabelImageToVectorData<TInputImagePixel> ::SetNumberOfLinesStrippedStreaming(unsigned int nbLinesPerStrip) { typedef NumberOfLinesStrippedStreamingManager<InputImageType> NumberOfLinesStrippedStreamingManagerType; typename NumberOfLinesStrippedStreamingManagerType::Pointer streamingManager = NumberOfLinesStrippedStreamingManagerType::New(); streamingManager->SetNumberOfLinesPerStrip(nbLinesPerStrip); m_StreamingManager = streamingManager; } template <class TInputImagePixel> void CacheLessLabelImageToVectorData<TInputImagePixel> ::SetAutomaticStrippedStreaming(unsigned int availableRAM, double bias) { typedef RAMDrivenStrippedStreamingManager<InputImageType> RAMDrivenStrippedStreamingManagerType; typename RAMDrivenStrippedStreamingManagerType::Pointer streamingManager = RAMDrivenStrippedStreamingManagerType::New(); streamingManager->SetAvailableRAMInMB(availableRAM); streamingManager->SetBias(bias); m_StreamingManager = streamingManager; } template <class TInputImagePixel> void CacheLessLabelImageToVectorData<TInputImagePixel> ::SetTileDimensionTiledStreaming(unsigned int tileDimension) { typedef TileDimensionTiledStreamingManager<InputImageType> TileDimensionTiledStreamingManagerType; typename TileDimensionTiledStreamingManagerType::Pointer streamingManager = TileDimensionTiledStreamingManagerType::New(); streamingManager->SetTileDimension(tileDimension); m_StreamingManager = streamingManager; } template <class TInputImagePixel> void CacheLessLabelImageToVectorData<TInputImagePixel> ::SetAutomaticTiledStreaming(unsigned int availableRAM, double bias) { typedef RAMDrivenTiledStreamingManager<InputImageType> RAMDrivenTiledStreamingManagerType; typename RAMDrivenTiledStreamingManagerType::Pointer streamingManager = RAMDrivenTiledStreamingManagerType::New(); streamingManager->SetAvailableRAMInMB(availableRAM); streamingManager->SetBias(bias); m_StreamingManager = streamingManager; } template <class TInputImagePixel> void CacheLessLabelImageToVectorData<TInputImagePixel> ::SetAutomaticAdaptativeStreaming(unsigned int availableRAM, double bias) { typedef RAMDrivenAdaptativeStreamingManager<InputImageType> RAMDrivenAdaptativeStreamingManagerType; typename RAMDrivenAdaptativeStreamingManagerType::Pointer streamingManager = RAMDrivenAdaptativeStreamingManagerType::New();
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
streamingManager->SetAvailableRAMInMB(availableRAM); streamingManager->SetBias(bias); m_StreamingManager = streamingManager; } template<class TInputImagePixel> void CacheLessLabelImageToVectorData<TInputImagePixel> ::SetInput(const InputImageType* input) { this->ProcessObject::SetNthInput(0,const_cast<InputImageType*>(input)); } template<class TInputImagePixel> const typename CacheLessLabelImageToVectorData<TInputImagePixel>::InputImageType* CacheLessLabelImageToVectorData<TInputImagePixel> ::GetInput() { if (this->GetNumberOfInputs() < 1) { return ITK_NULLPTR; } return static_cast<const InputImageType*>(this->ProcessObject::GetInput(0)); } /** * Update method : update output information of input and write to file */ template<class TInputImagePixel> void CacheLessLabelImageToVectorData<TInputImagePixel> ::Update() { // Update output information on input image InputImagePointer inputPtr = const_cast<InputImageType *>(this->GetInput()); // Make sure input is available if ( inputPtr.IsNull() ) { itkExceptionMacro(<< "No input to writer"); } this->SetAbortGenerateData(0); this->SetProgress(0.0); /** * Tell all Observers that the filter is starting */ this->InvokeEvent(itk::StartEvent()); /** * Grab the input */ inputPtr->UpdateOutputInformation(); InputImageRegionType inputRegion = inputPtr->GetLargestPossibleRegion(); // Allocate the buffer image bufferedInputImage = InputImageType::New(); bufferedInputImage->SetRegions(inputRegion); bufferedInputImage->Allocate(); bufferedInputImage->SetMetaDataDictionary(inputPtr->GetMetaDataDictionary()); bufferedInputImage->SetSpacing(inputPtr->GetSignedSpacing()); bufferedInputImage->SetOrigin (inputPtr->GetOrigin() ); /** Compare the buffered region with the inputRegion which is the largest * possible region or a user defined region through extended filename * Not sure that if this modification is needed */
211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
if (inputPtr->GetBufferedRegion() == inputRegion) { otbMsgDevMacro(<< "Buffered region is the largest possible region, there is no need for streaming."); this->SetNumberOfDivisionsStrippedStreaming(1); } m_StreamingManager->PrepareStreaming(inputPtr, inputRegion); m_NumberOfDivisions = m_StreamingManager->GetNumberOfSplits(); otbMsgDebugMacro(<< "Number Of Stream Divisions : " << m_NumberOfDivisions); /** * Loop over the number of pieces, execute the upstream pipeline on each * piece, and copy the results into the output image. */ InputImageRegionType streamRegion; this->UpdateProgress(0); m_CurrentDivision = 0; m_DivisionProgress = 0; // Get the source process object itk::ProcessObject* source = inputPtr->GetSource(); m_IsObserving = false; m_ObserverID = 0; // Check if source exists if(source) { typedef itk::MemberCommand<Self> CommandType; typedef typename CommandType::Pointer CommandPointerType; CommandPointerType command = CommandType::New(); command->SetCallbackFunction(this, &Self::ObserveSourceFilterProgress); m_ObserverID = source->AddObserver(itk::ProgressEvent(), command); m_IsObserving = true; } else { itkWarningMacro(<< "Could not get the source process object. Progress report might be buggy"); } for (m_CurrentDivision = 0; m_CurrentDivision < m_NumberOfDivisions && !this->GetAbortGenerateData(); m_CurrentDivision++, m_DivisionProgress = 0, this->UpdateFilterProgress()) { streamRegion = m_StreamingManager->GetSplit(m_CurrentDivision); inputPtr->SetRequestedRegion(streamRegion); inputPtr->PropagateRequestedRegion(); inputPtr->UpdateOutputData(); // Copy output in buffer ConstIteratorType inIt(inputPtr, streamRegion); IteratorType outIt(bufferedInputImage, streamRegion); for (inIt.GoToBegin(), outIt.GoToBegin(); !inIt.IsAtEnd(); ++outIt, ++inIt) { outIt.Set(inIt.Get()); } } // Vectorize the buffered image vectorizeFilter = LabelImageToVectorDataFilterType::New(); vectorizeFilter->SetInput(bufferedInputImage); vectorizeFilter->SetInputMask(bufferedInputImage); vectorizeFilter->Update(); this->GraftOutput( vectorizeFilter->GetOutput() ); /** * If we ended due to aborting, push the progress up to 1.0 (since
281282283284285286287288289290291292293294295296297298299300301302303304305306307308
* it probably didn't end there) */ if (!this->GetAbortGenerateData()) { this->UpdateProgress(1.0); } // Notify end event observers this->InvokeEvent(itk::EndEvent()); if (m_IsObserving) { m_IsObserving = false; source->RemoveObserver(m_ObserverID); } /** * Release any inputs if marked for release */ this->ReleaseInputs(); } } // end namespace otb #endif