Classes | Typedefs | Functions
SQMFilter.h File Reference
#include "SQDef.h"
#include "SQErrorCodes.h"
#include "SQProject.h"
#include "SQMDefines.h"
#include "SQControlCharts.h"

Go to the source code of this file.

Classes

struct  tagSQ_FilterHandle
 

Typedefs

typedef struct tagSQ_FilterHandleSQ_Filter
 

Functions

SQ_ErrorCode SQ_CreateSpectralFilter (SQ_Project hProject, int iDatasetNumber, SQ_Filter *pFilterHandle)
 
SQ_ErrorCode SQ_CreateTimeSeriesFilter (SQ_Project hProject, SQ_TSFilterType eFilter, int iDatasetNumber, SQ_Filter *pFilterHandle)
 
SQ_ErrorCode SQ_SetData (SQ_Filter hFilter, SQ_IntVector *oXVarNums, SQ_IntVector *oYVarNums, SQ_IntVector *oObsNums)
 
SQ_ErrorCode SQ_SetTransformation (SQ_Filter hFilter, SQ_IntVector oVarNums, int iVarNums, SQ_WSTransformInfo oTransInfo)
 
SQ_ErrorCode SQ_SetScale (SQ_Filter hFilter, SQ_IntVector oVarNums, int iVarNums, SQ_FilterScalingType eScale)
 
SQ_ErrorCode SQ_SetLambdaValue (SQ_Filter hFilter, float fLambda)
 
SQ_ErrorCode SQ_SetEWMAType (SQ_Filter hFilter, SQ_EWMAType eEWMAType)
 
SQ_ErrorCode SQ_SetPolynomialOrder (SQ_Filter hFilter, SQ_FilterPolynomialOrder eOrder, SQ_Bool bDerivate)
 
SQ_ErrorCode SQ_SetDerivateOrder (SQ_Filter hFilter, SQ_FilterDerivateOrder eDerivateOrder)
 
SQ_ErrorCode SQ_SetSubModelPoints (SQ_Filter hFilter, int iSubModelPoints, SQ_Bool bDerivate)
 
SQ_ErrorCode SQ_SetDeltaX (SQ_Filter hFilter, float fDeltaX)
 
SQ_ErrorCode SQ_GetAngle (SQ_Filter hFilter, float *pfAngle)
 
SQ_ErrorCode SQ_GetRemainingSS (SQ_Filter hFilter, float *pfRemainingSS)
 
SQ_ErrorCode SQ_GetEigenvalue (SQ_Filter hFilter, float *pfEigenvalue)
 
SQ_ErrorCode SQ_NextFilterComponent (SQ_Filter hFilter)
 
SQ_ErrorCode SQ_RemoveFilterComponent (SQ_Filter hFilter)
 
SQ_ErrorCode SQ_SetDetrendMode (SQ_Filter hFilter, SQ_FilterDetrendMode eMode)
 
SQ_ErrorCode SQ_SetWaveletFunction (SQ_Filter hFilter, SQ_FilterWaveletFunction eFunction, int iOrder)
 
SQ_ErrorCode SQ_SetEnergyRetainedByVariance (SQ_Filter hFilter, SQ_FilterCompressionMethod eMethod)
 
SQ_ErrorCode SQ_SetVarianceUsePadding (SQ_Filter hFilter, SQ_Bool bPadding)
 
SQ_ErrorCode SQ_SetEnergyRetainedByDetailLevel (SQ_Filter hFilter)
 
SQ_ErrorCode SQ_GetDetailLevelNumOfIndexes (SQ_Filter hFilter, int *pnIndexes)
 
SQ_ErrorCode SQ_SetDetailLevelIndexes (SQ_Filter hFilter, SQ_IntVector nVecDetailLevels)
 
SQ_ErrorCode SQ_GetDetailLevelData (SQ_Filter hFilter, int iDetailLevelIndex, int *pnCoeffs, float *pfRetained)
 
SQ_ErrorCode SQ_GetDetailLevelTotalRetained (SQ_Filter hFilter, float *pfRetained)
 
SQ_ErrorCode SQ_SetDetailLevelDecimation (SQ_Filter hFilter, int iDecNum)
 
SQ_ErrorCode SQ_SetTargetVariable (SQ_Filter hFilter, int iTargetVariable)
 
SQ_ErrorCode SQ_SetDataset (SQ_Filter hFilter, int iDatasetNumber)
 
SQ_ErrorCode SQ_SetVarianceCoeffs (SQ_Filter hFilter, int iCoeffs, float *pfRetained)
 
SQ_ErrorCode SQ_StartFiltering (SQ_Filter hFilter)
 
SQ_ErrorCode SQ_SetChainOrder (SQ_Filter hFilter, SQ_FilterType eFilter)
 
SQ_ErrorCode SQ_SetChainOrderPlugin (SQ_Filter hFilter, const char *szPluginFilter)
 
SQ_ErrorCode SQ_GetPluginFilterNames (SQ_StringVector *pvecNames)
 
SQ_ErrorCode SQ_GetPluginFilterOptions (SQ_Filter hFilter, const char *szPluginName, char *pszOptions, int iBufferLen)
 
SQ_ErrorCode SQ_SetPluginFilterOptions (SQ_Filter hFilter, const char *szPluginName, const char *szOptions)
 
SQ_ErrorCode SQ_SetDatasetName (SQ_Filter hFilter, const char *strName)
 
SQ_ErrorCode SQ_FinishFiltering (SQ_Filter hFilter)
 
SQ_ErrorCode SQ_ReleaseFilterHandle (SQ_Filter hFilter)
 

Typedef Documentation

◆ SQ_Filter

typedef struct tagSQ_FilterHandle * SQ_Filter

The import handle used to identify an ongoing import. IMPORTANT: Always initialize it to NULL!

Function Documentation

◆ SQ_CreateSpectralFilter()

SQ_ErrorCode SQ_CreateSpectralFilter ( SQ_Project  hProject,
int  iDatasetNumber,
SQ_Filter pFilterHandle 
)

Creates a spectral filter that filters data in the first dataset. If WCS/WOSC/OSCW filter is created the filtered data is appended last in the new dataset, otherwise the variables are replaced by the new data. If OSC/WOSC an unfitted model will always be created in the new project. Note that a chained filter is always created.

Parameters
[in]hProjectHandle to the project.
[in]iDatasetNumberThe number of the dataset that should be filtered
[out]pFilterHandleThe handle to the filter.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_CreateTimeSeriesFilter()

SQ_ErrorCode SQ_CreateTimeSeriesFilter ( SQ_Project  hProject,
SQ_TSFilterType  eFilter,
int  iDatasetNumber,
SQ_Filter pFilterHandle 
)

Creates a time series filter that filters data in the first dataset.

Parameters
[in]hProjectHandle to the project.
[in]eFilterA time series filter to create
[in]iDatasetNumberThe number of the dataset that should be filtered
[out]pFilterHandleThe handle to the filter.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_FinishFiltering()

SQ_ErrorCode SQ_FinishFiltering ( SQ_Filter  hFilter)

Finish the filtering process.

Parameters
[in]hFilterHandle to the filter.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_GetAngle()

SQ_ErrorCode SQ_GetAngle ( SQ_Filter  hFilter,
float *  pfAngle 
)

Gets angle in degrees of the last component calculated. Only valid when OSC filter. Must be called between StartFiltering and FinishFiltering.

Parameters
[in]hFilterHandle to the OSC filter.
[out]pfAngleThe angle in degrees.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_GetDetailLevelData()

SQ_ErrorCode SQ_GetDetailLevelData ( SQ_Filter  hFilter,
int  iDetailLevelIndex,
int *  pnCoeffs,
float *  pfRetained 
)

Gets the retained energy (in %) and number of coefficients for a given detail level index. Only valid when some kind of WAV filter and retained energy by details is set. Must be called between StartFiltering and FinishFiltering.

Parameters
[in]hFilterHandle to the WAV filter type.
[in]iDetailLevelIndexThe detail level index to get data from.
[out]pnCoeffsThe number of coefficients for the given index.
[out]pfRetainedThe retained energy (in %) for the given index.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_GetDetailLevelNumOfIndexes()

SQ_ErrorCode SQ_GetDetailLevelNumOfIndexes ( SQ_Filter  hFilter,
int *  pnIndexes 
)

Gets the number of detail level indexes that can be used to select the detail levels. The lowest index corresponds to the highest frequencies. Only valid when some kind of WAV filter and retained energy by details is set. Must be called between StartFiltering and FinishFiltering.

Parameters
[in]hFilterHandle to the WAV filter type.
[out]pnIndexesThe number of detail level indexes that can be used in SetDetailLevelIndexes. Indexes that may be used are 1..pnIndexes.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_GetDetailLevelTotalRetained()

SQ_ErrorCode SQ_GetDetailLevelTotalRetained ( SQ_Filter  hFilter,
float *  pfRetained 
)

Gets the total retained energy (in %) with the previous set detail levels. Only valid when some kind of WAV filter and retained energy by details is set. Must be called between StartFiltering and FinishFiltering.

Parameters
[in]hFilterHandle to the WAV filter type.
[out]pfRetainedThe total energy retained.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_GetEigenvalue()

SQ_ErrorCode SQ_GetEigenvalue ( SQ_Filter  hFilter,
float *  pfEigenvalue 
)

Gets the eigenvalue of the last component calculated. Only valid when OSC filter. Must be called between StartFiltering and FinishFiltering.

Parameters
[in]hFilterHandle to the OSC filter.
[out]pfEigenvalueThe eigenvalue.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_GetPluginFilterNames()

SQ_ErrorCode SQ_GetPluginFilterNames ( SQ_StringVector pvecNames)

Returns an vector of names of the plugin filters.

Parameters
[out]pvecNamesA vector of name of the plugin filters.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_GetPluginFilterOptions()

SQ_ErrorCode SQ_GetPluginFilterOptions ( SQ_Filter  hFilter,
const char *  szPluginName,
char *  pszOptions,
int  iBufferLen 
)

Returns the options for a plugin filter.

Parameters
[in]hFilterHandle to the filter.
[in]szPluginNameThe name of the plugin filter to receive options from.
[in,out]pszOptionsAn XML formatted string with the options for the specified plugin.
[in]iBufferLenThe lenght of the buffer to recieve the options.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_GetRemainingSS()

SQ_ErrorCode SQ_GetRemainingSS ( SQ_Filter  hFilter,
float *  pfRemainingSS 
)

Gets the remaining SS in percent of the last component calculated. Only valid when OSC filter. Must be called between StartFiltering and FinishFiltering.

Parameters
[in]hFilterHandle to the OSC filter.
[out]pfRemainingSSThe returned remaining SS in percent.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_NextFilterComponent()

SQ_ErrorCode SQ_NextFilterComponent ( SQ_Filter  hFilter)

Calculates the next component. Only valid when OSC filter, which by default starts with one component. Must be called between StartFiltering and FinishFiltering.

Parameters
[in]hFilterHandle to the OSC filter.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_ReleaseFilterHandle()

SQ_ErrorCode SQ_ReleaseFilterHandle ( SQ_Filter  hFilter)

Releases the filter handle.

Parameters
[in]hFilterHandle to the filter.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_RemoveFilterComponent()

SQ_ErrorCode SQ_RemoveFilterComponent ( SQ_Filter  hFilter)

Removes the last component. Only valid when OSC filter, which by default starts with one component. Must be called between StartFiltering and FinishFiltering.

Parameters
[in]hFilterHandle to the OSC filter.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_SetChainOrder()

SQ_ErrorCode SQ_SetChainOrder ( SQ_Filter  hFilter,
SQ_FilterType  eFilter 
)

Sets the filtering order. Must be called directly after CreateSpectralFilter. A chained filter can be a combination of the following filter types:

  1. SQ_FilterDerivate
  2. SQ_FilterSNV or SQ_FilterMSC
  3. SQ_FilterOSC or SQ_FilterWCS
  4. SQ_FilterOSC or SQ_FilterWCS (the one not selected in step 3)
Parameters
[in]hFilterHandle to the filter.
[in]eFilterThe filter type.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_SetChainOrderPlugin()

SQ_ErrorCode SQ_SetChainOrderPlugin ( SQ_Filter  hFilter,
const char *  szPluginFilter 
)

Sets the filtering order. Must be called directly after CreateSpectralFilter.

Parameters
[in]hFilterHandle to the filter.
[in]szPluginFilterThe name of the plugin filter, UTF-8 encoded.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_SetData()

SQ_ErrorCode SQ_SetData ( SQ_Filter  hFilter,
SQ_IntVector oXVarNums,
SQ_IntVector oYVarNums,
SQ_IntVector oObsNums 
)

Sets x,y and observation data that should be used when filtering. Must be called before StartFiltering.

Parameters
[in]hFilterHandle to the filter.
[in]oXVarNumsThe vector of x variables in dataset to include for filtering. The indices must be in ascending order.
[in]oYVarNumsThe vector of y variables in dataset to include for filtering. The indices must be in ascending order.
[in]oObsNumsThe vector of observations in dataset to include for filtering. The observations must be in ascending order.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_SetDataset()

SQ_ErrorCode SQ_SetDataset ( SQ_Filter  hFilter,
int  iDatasetNumber 
)

Sets the dataset to use for a WDTS filter. Only valid when a WDTS filter. Must be called before StartFiltering and SetData.

Parameters
[in]hFilterHandle to the WDTS filter.
[in]iDatasetNumberThe number of the dataset to use.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_SetDatasetName()

SQ_ErrorCode SQ_SetDatasetName ( SQ_Filter  hFilter,
const char *  strName 
)

Set the name of the filtered dataset.

Parameters
[in]hFilterHandle to the filter.
[in]strNameThe name of the dataset to create.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_SetDeltaX()

SQ_ErrorCode SQ_SetDeltaX ( SQ_Filter  hFilter,
float  fDeltaX 
)

Sets the distance between each point. Only valid when derivate filter. Must be called before StartFiltering.

Parameters
[in]hFilterHandle to the filter.
[in]fDeltaXThe distance between the points.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_SetDerivateOrder()

SQ_ErrorCode SQ_SetDerivateOrder ( SQ_Filter  hFilter,
SQ_FilterDerivateOrder  eDerivateOrder 
)

Sets the derivate order. Only valid when derivate filter. Must be called before StartFiltering.

Parameters
[in]hFilterHandle to the derivate filter.
[in]eDerivateOrderThe derivate order.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_SetDetailLevelDecimation()

SQ_ErrorCode SQ_SetDetailLevelDecimation ( SQ_Filter  hFilter,
int  iDecNum 
)

Sets the decimation number, which will exclude some observations. Only valid when a WDTS filter and when energy retained by details is chosen.

Parameters
[in]hFilterHandle to the WAV filter type.
[in]iDecNumThe decimation number. 1 means include all observations. 2 means include every second. 4 means include every fourth and so on.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_SetDetailLevelIndexes()

SQ_ErrorCode SQ_SetDetailLevelIndexes ( SQ_Filter  hFilter,
SQ_IntVector  nVecDetailLevels 
)

Sets the detail level indexes to be used. Only valid when some kind of WAV filter and retained energy by details is set. Must be called between StartFiltering and FinishFiltering.

Parameters
[in]hFilterHandle to the WAV filter type.
[in]nVecDetailLevelsThe vector of indexes to be used.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_SetDetrendMode()

SQ_ErrorCode SQ_SetDetrendMode ( SQ_Filter  hFilter,
SQ_FilterDetrendMode  eMode 
)

Sets the detrend mode for the wavelet filter. Only valid when some kind of WAV filter. Must be called before StartFiltering.

Parameters
[in]hFilterHandle to the WAV filter.
[in]eModeThe detrend mode.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_SetEnergyRetainedByDetailLevel()

SQ_ErrorCode SQ_SetEnergyRetainedByDetailLevel ( SQ_Filter  hFilter)

Sets the filter to use energy retained by detail level. Only valid when some kind of WAV filter. Must be called before StartFiltering.

Parameters
[in]hFilterHandle to the WAV filter.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_SetEnergyRetainedByVariance()

SQ_ErrorCode SQ_SetEnergyRetainedByVariance ( SQ_Filter  hFilter,
SQ_FilterCompressionMethod  eMethod 
)

Sets the filter to use energy retained by variance. Only valid when some kind of WAV filter. Must be called before StartFiltering.

Parameters
[in]hFilterHandle to the WAV filter.
[in]eMethodThe compression method to use.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_SetEWMAType()

SQ_ErrorCode SQ_SetEWMAType ( SQ_Filter  hFilter,
SQ_EWMAType  eEWMAType 
)

Sets the type of EWMA calculation Only valid when EWMAfilter. Must be called before StartFiltering.

Parameters
[in]hFilterHandle to the derivate filter.
[in]eEWMATypeThe type of EWMA calculation filter or predictive, before SIMCA-Q 14.1 only predictive was available.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_SetLambdaValue()

SQ_ErrorCode SQ_SetLambdaValue ( SQ_Filter  hFilter,
float  fLambda 
)

Sets the lambda value Only valid when EWMAfilter. Must be called before StartFiltering.

Parameters
[in]hFilterHandle to the derivate filter.
[in]fLambdaThe lambda value, between 0 and 1.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_SetPluginFilterOptions()

SQ_ErrorCode SQ_SetPluginFilterOptions ( SQ_Filter  hFilter,
const char *  szPluginName,
const char *  szOptions 
)

Sets the options for a plugin filter.

Parameters
[in]hFilterHandle to the filter.
[in]szPluginNameThe name of the plugin filter to receive options from.
[in]szOptionsAn XML formatted string with the options for the specified plugin.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_SetPolynomialOrder()

SQ_ErrorCode SQ_SetPolynomialOrder ( SQ_Filter  hFilter,
SQ_FilterPolynomialOrder  eOrder,
SQ_Bool  bDerivate 
)

Sets the polynomial order. Only valid when derivate or Salvitzky-Golay filter. Must be called before StartFiltering.

Parameters
[in]hFilterHandle to the derivate filter.
[in]eOrderThe polynomial order.
[in]bDerivateTrue if it's a derivate filter, otherwise it's a Savitzky-Golay filter
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_SetScale()

SQ_ErrorCode SQ_SetScale ( SQ_Filter  hFilter,
SQ_IntVector  oVarNums,
int  iVarNums,
SQ_FilterScalingType  eScale 
)

Sets scale for the variables set with SetData. Must be called before StartFiltering. Default for X is Center. Default for Y is Unit Variance. Valid if OSC, WOSC or OSCW filter.

Parameters
[in]hFilterHandle to the filter.
[in]oVarNumsThe vector of variables in dataset to transform according to the TransformInfo.
[in]iVarNumsThe number of variables in the vector. Note: The vector size may be larger. Scaling will be done for the iVarNums first variables in the vector.
[in]eScaleThe ScalingType that describes the scaling to apply.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_SetSubModelPoints()

SQ_ErrorCode SQ_SetSubModelPoints ( SQ_Filter  hFilter,
int  iSubModelPoints,
SQ_Bool  bDerivate 
)

Sets the number of points in each sub-model. Only valid when derivate or Salvitzky-Golay filter. Must be called before StartFiltering.

Parameters
[in]hFilterHandle to the derivate filter.
[in]iSubModelPointsThe number of sub-model points. Must be odd and at least 5, but not larger than or equal to the number of variables selected.
[in]bDerivateTrue if it's a derivate filter, otherwise it's a Savitzky-Golay filter
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_SetTargetVariable()

SQ_ErrorCode SQ_SetTargetVariable ( SQ_Filter  hFilter,
int  iTargetVariable 
)

Sets the target variable for a WDTS filter. Only valid when a WDTS filter.

Parameters
[in]hFilterHandle to the WAV filter type.
[in]iTargetVariableThe target variable index. This index must also be set in SetData.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_SetTransformation()

SQ_ErrorCode SQ_SetTransformation ( SQ_Filter  hFilter,
SQ_IntVector  oVarNums,
int  iVarNums,
SQ_WSTransformInfo  oTransInfo 
)

Sets transformation for the variables set with SetData. Default transformation is None. Must be called before StartFiltering. Valid if OSC, WCS, WOSC or OSCW filter.

Parameters
[in]hFilterHandle to the filter.
[in]oVarNumsThe vector of variables in dataset to transform according to the TransformInfo.
[in]iVarNumsThe number of variables in the vector. Note: The vector size may be larger. Transformation will be done for the iVarNums first variables in the vector.
[in]oTransInfoThe TransformInfo that describes the transformation to apply.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_SetVarianceCoeffs()

SQ_ErrorCode SQ_SetVarianceCoeffs ( SQ_Filter  hFilter,
int  iCoeffs,
float *  pfRetained 
)

Sets the number of coefficients to use. Only valid when some kind of WAV filter and retained energy by variance is set. Must be called between StartFiltering and FinishFiltering.

Parameters
[in]hFilterHandle to the WAV type filter.
[in]iCoeffsThe number of coefficients.
[out]pfRetainedThe total retained energy when using iCoeffs coefficients.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_SetVarianceUsePadding()

SQ_ErrorCode SQ_SetVarianceUsePadding ( SQ_Filter  hFilter,
SQ_Bool  bPadding 
)

Sets option to use padding on a WCS filter when retained energy by variance and compression method is DWT. Only valid when WCS filter, retained energy by variance and compression is DWT. When compression is best basis, padding is always used. Must be called before StartFiltering. Padding means "pad to the power of 2", see the documentation for more information.

Parameters
[in]hFilterHandle to the WAV type filter.
[in]bPaddingTrue if padding should be used, false if not.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_SetWaveletFunction()

SQ_ErrorCode SQ_SetWaveletFunction ( SQ_Filter  hFilter,
SQ_FilterWaveletFunction  eFunction,
int  iOrder 
)

Sets the wavelet function and corresponding wavelet order to be used. Only valid when some kind of WAV filter. Must be called before StartFiltering.

Parameters
[in]hFilterHandle to the WAV filter.
[in]eFunctionThe wavelet function.
[in]iOrderThe wavelet order. If Beylkin or Biorthogonal{4,5,6} is used as function this argument is ignored. See the documentation of valid orders for each of the wavelet functions.
Returns
Returns SQ_E_OK if success or an error code

◆ SQ_StartFiltering()

SQ_ErrorCode SQ_StartFiltering ( SQ_Filter  hFilter)

Starts the filtering process. If OSC, a first component is automatically calculated.

Parameters
[in]hFilterHandle to the filter.
Returns
Returns SQ_E_OK if success or an error code

Copyright (C) Sartorius Stedim Data Analytics AB - Generated by Doxygen